This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [google][gcc-4_8][patch]Handle Split functions in the Function Reordering Plugin
- From: Teresa Johnson <tejohnson at google dot com>
- To: Sriraman Tallam <tmsriram at google dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, Xinliang David Li <davidxl at google dot com>
- Date: Tue, 11 Feb 2014 16:39:14 -0800
- Subject: Re: [google][gcc-4_8][patch]Handle Split functions in the Function Reordering Plugin
- Authentication-results: sourceware.org; auth=none
- References: <CAAs8HmybQKqYjgYV1O5_tx0uzviqxu62W+bEXUO3xr9CS7cqvw at mail dot gmail dot com> <CAAe5K+UL_+PkO-KqXyUFH_C5UFgik0fJvJPAdBhkU+pjiAmH+A at mail dot gmail dot com> <CAAs8Hmzt9DdHpZiYW5imqOLBvYdk4QTF_OCGJ0h+86WgkPpu9g at mail dot gmail dot com> <CAAe5K+Wtgym8ZxtZs2k9knz92_7kkkXf++gFKB3FexSX1bv3gA at mail dot gmail dot com> <CAAs8HmwJ2ta+sGz3i3gmbWg5DdmZ3r5yGnx=W5oSrmGSsc90Rg at mail dot gmail dot com>
On Tue, Feb 11, 2014 at 4:32 PM, Sriraman Tallam <tmsriram@google.com> wrote:
> On Tue, Feb 11, 2014 at 3:29 PM, Teresa Johnson <tejohnson@google.com> wrote:
>>
>> On Feb 11, 2014 2:37 PM, "Sriraman Tallam" <tmsriram@google.com> wrote:
>>>
>>> On Tue, Feb 11, 2014 at 1:32 PM, Teresa Johnson <tejohnson@google.com>
>>> wrote:
>>> > On Mon, Feb 10, 2014 at 7:15 PM, Sriraman Tallam <tmsriram@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).
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 | tejohnson@google.com | 408-460-2413
--
Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413