On Tue, Feb 11, 2014 at 4:51 PM, Sriraman Tallam <tmsri...@google.com> wrote:
> On Tue, Feb 11, 2014 at 4:39 PM, Teresa Johnson <tejohn...@google.com> wrote:
>> On Tue, Feb 11, 2014 at 4:32 PM, Sriraman Tallam <tmsri...@google.com> wrote:
>>> On Tue, Feb 11, 2014 at 3:29 PM, Teresa Johnson <tejohn...@google.com> 
>>> wrote:
>>>>
>>>> On Feb 11, 2014 2:37 PM, "Sriraman Tallam" <tmsri...@google.com> wrote:
>>>>>
>>>>> On Tue, Feb 11, 2014 at 1:32 PM, Teresa Johnson <tejohn...@google.com>
>>>>> wrote:
>>>>> > On Mon, Feb 10, 2014 at 7:15 PM, Sriraman Tallam <tmsri...@google.com>
>>>>> > wrote:
>>>>> >> Hi Teresa,
>>>>> >>
>>>>> >>    I have attached a patch to recognize and reorder split functions in
>>>>> >> the function reordering plugin. Please review.
>>>>> >>
>>>>> >> Thanks
>>>>> >> Sri
>>>>> >
>>>>> >> Index: function_reordering_plugin/callgraph.c
>>>>> >> ===================================================================
>>>>> >> --- function_reordering_plugin/callgraph.c    (revision 207671)
>>>>> >> +++ function_reordering_plugin/callgraph.c    (working copy)
>>>>> >> @@ -550,6 +550,25 @@ static void set_node_type (Node *n)
>>>>> >>        s->computed_weight = n->computed_weight;
>>>>> >>        s->max_count = n->max_count;
>>>>> >>
>>>>> >> +      /* If s is split into a cold section, assign the split weight to
>>>>> >> the
>>>>> >> +         max count of the split section.   Use this also for the
>>>>> >> weight of the
>>>>> >> +         spliandection.  */
>>>>
>>>>> >> +      if (s->split_section)
>>>>> >> +        {
>>>>> >> +          s->split_section->max_count = s->split_section->weight =
>>>>> >> n->split_weight;
>>>>> >> +          /* If split_section is comdat, update all the comdat
>>>>> >> +          candidates for weight.  */
>>>>> >> +          s_comdat = s->split_section->comdat_group;
>>>>> >> +          while (s_comdat != NULL)
>>>>> >> +            {
>>>>> >> +              s_comdat->weight = s->split_section->weight;
>>>>> >> +              s_comdat->computed_weight
>>>>> >> +             = s->split_section->computed_weight;
>>>>> >
>>>>> > Where is s->split_section->computed_weight set
>>>>>
>>>>> I removed this line as it is not useful. Details:
>>>>>
>>>>> In general, the computed_weight for sections is assigned in
>>>>> set_node_type in line:
>>>>>  s->computed_weight = n->computed_weight;
>>>>>
>>>>> The computed_weight is obtained by adding the weights of all incoming
>>>>> edges. However, for the cold part of split functions, this can never
>>>>> be non-zero as the split cold part is never called and so this line is
>>>>> not useful.
>>>>>
>>>>>
>>>>> >
>>>>> >> +              s_comdat->max_count = s->split_section->max_count;
>>>>> >> +              s_comdat = s_comdat->comdat_group;
>>>>> >> +            }
>>>>> >> +     }
>>>>> >> +
>>>>> >
>>>>> > ...
>>>>> >
>>>>> >
>>>>> >> +      /* It is split and it is not comdat.  */
>>>>> >> +      else if (is_split_function)
>>>>> >> +     {
>>>>> >> +       Section_id *cold_section = NULL;
>>>>> >> +       /* Function splitting means that the "hot" part is really the
>>>>> >> +          relevant section and the other section is unlikely executed
>>>>> >> and
>>>>> >> +          should not be part of the callgraph.  */
>>>>> >>
>>>>> >> -      section->comdat_group = kept->comdat_group;
>>>>> >> -      kept->comdat_group = section;
>>>>> >> +       /* Store the new section in the section list.  */
>>>>> >> +       section->next = first_section;
>>>>> >> +       first_section = section;
>>>>> >> +       /* The right section is not in the section_map if
>>>>> >> ".text.unlikely" is
>>>>> >> +          not the new section.  */
>>>>> >> +          if (!is_prefix_of (".text.unlikely", section_name))
>>>>> >
>>>>> > The double-negative in the above comment is a bit confusing. Can we
>>>>> > make this similar to the check in the earlier split comdat case. I.e.
>>>>> > something like (essentially swapping the if condition and assert):
>>>>>
>>>>> Changed. New patch attached.
>>>>
>>>> The comment is fixed but the checks stayed the same and seem out of order
>>>> now. Teresa
>>>
>>> Ah!, sorry. Changed and patch attached.
>>
>> The assert in the else clause is unnecessary (since you have landed
>> there after doing that same check already). It would be good to have
>> asserts in both the if and else clauses on the new section_name (see
>> my suggested code in the initial response).
>
> Ok, I overlooked the code you suggested in the original response,
> sorry about that. I have included those asserts you suggested in both
> places where we swap the new section with the existing section.

Ok, thanks! Looks good.
Teresa

>
> Thanks
> Sri
>
>>
>> Teresa
>>
>>>
>>> Sri
>>>
>>>
>>>>
>>>>>
>>>>> Thanks
>>>>> Sri
>>>>>
>>>>> >
>>>>> >           /* If the existing section is cold, the newly detected split
>>>>> > must
>>>>> >              be hot.  */
>>>>> >           if (is_prefix_of (".text.unlikely", kept->full_name))
>>>>> >             {
>>>>> >               assert (!is_prefix_of (".text.unlikely", section_name));
>>>>> >               ...
>>>>> >             }
>>>>> >           else
>>>>> >             {
>>>>> >               assert (is_prefix_of (".text.unlikely", section_name));
>>>>> >               ...
>>>>> >             }
>>>>> >
>>>>> >> +         {
>>>>> >> +           assert (is_prefix_of (".text.unlikely", kept->full_name));
>>>>> >> +           /* The kept section was the unlikely section.  Change the
>>>>> >> section
>>>>> >> +              in section_map to be the new section which is the hot
>>>>> >> one.  */
>>>>> >> +           *slot = section;
>>>>> >> +           /* Record the split cold section in the hot section.  */
>>>>> >> +           section->split_section = kept;
>>>>> >> +           /* Comdats and function splitting are already handled.  */
>>>>> >> +           assert (kept->comdat_group == NULL);
>>>>> >> +           cold_section = kept;
>>>>> >> +         }
>>>>> >> +       else
>>>>> >> +         {
>>>>> >> +           /* Record the split cold section in the hot section.  */
>>>>> >> +           assert (!is_prefix_of (".text.unlikely", kept->full_name));
>>>>> >> +           kept->split_section = section;
>>>>> >> +           cold_section = section;
>>>>> >> +         }
>>>>> >> +       assert (cold_section != NULL && cold_section->comdat_group ==
>>>>> >> NULL);
>>>>> >> +       cold_section->is_split_cold_section = 1;
>>>>> >> +     }
>>>>> > ...
>>>>> >
>>>>> > Thanks,
>>>>> > Teresa
>>>>> >
>>>>> >
>>>>> > --
>>>>> > Teresa Johnson | Software Engineer | tejohn...@google.com | 408-460-2413
>>
>>
>>
>> --
>> Teresa Johnson | Software Engineer | tejohn...@google.com | 408-460-2413



-- 
Teresa Johnson | Software Engineer | tejohn...@google.com | 408-460-2413

Reply via email to