diff mbox

[v2] Dump BB number when dumping a BB with label.

Message ID a1fcc826-a41b-9ed7-b7bc-2e3c81ec35ba@suse.cz
State New
Headers show

Commit Message

Martin Liška July 31, 2017, 6:43 a.m. UTC
On 07/28/2017 01:21 PM, Richard Biener wrote:
> On Fri, Jul 28, 2017 at 12:52 PM, Martin Liška <mliska@suse.cz> wrote:
>> On 07/28/2017 09:58 AM, Richard Biener wrote:
>>> On Fri, Jul 28, 2017 at 9:50 AM, Martin Liška <mliska@suse.cz> wrote:
>>>> On 07/28/2017 09:21 AM, Richard Biener wrote:
>>>>> On Thu, Jul 27, 2017 at 4:24 PM, Martin Liška <mliska@suse.cz> wrote:
>>>>>> Hi.
>>>>>>
>>>>>> Following simple patch adds support for dumping of BBs when it's a BB
>>>>>> that contains a label. That makes it easier for debugging as one can
>>>>>> find destination for an edge in dump file.
>>>>>>
>>>>>> Sample, before:
>>>>>>
>>>>>> foo (int a)
>>>>>> {
>>>>>>   int D.1821;
>>>>>>   int _1;
>>>>>>   int _4;
>>>>>>   int _5;
>>>>>>
>>>>>>   <bb 2> [0.00%] [count: INV]:
>>>>>>   switch (a_2(D)) <default: <L2> [INV] [count: INV], case 0: <L0> [INV] [count: INV], case 1: <L1> [INV] [count: INV]>
>>>>>>
>>>>>> <L0> [0.00%] [count: INV]:
>>>>>>   a_3 = a_2(D) + 2;
>>>>>>
>>>>>> <L1> [0.00%] [count: INV]:
>>>>>>   _4 = 2;
>>>>>>   goto <bb 6> (<L3>); [INV] [count: INV]
>>>>>>
>>>>>> <L2> [0.00%] [count: INV]:
>>>>>>   _5 = 123;
>>>>>>
>>>>>>   # _1 = PHI <_4(4), _5(5)>
>>>>>> <L3> [0.00%] [count: INV]:
>>>>>>   return _1;
>>>>>>
>>>>>> }
>>>>>>
>>>>>> After:
>>>>>>
>>>>>> foo (int a)
>>>>>> {
>>>>>>   int D.1821;
>>>>>>   int _1;
>>>>>>   int _4;
>>>>>>   int _5;
>>>>>>
>>>>>>   <bb 2> [0.00%] [count: INV]:
>>>>>>   switch (a_2(D)) <default: <L2> [INV] [count: INV], case 0: <L0> [INV] [count: INV], case 1: <L1> [INV] [count: INV]>
>>>>>>
>>>>>> <L0> (<bb 3>) [0.00%] [count: INV]:
>>>>>>   a_3 = a_2(D) + 2;
>>>>>>
>>>>>> <L1> (<bb 4>) [0.00%] [count: INV]:
>>>>>>   _4 = 2;
>>>>>>   goto <bb 6> (<L3>); [INV] [count: INV]
>>>>>>
>>>>>> <L2> (<bb 5>) [0.00%] [count: INV]:
>>>>>>   _5 = 123;
>>>>>>
>>>>>>   # _1 = PHI <_4(4), _5(5)>
>>>>>> <L3> (<bb 6>) [0.00%] [count: INV]:
>>>>>>   return _1;
>>>>>>
>>>>>> }
>>>>>>
>>>>>> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
>>>>>>
>>>>>> Thoughts?
>>>>>
>>>>> I think I prefer to always see
>>>>>
>>>>>   <bb 3> ....:
>>>>>
>>>>> and if there's a label just dump that as well, thus
>>>>>
>>>>>   <bb 3> ....:
>>>>>   L0:
>>>>>
>>>>> I think that's how we dump the case with multiple labels.  And always use the
>>>>> implicit bb N when dumping destinations (in gotos, switches, etc).
>>>>>
>>>>> That is, what we have now is IMHO premature prettifying losing BB
>>>>> indices in the dumps
>>>>> unnecessarily.
>>>>>
>>>>> Richard.
>>>>
>>>> Hi.
>>>>
>>>> I like your ideas, there's difference in between 7.1 and modified trunk:
>>>>
>>>> foo (int a)
>>>> {
>>>>   int D.1824;
>>>>   int _1;
>>>>   int _4;
>>>>   int _6;
>>>>
>>>>   <bb 2> [0.00%] [count: INV]:
>>>>   switch (a_2(D)) <default: <L2> [INV] [count: INV], case 0: <L0> [INV] [count: INV], case 1: <L1> [INV] [count: INV]>
>>>>
>>>> <L0> [0.00%] [count: INV]:
>>>>   a_3 = a_2(D) + 2;
>>>>
>>>> <L1> [0.00%] [count: INV]:
>>>>   _4 = 2;
>>>>   goto <bb 8> (<L6>); [INV] [count: INV]
>>>>
>>>> <L2> [0.00%] [count: INV]:
>>>>
>>>>   <bb 6> [0.00%] [count: INV]:
>>>>   a_5 = a_2(D) + 2;
>>>>
>>>> label_XXX [0.00%] [count: INV]:
>>>> label_YYY [0.00%] [count: INV]:
>>>>   _6 = 101;
>>>>
>>>>   # _1 = PHI <_4(4), _6(7)>
>>>> <L6> [0.00%] [count: INV]:
>>>>   return _1;
>>>>
>>>> }
>>>>
>>>> after:
>>>>
>>>> foo (int a)
>>>> {
>>>>   int D.1824;
>>>>   int _1;
>>>>   int _4;
>>>>   int _6;
>>>>
>>>>   <bb 2> [0.00%] [count: INV]:
>>>>   switch (a_2(D)) <default: <bb 5> [INV] [count: INV], case 0: <bb 3> [INV] [count: INV], case 1: <bb 4> [INV] [count: INV]>
>>>>
>>>>   <bb 3> [0.00%] [count: INV]:
>>>> <L0>:
>>>>   a_3 = a_2(D) + 2;
>>>>
>>>>   <bb 4> [0.00%] [count: INV]:
>>>> <L1>:
>>>>   _4 = 2;
>>>>   goto <bb 8>; [INV] [count: INV]
>>>>
>>>>   <bb 5> [0.00%] [count: INV]:
>>>> <L2>:
>>>>
>>>>   <bb 6> [0.00%] [count: INV]:
>>>>   a_5 = a_2(D) + 2;
>>>>
>>>>   <bb 7> [0.00%] [count: INV]:
>>>> label_XXX:
>>>> label_YYY:
>>>>   _6 = 101;
>>>>
>>>>   <bb 8> [0.00%] [count: INV]:
>>>>   # _1 = PHI <_4(4), _6(7)>
>>>> <L6>:
>>>>   return _1;
>>>>
>>>> }
>>>>
>>>> Do you like it? What about indentation of labels, should I increase it or leave it?
>>>
>>> Leave it.
>>>
>>>> I guess there will be some tests that will need to be adjusted.
>>>
>>> I guess so.
>>>
>>> I think <L0>: and friends are all DECL_ARTIFICIAL -- maybe we can avoid dumping
>>> them?  Hmm, I guess doing it like above, while it preserves BB numbering, does
>>> reflect the actual IL a bit less so I guess I'd leave the <L0>s in
>>> switches (those
>>> have labels) and gotos if there's still the label args (not in case of
>>> we are just
>>> dumping CFG edges).
>>
>> Good, thus said there's how it will look like:
>>
>> $ cat /tmp/switch.c
>> int c;
>>
>> int foo(int a)
>> {
>>   switch (a)
>>   {
>>   case 0:
>>     a += 2;
>>   case 1:
>>     if (c)
>>       goto label_XXX;
>>     return 2;
>>   default:
>>     break;
>>   }
>>
>>   a += 2;
>>
>> label_XXX:
>> label_YYY:
>>   return 99 + 2;
>> }
>>
>> $ ./xgcc -B. /tmp/switch.c -fdump-tree-optimized=/dev/stdout
>>
>> ;; Function foo (foo, funcdef_no=0, decl_uid=1816, cgraph_uid=0, symbol_order=1)
>>
>> foo (int a)
>> {
>>   int D.1827;
>>   int c.0_1;
>>   int _2;
>>   int _6;
>>   int _8;
>>
>>   <bb 2> [0.00%] [count: INV]:
>>   switch (a_3(D)) <default: <L4> [INV] [count: INV], case 0: <L0> [INV] [count: INV], case 1: <L1> [INV] [count: INV]>
>>
>>   <bb 3> [0.00%] [count: INV]:
>> <L0>:
>>   a_4 = a_3(D) + 2;
>>
>>   <bb 4> [0.00%] [count: INV]:
>> <L1>:
>>   c.0_1 = c;
>>   if (c.0_1 != 0)
>>     goto <bb 5>; [INV] [count: INV]
>>   else
>>     goto <bb 6>; [INV] [count: INV]
>>
>>   <bb 5> [0.00%] [count: INV]:
>>   goto <bb 9>; [INV] [count: INV]
>>
>>   <bb 6> [0.00%] [count: INV]:
>>   _6 = 2;
>>   goto <bb 10>; [INV] [count: INV]
>>
>>   <bb 7> [0.00%] [count: INV]:
>> <L4>:
>>
>>   <bb 8> [0.00%] [count: INV]:
>>   a_7 = a_3(D) + 2;
>>
>>   <bb 9> [0.00%] [count: INV]:
>> label_XXX:
>> label_YYY:
>>   _8 = 101;
>>
>>   <bb 10> [0.00%] [count: INV]:
>>   # _2 = PHI <_6(6), _8(9)>
>> <L8>:
>>   return _2;
>>
>> }
>>
>>
>> Note that edge bb_5->bb_9 is represented after gimplification by implicit edge, not by goto. But:
>>
>> ./xgcc -B. /tmp/switch.c -fdump-tree-lower=/dev/stdout
>>
>> ;; Function foo (foo, funcdef_no=0, decl_uid=1816, cgraph_uid=0, symbol_order=1)
>>
>> foo (int a)
>> {
>>   int D.1827;
>>
>>   switch (a) <default: <D.1821>, case 0: <D.1818>, case 1: <D.1819>>
>>   <D.1818>:
>>   a = a + 2;
>>   <D.1819>:
>>   c.0_1 = c;
>>   if (c.0_1 != 0) goto <D.1825>; else goto <D.1826>;
>>   <D.1825>:
>>   goto label_XXX;
>>   <D.1826>:
>>   D.1827 = 2;
>>   goto <D.1828>;
>>   <D.1821>:
>>   goto <D.1822>;
>>   <D.1822>:
>>   a = a + 2;
>>   label_XXX:
>>   label_YYY:
>>   D.1827 = 101;
>>   goto <D.1828>;
>>   <D.1828>:
>>   return D.1827;
>> }
>>
>> There labels are dumped properly. If it's ok I'll start working on test-suite transition.
> 
> Yes.  Looks good to me now.
> 
> That said... if the fallout is very big we might consider switching to
> -gimple style dumping
> unconditionally?
> 
> Richard.

Hello.

Sending second version of the patch. Eventually it shows that fallout for test suite was minimal.
Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.

Ready to be installed?
Martin

> 
>> Martin
>>
>>>
>>> Richard.
>>>
>>>> Martin
>>>>
>>>>>
>>>>>> Martin
>>>>>>
>>>>>> gcc/testsuite/ChangeLog:
>>>>>>
>>>>>> 2017-07-27  Martin Liska  <mliska@suse.cz>
>>>>>>
>>>>>>         * gcc.dg/builtin-unreachable-6.c: Update scanned pattern.
>>>>>>         * gcc.dg/tree-ssa/attr-hotcold-2.c: Likewise.
>>>>>>         * gcc.dg/tree-ssa/ssa-ccp-18.c: Likewise.
>>>>>>
>>>>>> gcc/ChangeLog:
>>>>>>
>>>>>> 2017-07-27  Martin Liska  <mliska@suse.cz>
>>>>>>
>>>>>>         * gimple-pretty-print.c (dump_gimple_label): Dump BB number.
>>>>>> ---
>>>>>>  gcc/gimple-pretty-print.c                      | 6 +++++-
>>>>>>  gcc/testsuite/gcc.dg/builtin-unreachable-6.c   | 2 +-
>>>>>>  gcc/testsuite/gcc.dg/tree-ssa/attr-hotcold-2.c | 4 ++--
>>>>>>  gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-18.c     | 3 +--
>>>>>>  4 files changed, 9 insertions(+), 6 deletions(-)
>>>>>>
>>>>>>
>>>>
>>

Comments

Richard Biener July 31, 2017, 8:50 a.m. UTC | #1
On Mon, Jul 31, 2017 at 8:43 AM, Martin Liška <mliska@suse.cz> wrote:
> On 07/28/2017 01:21 PM, Richard Biener wrote:
>> On Fri, Jul 28, 2017 at 12:52 PM, Martin Liška <mliska@suse.cz> wrote:
>>> On 07/28/2017 09:58 AM, Richard Biener wrote:
>>>> On Fri, Jul 28, 2017 at 9:50 AM, Martin Liška <mliska@suse.cz> wrote:
>>>>> On 07/28/2017 09:21 AM, Richard Biener wrote:
>>>>>> On Thu, Jul 27, 2017 at 4:24 PM, Martin Liška <mliska@suse.cz> wrote:
>>>>>>> Hi.
>>>>>>>
>>>>>>> Following simple patch adds support for dumping of BBs when it's a BB
>>>>>>> that contains a label. That makes it easier for debugging as one can
>>>>>>> find destination for an edge in dump file.
>>>>>>>
>>>>>>> Sample, before:
>>>>>>>
>>>>>>> foo (int a)
>>>>>>> {
>>>>>>>   int D.1821;
>>>>>>>   int _1;
>>>>>>>   int _4;
>>>>>>>   int _5;
>>>>>>>
>>>>>>>   <bb 2> [0.00%] [count: INV]:
>>>>>>>   switch (a_2(D)) <default: <L2> [INV] [count: INV], case 0: <L0> [INV] [count: INV], case 1: <L1> [INV] [count: INV]>
>>>>>>>
>>>>>>> <L0> [0.00%] [count: INV]:
>>>>>>>   a_3 = a_2(D) + 2;
>>>>>>>
>>>>>>> <L1> [0.00%] [count: INV]:
>>>>>>>   _4 = 2;
>>>>>>>   goto <bb 6> (<L3>); [INV] [count: INV]
>>>>>>>
>>>>>>> <L2> [0.00%] [count: INV]:
>>>>>>>   _5 = 123;
>>>>>>>
>>>>>>>   # _1 = PHI <_4(4), _5(5)>
>>>>>>> <L3> [0.00%] [count: INV]:
>>>>>>>   return _1;
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>> After:
>>>>>>>
>>>>>>> foo (int a)
>>>>>>> {
>>>>>>>   int D.1821;
>>>>>>>   int _1;
>>>>>>>   int _4;
>>>>>>>   int _5;
>>>>>>>
>>>>>>>   <bb 2> [0.00%] [count: INV]:
>>>>>>>   switch (a_2(D)) <default: <L2> [INV] [count: INV], case 0: <L0> [INV] [count: INV], case 1: <L1> [INV] [count: INV]>
>>>>>>>
>>>>>>> <L0> (<bb 3>) [0.00%] [count: INV]:
>>>>>>>   a_3 = a_2(D) + 2;
>>>>>>>
>>>>>>> <L1> (<bb 4>) [0.00%] [count: INV]:
>>>>>>>   _4 = 2;
>>>>>>>   goto <bb 6> (<L3>); [INV] [count: INV]
>>>>>>>
>>>>>>> <L2> (<bb 5>) [0.00%] [count: INV]:
>>>>>>>   _5 = 123;
>>>>>>>
>>>>>>>   # _1 = PHI <_4(4), _5(5)>
>>>>>>> <L3> (<bb 6>) [0.00%] [count: INV]:
>>>>>>>   return _1;
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
>>>>>>>
>>>>>>> Thoughts?
>>>>>>
>>>>>> I think I prefer to always see
>>>>>>
>>>>>>   <bb 3> ....:
>>>>>>
>>>>>> and if there's a label just dump that as well, thus
>>>>>>
>>>>>>   <bb 3> ....:
>>>>>>   L0:
>>>>>>
>>>>>> I think that's how we dump the case with multiple labels.  And always use the
>>>>>> implicit bb N when dumping destinations (in gotos, switches, etc).
>>>>>>
>>>>>> That is, what we have now is IMHO premature prettifying losing BB
>>>>>> indices in the dumps
>>>>>> unnecessarily.
>>>>>>
>>>>>> Richard.
>>>>>
>>>>> Hi.
>>>>>
>>>>> I like your ideas, there's difference in between 7.1 and modified trunk:
>>>>>
>>>>> foo (int a)
>>>>> {
>>>>>   int D.1824;
>>>>>   int _1;
>>>>>   int _4;
>>>>>   int _6;
>>>>>
>>>>>   <bb 2> [0.00%] [count: INV]:
>>>>>   switch (a_2(D)) <default: <L2> [INV] [count: INV], case 0: <L0> [INV] [count: INV], case 1: <L1> [INV] [count: INV]>
>>>>>
>>>>> <L0> [0.00%] [count: INV]:
>>>>>   a_3 = a_2(D) + 2;
>>>>>
>>>>> <L1> [0.00%] [count: INV]:
>>>>>   _4 = 2;
>>>>>   goto <bb 8> (<L6>); [INV] [count: INV]
>>>>>
>>>>> <L2> [0.00%] [count: INV]:
>>>>>
>>>>>   <bb 6> [0.00%] [count: INV]:
>>>>>   a_5 = a_2(D) + 2;
>>>>>
>>>>> label_XXX [0.00%] [count: INV]:
>>>>> label_YYY [0.00%] [count: INV]:
>>>>>   _6 = 101;
>>>>>
>>>>>   # _1 = PHI <_4(4), _6(7)>
>>>>> <L6> [0.00%] [count: INV]:
>>>>>   return _1;
>>>>>
>>>>> }
>>>>>
>>>>> after:
>>>>>
>>>>> foo (int a)
>>>>> {
>>>>>   int D.1824;
>>>>>   int _1;
>>>>>   int _4;
>>>>>   int _6;
>>>>>
>>>>>   <bb 2> [0.00%] [count: INV]:
>>>>>   switch (a_2(D)) <default: <bb 5> [INV] [count: INV], case 0: <bb 3> [INV] [count: INV], case 1: <bb 4> [INV] [count: INV]>
>>>>>
>>>>>   <bb 3> [0.00%] [count: INV]:
>>>>> <L0>:
>>>>>   a_3 = a_2(D) + 2;
>>>>>
>>>>>   <bb 4> [0.00%] [count: INV]:
>>>>> <L1>:
>>>>>   _4 = 2;
>>>>>   goto <bb 8>; [INV] [count: INV]
>>>>>
>>>>>   <bb 5> [0.00%] [count: INV]:
>>>>> <L2>:
>>>>>
>>>>>   <bb 6> [0.00%] [count: INV]:
>>>>>   a_5 = a_2(D) + 2;
>>>>>
>>>>>   <bb 7> [0.00%] [count: INV]:
>>>>> label_XXX:
>>>>> label_YYY:
>>>>>   _6 = 101;
>>>>>
>>>>>   <bb 8> [0.00%] [count: INV]:
>>>>>   # _1 = PHI <_4(4), _6(7)>
>>>>> <L6>:
>>>>>   return _1;
>>>>>
>>>>> }
>>>>>
>>>>> Do you like it? What about indentation of labels, should I increase it or leave it?
>>>>
>>>> Leave it.
>>>>
>>>>> I guess there will be some tests that will need to be adjusted.
>>>>
>>>> I guess so.
>>>>
>>>> I think <L0>: and friends are all DECL_ARTIFICIAL -- maybe we can avoid dumping
>>>> them?  Hmm, I guess doing it like above, while it preserves BB numbering, does
>>>> reflect the actual IL a bit less so I guess I'd leave the <L0>s in
>>>> switches (those
>>>> have labels) and gotos if there's still the label args (not in case of
>>>> we are just
>>>> dumping CFG edges).
>>>
>>> Good, thus said there's how it will look like:
>>>
>>> $ cat /tmp/switch.c
>>> int c;
>>>
>>> int foo(int a)
>>> {
>>>   switch (a)
>>>   {
>>>   case 0:
>>>     a += 2;
>>>   case 1:
>>>     if (c)
>>>       goto label_XXX;
>>>     return 2;
>>>   default:
>>>     break;
>>>   }
>>>
>>>   a += 2;
>>>
>>> label_XXX:
>>> label_YYY:
>>>   return 99 + 2;
>>> }
>>>
>>> $ ./xgcc -B. /tmp/switch.c -fdump-tree-optimized=/dev/stdout
>>>
>>> ;; Function foo (foo, funcdef_no=0, decl_uid=1816, cgraph_uid=0, symbol_order=1)
>>>
>>> foo (int a)
>>> {
>>>   int D.1827;
>>>   int c.0_1;
>>>   int _2;
>>>   int _6;
>>>   int _8;
>>>
>>>   <bb 2> [0.00%] [count: INV]:
>>>   switch (a_3(D)) <default: <L4> [INV] [count: INV], case 0: <L0> [INV] [count: INV], case 1: <L1> [INV] [count: INV]>
>>>
>>>   <bb 3> [0.00%] [count: INV]:
>>> <L0>:
>>>   a_4 = a_3(D) + 2;
>>>
>>>   <bb 4> [0.00%] [count: INV]:
>>> <L1>:
>>>   c.0_1 = c;
>>>   if (c.0_1 != 0)
>>>     goto <bb 5>; [INV] [count: INV]
>>>   else
>>>     goto <bb 6>; [INV] [count: INV]
>>>
>>>   <bb 5> [0.00%] [count: INV]:
>>>   goto <bb 9>; [INV] [count: INV]
>>>
>>>   <bb 6> [0.00%] [count: INV]:
>>>   _6 = 2;
>>>   goto <bb 10>; [INV] [count: INV]
>>>
>>>   <bb 7> [0.00%] [count: INV]:
>>> <L4>:
>>>
>>>   <bb 8> [0.00%] [count: INV]:
>>>   a_7 = a_3(D) + 2;
>>>
>>>   <bb 9> [0.00%] [count: INV]:
>>> label_XXX:
>>> label_YYY:
>>>   _8 = 101;
>>>
>>>   <bb 10> [0.00%] [count: INV]:
>>>   # _2 = PHI <_6(6), _8(9)>
>>> <L8>:
>>>   return _2;
>>>
>>> }
>>>
>>>
>>> Note that edge bb_5->bb_9 is represented after gimplification by implicit edge, not by goto. But:
>>>
>>> ./xgcc -B. /tmp/switch.c -fdump-tree-lower=/dev/stdout
>>>
>>> ;; Function foo (foo, funcdef_no=0, decl_uid=1816, cgraph_uid=0, symbol_order=1)
>>>
>>> foo (int a)
>>> {
>>>   int D.1827;
>>>
>>>   switch (a) <default: <D.1821>, case 0: <D.1818>, case 1: <D.1819>>
>>>   <D.1818>:
>>>   a = a + 2;
>>>   <D.1819>:
>>>   c.0_1 = c;
>>>   if (c.0_1 != 0) goto <D.1825>; else goto <D.1826>;
>>>   <D.1825>:
>>>   goto label_XXX;
>>>   <D.1826>:
>>>   D.1827 = 2;
>>>   goto <D.1828>;
>>>   <D.1821>:
>>>   goto <D.1822>;
>>>   <D.1822>:
>>>   a = a + 2;
>>>   label_XXX:
>>>   label_YYY:
>>>   D.1827 = 101;
>>>   goto <D.1828>;
>>>   <D.1828>:
>>>   return D.1827;
>>> }
>>>
>>> There labels are dumped properly. If it's ok I'll start working on test-suite transition.
>>
>> Yes.  Looks good to me now.
>>
>> That said... if the fallout is very big we might consider switching to
>> -gimple style dumping
>> unconditionally?
>>
>> Richard.
>
> Hello.
>
> Sending second version of the patch. Eventually it shows that fallout for test suite was minimal.
> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
>
> Ready to be installed?

Ok.  Nice that it also simplifies code.

Thanks,
Richard.

> Martin
>
>>
>>> Martin
>>>
>>>>
>>>> Richard.
>>>>
>>>>> Martin
>>>>>
>>>>>>
>>>>>>> Martin
>>>>>>>
>>>>>>> gcc/testsuite/ChangeLog:
>>>>>>>
>>>>>>> 2017-07-27  Martin Liska  <mliska@suse.cz>
>>>>>>>
>>>>>>>         * gcc.dg/builtin-unreachable-6.c: Update scanned pattern.
>>>>>>>         * gcc.dg/tree-ssa/attr-hotcold-2.c: Likewise.
>>>>>>>         * gcc.dg/tree-ssa/ssa-ccp-18.c: Likewise.
>>>>>>>
>>>>>>> gcc/ChangeLog:
>>>>>>>
>>>>>>> 2017-07-27  Martin Liska  <mliska@suse.cz>
>>>>>>>
>>>>>>>         * gimple-pretty-print.c (dump_gimple_label): Dump BB number.
>>>>>>> ---
>>>>>>>  gcc/gimple-pretty-print.c                      | 6 +++++-
>>>>>>>  gcc/testsuite/gcc.dg/builtin-unreachable-6.c   | 2 +-
>>>>>>>  gcc/testsuite/gcc.dg/tree-ssa/attr-hotcold-2.c | 4 ++--
>>>>>>>  gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-18.c     | 3 +--
>>>>>>>  4 files changed, 9 insertions(+), 6 deletions(-)
>>>>>>>
>>>>>>>
>>>>>
>>>
>
Martin Liška July 31, 2017, 8:52 a.m. UTC | #2
On 07/31/2017 10:50 AM, Richard Biener wrote:
> On Mon, Jul 31, 2017 at 8:43 AM, Martin Liška <mliska@suse.cz> wrote:
>> On 07/28/2017 01:21 PM, Richard Biener wrote:
>>> On Fri, Jul 28, 2017 at 12:52 PM, Martin Liška <mliska@suse.cz> wrote:
>>>> On 07/28/2017 09:58 AM, Richard Biener wrote:
>>>>> On Fri, Jul 28, 2017 at 9:50 AM, Martin Liška <mliska@suse.cz> wrote:
>>>>>> On 07/28/2017 09:21 AM, Richard Biener wrote:
>>>>>>> On Thu, Jul 27, 2017 at 4:24 PM, Martin Liška <mliska@suse.cz> wrote:
>>>>>>>> Hi.
>>>>>>>>
>>>>>>>> Following simple patch adds support for dumping of BBs when it's a BB
>>>>>>>> that contains a label. That makes it easier for debugging as one can
>>>>>>>> find destination for an edge in dump file.
>>>>>>>>
>>>>>>>> Sample, before:
>>>>>>>>
>>>>>>>> foo (int a)
>>>>>>>> {
>>>>>>>>   int D.1821;
>>>>>>>>   int _1;
>>>>>>>>   int _4;
>>>>>>>>   int _5;
>>>>>>>>
>>>>>>>>   <bb 2> [0.00%] [count: INV]:
>>>>>>>>   switch (a_2(D)) <default: <L2> [INV] [count: INV], case 0: <L0> [INV] [count: INV], case 1: <L1> [INV] [count: INV]>
>>>>>>>>
>>>>>>>> <L0> [0.00%] [count: INV]:
>>>>>>>>   a_3 = a_2(D) + 2;
>>>>>>>>
>>>>>>>> <L1> [0.00%] [count: INV]:
>>>>>>>>   _4 = 2;
>>>>>>>>   goto <bb 6> (<L3>); [INV] [count: INV]
>>>>>>>>
>>>>>>>> <L2> [0.00%] [count: INV]:
>>>>>>>>   _5 = 123;
>>>>>>>>
>>>>>>>>   # _1 = PHI <_4(4), _5(5)>
>>>>>>>> <L3> [0.00%] [count: INV]:
>>>>>>>>   return _1;
>>>>>>>>
>>>>>>>> }
>>>>>>>>
>>>>>>>> After:
>>>>>>>>
>>>>>>>> foo (int a)
>>>>>>>> {
>>>>>>>>   int D.1821;
>>>>>>>>   int _1;
>>>>>>>>   int _4;
>>>>>>>>   int _5;
>>>>>>>>
>>>>>>>>   <bb 2> [0.00%] [count: INV]:
>>>>>>>>   switch (a_2(D)) <default: <L2> [INV] [count: INV], case 0: <L0> [INV] [count: INV], case 1: <L1> [INV] [count: INV]>
>>>>>>>>
>>>>>>>> <L0> (<bb 3>) [0.00%] [count: INV]:
>>>>>>>>   a_3 = a_2(D) + 2;
>>>>>>>>
>>>>>>>> <L1> (<bb 4>) [0.00%] [count: INV]:
>>>>>>>>   _4 = 2;
>>>>>>>>   goto <bb 6> (<L3>); [INV] [count: INV]
>>>>>>>>
>>>>>>>> <L2> (<bb 5>) [0.00%] [count: INV]:
>>>>>>>>   _5 = 123;
>>>>>>>>
>>>>>>>>   # _1 = PHI <_4(4), _5(5)>
>>>>>>>> <L3> (<bb 6>) [0.00%] [count: INV]:
>>>>>>>>   return _1;
>>>>>>>>
>>>>>>>> }
>>>>>>>>
>>>>>>>> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
>>>>>>>>
>>>>>>>> Thoughts?
>>>>>>>
>>>>>>> I think I prefer to always see
>>>>>>>
>>>>>>>   <bb 3> ....:
>>>>>>>
>>>>>>> and if there's a label just dump that as well, thus
>>>>>>>
>>>>>>>   <bb 3> ....:
>>>>>>>   L0:
>>>>>>>
>>>>>>> I think that's how we dump the case with multiple labels.  And always use the
>>>>>>> implicit bb N when dumping destinations (in gotos, switches, etc).
>>>>>>>
>>>>>>> That is, what we have now is IMHO premature prettifying losing BB
>>>>>>> indices in the dumps
>>>>>>> unnecessarily.
>>>>>>>
>>>>>>> Richard.
>>>>>>
>>>>>> Hi.
>>>>>>
>>>>>> I like your ideas, there's difference in between 7.1 and modified trunk:
>>>>>>
>>>>>> foo (int a)
>>>>>> {
>>>>>>   int D.1824;
>>>>>>   int _1;
>>>>>>   int _4;
>>>>>>   int _6;
>>>>>>
>>>>>>   <bb 2> [0.00%] [count: INV]:
>>>>>>   switch (a_2(D)) <default: <L2> [INV] [count: INV], case 0: <L0> [INV] [count: INV], case 1: <L1> [INV] [count: INV]>
>>>>>>
>>>>>> <L0> [0.00%] [count: INV]:
>>>>>>   a_3 = a_2(D) + 2;
>>>>>>
>>>>>> <L1> [0.00%] [count: INV]:
>>>>>>   _4 = 2;
>>>>>>   goto <bb 8> (<L6>); [INV] [count: INV]
>>>>>>
>>>>>> <L2> [0.00%] [count: INV]:
>>>>>>
>>>>>>   <bb 6> [0.00%] [count: INV]:
>>>>>>   a_5 = a_2(D) + 2;
>>>>>>
>>>>>> label_XXX [0.00%] [count: INV]:
>>>>>> label_YYY [0.00%] [count: INV]:
>>>>>>   _6 = 101;
>>>>>>
>>>>>>   # _1 = PHI <_4(4), _6(7)>
>>>>>> <L6> [0.00%] [count: INV]:
>>>>>>   return _1;
>>>>>>
>>>>>> }
>>>>>>
>>>>>> after:
>>>>>>
>>>>>> foo (int a)
>>>>>> {
>>>>>>   int D.1824;
>>>>>>   int _1;
>>>>>>   int _4;
>>>>>>   int _6;
>>>>>>
>>>>>>   <bb 2> [0.00%] [count: INV]:
>>>>>>   switch (a_2(D)) <default: <bb 5> [INV] [count: INV], case 0: <bb 3> [INV] [count: INV], case 1: <bb 4> [INV] [count: INV]>
>>>>>>
>>>>>>   <bb 3> [0.00%] [count: INV]:
>>>>>> <L0>:
>>>>>>   a_3 = a_2(D) + 2;
>>>>>>
>>>>>>   <bb 4> [0.00%] [count: INV]:
>>>>>> <L1>:
>>>>>>   _4 = 2;
>>>>>>   goto <bb 8>; [INV] [count: INV]
>>>>>>
>>>>>>   <bb 5> [0.00%] [count: INV]:
>>>>>> <L2>:
>>>>>>
>>>>>>   <bb 6> [0.00%] [count: INV]:
>>>>>>   a_5 = a_2(D) + 2;
>>>>>>
>>>>>>   <bb 7> [0.00%] [count: INV]:
>>>>>> label_XXX:
>>>>>> label_YYY:
>>>>>>   _6 = 101;
>>>>>>
>>>>>>   <bb 8> [0.00%] [count: INV]:
>>>>>>   # _1 = PHI <_4(4), _6(7)>
>>>>>> <L6>:
>>>>>>   return _1;
>>>>>>
>>>>>> }
>>>>>>
>>>>>> Do you like it? What about indentation of labels, should I increase it or leave it?
>>>>>
>>>>> Leave it.
>>>>>
>>>>>> I guess there will be some tests that will need to be adjusted.
>>>>>
>>>>> I guess so.
>>>>>
>>>>> I think <L0>: and friends are all DECL_ARTIFICIAL -- maybe we can avoid dumping
>>>>> them?  Hmm, I guess doing it like above, while it preserves BB numbering, does
>>>>> reflect the actual IL a bit less so I guess I'd leave the <L0>s in
>>>>> switches (those
>>>>> have labels) and gotos if there's still the label args (not in case of
>>>>> we are just
>>>>> dumping CFG edges).
>>>>
>>>> Good, thus said there's how it will look like:
>>>>
>>>> $ cat /tmp/switch.c
>>>> int c;
>>>>
>>>> int foo(int a)
>>>> {
>>>>   switch (a)
>>>>   {
>>>>   case 0:
>>>>     a += 2;
>>>>   case 1:
>>>>     if (c)
>>>>       goto label_XXX;
>>>>     return 2;
>>>>   default:
>>>>     break;
>>>>   }
>>>>
>>>>   a += 2;
>>>>
>>>> label_XXX:
>>>> label_YYY:
>>>>   return 99 + 2;
>>>> }
>>>>
>>>> $ ./xgcc -B. /tmp/switch.c -fdump-tree-optimized=/dev/stdout
>>>>
>>>> ;; Function foo (foo, funcdef_no=0, decl_uid=1816, cgraph_uid=0, symbol_order=1)
>>>>
>>>> foo (int a)
>>>> {
>>>>   int D.1827;
>>>>   int c.0_1;
>>>>   int _2;
>>>>   int _6;
>>>>   int _8;
>>>>
>>>>   <bb 2> [0.00%] [count: INV]:
>>>>   switch (a_3(D)) <default: <L4> [INV] [count: INV], case 0: <L0> [INV] [count: INV], case 1: <L1> [INV] [count: INV]>
>>>>
>>>>   <bb 3> [0.00%] [count: INV]:
>>>> <L0>:
>>>>   a_4 = a_3(D) + 2;
>>>>
>>>>   <bb 4> [0.00%] [count: INV]:
>>>> <L1>:
>>>>   c.0_1 = c;
>>>>   if (c.0_1 != 0)
>>>>     goto <bb 5>; [INV] [count: INV]
>>>>   else
>>>>     goto <bb 6>; [INV] [count: INV]
>>>>
>>>>   <bb 5> [0.00%] [count: INV]:
>>>>   goto <bb 9>; [INV] [count: INV]
>>>>
>>>>   <bb 6> [0.00%] [count: INV]:
>>>>   _6 = 2;
>>>>   goto <bb 10>; [INV] [count: INV]
>>>>
>>>>   <bb 7> [0.00%] [count: INV]:
>>>> <L4>:
>>>>
>>>>   <bb 8> [0.00%] [count: INV]:
>>>>   a_7 = a_3(D) + 2;
>>>>
>>>>   <bb 9> [0.00%] [count: INV]:
>>>> label_XXX:
>>>> label_YYY:
>>>>   _8 = 101;
>>>>
>>>>   <bb 10> [0.00%] [count: INV]:
>>>>   # _2 = PHI <_6(6), _8(9)>
>>>> <L8>:
>>>>   return _2;
>>>>
>>>> }
>>>>
>>>>
>>>> Note that edge bb_5->bb_9 is represented after gimplification by implicit edge, not by goto. But:
>>>>
>>>> ./xgcc -B. /tmp/switch.c -fdump-tree-lower=/dev/stdout
>>>>
>>>> ;; Function foo (foo, funcdef_no=0, decl_uid=1816, cgraph_uid=0, symbol_order=1)
>>>>
>>>> foo (int a)
>>>> {
>>>>   int D.1827;
>>>>
>>>>   switch (a) <default: <D.1821>, case 0: <D.1818>, case 1: <D.1819>>
>>>>   <D.1818>:
>>>>   a = a + 2;
>>>>   <D.1819>:
>>>>   c.0_1 = c;
>>>>   if (c.0_1 != 0) goto <D.1825>; else goto <D.1826>;
>>>>   <D.1825>:
>>>>   goto label_XXX;
>>>>   <D.1826>:
>>>>   D.1827 = 2;
>>>>   goto <D.1828>;
>>>>   <D.1821>:
>>>>   goto <D.1822>;
>>>>   <D.1822>:
>>>>   a = a + 2;
>>>>   label_XXX:
>>>>   label_YYY:
>>>>   D.1827 = 101;
>>>>   goto <D.1828>;
>>>>   <D.1828>:
>>>>   return D.1827;
>>>> }
>>>>
>>>> There labels are dumped properly. If it's ok I'll start working on test-suite transition.
>>>
>>> Yes.  Looks good to me now.
>>>
>>> That said... if the fallout is very big we might consider switching to
>>> -gimple style dumping
>>> unconditionally?
>>>
>>> Richard.
>>
>> Hello.
>>
>> Sending second version of the patch. Eventually it shows that fallout for test suite was minimal.
>> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
>>
>> Ready to be installed?
> 
> Ok.  Nice that it also simplifies code.

Yes. To be honest I also like code removal (simplification) :)

Martin

> 
> Thanks,
> Richard.
> 
>> Martin
>>
>>>
>>>> Martin
>>>>
>>>>>
>>>>> Richard.
>>>>>
>>>>>> Martin
>>>>>>
>>>>>>>
>>>>>>>> Martin
>>>>>>>>
>>>>>>>> gcc/testsuite/ChangeLog:
>>>>>>>>
>>>>>>>> 2017-07-27  Martin Liska  <mliska@suse.cz>
>>>>>>>>
>>>>>>>>         * gcc.dg/builtin-unreachable-6.c: Update scanned pattern.
>>>>>>>>         * gcc.dg/tree-ssa/attr-hotcold-2.c: Likewise.
>>>>>>>>         * gcc.dg/tree-ssa/ssa-ccp-18.c: Likewise.
>>>>>>>>
>>>>>>>> gcc/ChangeLog:
>>>>>>>>
>>>>>>>> 2017-07-27  Martin Liska  <mliska@suse.cz>
>>>>>>>>
>>>>>>>>         * gimple-pretty-print.c (dump_gimple_label): Dump BB number.
>>>>>>>> ---
>>>>>>>>  gcc/gimple-pretty-print.c                      | 6 +++++-
>>>>>>>>  gcc/testsuite/gcc.dg/builtin-unreachable-6.c   | 2 +-
>>>>>>>>  gcc/testsuite/gcc.dg/tree-ssa/attr-hotcold-2.c | 4 ++--
>>>>>>>>  gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-18.c     | 3 +--
>>>>>>>>  4 files changed, 9 insertions(+), 6 deletions(-)
>>>>>>>>
>>>>>>>>
>>>>>>
>>>>
>>
diff mbox

Patch

From 09225795a538acd70e72fcb755ece11631660f35 Mon Sep 17 00:00:00 2001
From: marxin <mliska@suse.cz>
Date: Fri, 28 Jul 2017 12:53:38 +0200
Subject: [PATCH] Learn GIMPLE pretty printer to produce nicer dump output.

gcc/ChangeLog:

2017-07-28  Martin Liska  <mliska@suse.cz>

	* gimple-pretty-print.c (dump_gimple_label): Never dump
	BB info.
	(dump_gimple_bb_header): Always dump BB info.
	(pp_cfg_jump): Do not append info about BB when dumping a jump.

gcc/testsuite/ChangeLog:

2017-07-28  Martin Liska  <mliska@suse.cz>

	* gcc.dg/builtin-unreachable-6.c: Update scanned patterns.
	* gcc.dg/tree-ssa/attr-hotcold-2.c: Likewise.
---
 gcc/gimple-pretty-print.c                      | 33 ++++++--------------------
 gcc/testsuite/gcc.dg/builtin-unreachable-6.c   |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/attr-hotcold-2.c |  4 ++--
 3 files changed, 10 insertions(+), 29 deletions(-)

diff --git a/gcc/gimple-pretty-print.c b/gcc/gimple-pretty-print.c
index c8eb9c4a7bf..8b69b72e9e2 100644
--- a/gcc/gimple-pretty-print.c
+++ b/gcc/gimple-pretty-print.c
@@ -1120,9 +1120,6 @@  dump_gimple_label (pretty_printer *buffer, glabel *gs, int spc,
   else
     {
       dump_generic_node (buffer, label, spc, flags, false);
-      basic_block bb = gimple_bb (gs);
-      if (bb && !(flags & TDF_GIMPLE))
-	pp_scalar (buffer, " %s", dump_profile (bb->frequency, bb->count));
       pp_colon (buffer);
     }
   if (flags & TDF_GIMPLE)
@@ -2695,16 +2692,12 @@  dump_gimple_bb_header (FILE *outf, basic_block bb, int indent,
     }
   else
     {
-      gimple *stmt = first_stmt (bb);
-      if (!stmt || gimple_code (stmt) != GIMPLE_LABEL)
-	{
-	  if (flags & TDF_GIMPLE)
-	    fprintf (outf, "%*sbb_%d:\n", indent, "", bb->index);
-	  else
-	    fprintf (outf, "%*s<bb %d> %s:\n",
-		     indent, "", bb->index, dump_profile (bb->frequency,
-							  bb->count));
-	}
+      if (flags & TDF_GIMPLE)
+	fprintf (outf, "%*sbb_%d:\n", indent, "", bb->index);
+      else
+	fprintf (outf, "%*s<bb %d> %s:\n",
+		 indent, "", bb->index, dump_profile (bb->frequency,
+						      bb->count));
     }
 }
 
@@ -2760,22 +2753,10 @@  pp_cfg_jump (pretty_printer *buffer, edge e, dump_flags_t flags)
     }
   else
     {
-      gimple *stmt = first_stmt (e->dest);
-
       pp_string (buffer, "goto <bb ");
       pp_decimal_int (buffer, e->dest->index);
       pp_greater (buffer);
-      if (stmt && gimple_code (stmt) == GIMPLE_LABEL)
-	{
-	  pp_string (buffer, " (");
-	  dump_generic_node (buffer,
-			     gimple_label_label (as_a <glabel *> (stmt)),
-			     0, 0, false);
-	  pp_right_paren (buffer);
-	  pp_semicolon (buffer);
-	}
-      else
-	pp_semicolon (buffer);
+      pp_semicolon (buffer);
 
       dump_edge_probability (buffer, e);
     }
diff --git a/gcc/testsuite/gcc.dg/builtin-unreachable-6.c b/gcc/testsuite/gcc.dg/builtin-unreachable-6.c
index d2596e95c3f..2f8ca369546 100644
--- a/gcc/testsuite/gcc.dg/builtin-unreachable-6.c
+++ b/gcc/testsuite/gcc.dg/builtin-unreachable-6.c
@@ -16,5 +16,5 @@  lab2:
   goto *x;
 }
 
-/* { dg-final { scan-tree-dump-times "lab \\\[\[0-9.\]+%\\\]" 1 "fab1" } } */
+/* { dg-final { scan-tree-dump-times "lab:" 1 "fab1" } } */
 /* { dg-final { scan-tree-dump-times "__builtin_unreachable" 1 "fab1" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/attr-hotcold-2.c b/gcc/testsuite/gcc.dg/tree-ssa/attr-hotcold-2.c
index 184dd10ddae..5f7e3afa2ae 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/attr-hotcold-2.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/attr-hotcold-2.c
@@ -20,9 +20,9 @@  void f(int x, int y)
 
 /* { dg-final { scan-tree-dump-times "hot label heuristics" 1 "profile_estimate" } } */
 /* { dg-final { scan-tree-dump-times "cold label heuristics" 1 "profile_estimate" } } */
-/* { dg-final { scan-tree-dump "A \\\[0\\\..*\\\]" "profile_estimate" } } */
+/* { dg-final { scan-tree-dump-times "combined heuristics: 0\\\..*" 1 "profile_estimate" } } */
 
 /* Note: we're attempting to match some number > 6000, i.e. > 60%.
    The exact number ought to be tweekable without having to juggle
    the testcase around too much.  */
-/* { dg-final { scan-tree-dump "B \\\[\[6-9\]\[0-9\]\\\..*\\\]" "profile_estimate" } } */
+/* { dg-final { scan-tree-dump-times "combined heuristics: \[6-9\]\[0-9\]\\\..*" 1 "profile_estimate" } } */
-- 
2.13.3