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

Martin Liška mliska@suse.cz
Fri Jul 28 10:53:00 GMT 2017


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.

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(-)
>>>>
>>>>
>>



More information about the Gcc-patches mailing list