Message ID | CAO2gOZXPsoRetjgWtATwAqj0FGAbH59S_+-bQAm1Lstx6WHSZA@mail.gmail.com |
---|---|
State | New |
Headers | show |
On Fri, May 30, 2014 at 11:43 PM, Dehao Chen wrote: > Index: gcc/testsuite/gcc.dg/tree-prof/merge_block.c > =================================================================== > --- gcc/testsuite/gcc.dg/tree-prof/merge_block.c (revision 0) > +++ gcc/testsuite/gcc.dg/tree-prof/merge_block.c (revision 0) > @@ -0,0 +1,20 @@ > + > +/* { dg-options "-O2 -fno-ipa-pure-const > -fdump-tree-optimized-blocks-details -fno-early-inlining" } */ > +int a[8]; > +int t() > +{ > + int i; > + for (i = 0; i < 3; i++) > + if (a[i]) > + break; > + return i; > +} > +main () > +{ > + int i; > + for (i = 0; i < 1000; i++) > + t (); > + return 0; > +} > +/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ > +/* { dg-final-use { cleanup-tree-dump "optimized" } } */ I suppose you want to avoid having t() inlined into main()? If so, then I'd suggest adding __attribute__((__noinline__,__noclone__)) to "robustify" the test case. Ciao! Steven
Thanks for the suggestion. I actually want this function to be inlined in ipa-inline phase, not einline phase. Dehao On Fri, May 30, 2014 at 4:50 PM, Steven Bosscher <stevenb.gcc@gmail.com> wrote: > On Fri, May 30, 2014 at 11:43 PM, Dehao Chen wrote: >> Index: gcc/testsuite/gcc.dg/tree-prof/merge_block.c >> =================================================================== >> --- gcc/testsuite/gcc.dg/tree-prof/merge_block.c (revision 0) >> +++ gcc/testsuite/gcc.dg/tree-prof/merge_block.c (revision 0) >> @@ -0,0 +1,20 @@ >> + >> +/* { dg-options "-O2 -fno-ipa-pure-const >> -fdump-tree-optimized-blocks-details -fno-early-inlining" } */ >> +int a[8]; >> +int t() >> +{ >> + int i; >> + for (i = 0; i < 3; i++) >> + if (a[i]) >> + break; >> + return i; >> +} >> +main () >> +{ >> + int i; >> + for (i = 0; i < 1000; i++) >> + t (); >> + return 0; >> +} >> +/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ >> +/* { dg-final-use { cleanup-tree-dump "optimized" } } */ > > > I suppose you want to avoid having t() inlined into main()? If so, > then I'd suggest adding __attribute__((__noinline__,__noclone__)) to > "robustify" the test case. > > Ciao! > Steven
Index: gcc/testsuite/gcc.dg/tree-prof/merge_block.c =================================================================== --- gcc/testsuite/gcc.dg/tree-prof/merge_block.c (revision 0) +++ gcc/testsuite/gcc.dg/tree-prof/merge_block.c (revision 0) @@ -0,0 +1,20 @@ + +/* { dg-options "-O2 -fno-ipa-pure-const -fdump-tree-optimized-blocks-details -fno-early-inlining" } */ +int a[8]; +int t() +{ + int i; + for (i = 0; i < 3; i++) + if (a[i]) + break; + return i; +} +main () +{ + int i; + for (i = 0; i < 1000; i++) + t (); + return 0; +} +/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ +/* { dg-final-use { cleanup-tree-dump "optimized" } } */ Index: gcc/tree-cfg.c =================================================================== --- gcc/tree-cfg.c (revision 211096) +++ gcc/tree-cfg.c (working copy) @@ -1880,8 +1880,11 @@ gimple_merge_blocks (basic_block a, basic_block b) /* When merging two BBs, if their counts are different, the larger count is selected as the new bb count. This is to handle inconsistent profiles. */ - a->count = MAX (a->count, b->count); - a->frequency = MAX (a->frequency, b->frequency); + if (a->loop_father == b->loop_father) + { + a->count = MAX (a->count, b->count); + a->frequency = MAX (a->frequency, b->frequency); + } /* Merge the sequences. */ last = gsi_last_bb (a);