On 07/28/2017 09:58 AM, Richard Biener wrote: > On Fri, Jul 28, 2017 at 9:50 AM, Martin Liška <mli...@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 <mli...@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 <mli...@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 <mli...@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(-) >>>> >>>> >>