On Fri, Jul 28, 2017 at 12:52 PM, Martin Liška <mli...@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 <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.
Yes. Looks good to me now. That said... if the fallout is very big we might consider switching to -gimple style dumping unconditionally? Richard. > 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(-) >>>>> >>>>> >>> >