On Thu, 26 May 2016, Christophe Lyon wrote: > On 18 May 2016 at 12:55, Richard Biener <rguent...@suse.de> wrote: > > > > The following patch moves LIM before PRE to allow it to cleanup CSE > > (and copyprop) opportunities LIM exposes. It also moves the DCE done > > in loop before the loop pipeline as otherwise it is no longer executed > > uncoditionally at this point (since we have the no_loop pipeline). > > > > The patch requires some testsuite adjustments such as cope with LIM now > > running before PRE and thus disabling the former and to adjust > > for better optimization we now do in the two testcases with redundant > > stores where store motion enables sinking to sink all interesting code > > out of the innermost loop. > > > > It also requires the LIM PHI hoisting cost adjustment patch I am > > testing separately. > > > > Bootstrapped and tested on x86_64-unknown-linux-gnu (with testsuite > > fallout resulting in the following adjustments). > > > > I'm going to re-test before committing. > > > > Richard. > > Hi Richard, > > I've noticed that this patch introduces a regression on aarch64/arm targets: > gcc.dg/tree-ssa/scev-4.c scan-tree-dump-times optimized "&a" 1 > > because '&a' now appears twice in the log. > > Actually, this is the only regression on aarch64, but on arm I've also > noticed regressions on scev-5 and scev-3 (for armv5t for the latter)
See PR71237. Richard. > Christophe. > > > > > > 2016-05-18 Richard Biener <rguent...@suse.de> > > > > PR tree-optimization/70729 > > * passes.def: Move LIM pass before PRE. Remove no longer > > required copyprop and move first DCE out of the loop pipeline. > > > > * gcc.dg/autopar/outer-6.c: Adjust to avoid redundant store. > > * gcc.dg/graphite/scop-18.c: Likewise. > > * gcc.dg/pr41783.c: Disable LIM. > > * gcc.dg/tree-ssa/loadpre10.c: Likewise. > > * gcc.dg/tree-ssa/loadpre23.c: Likewise. > > * gcc.dg/tree-ssa/loadpre24.c: Likewise. > > * gcc.dg/tree-ssa/loadpre25.c: Likewise. > > * gcc.dg/tree-ssa/loadpre4.c: Likewise. > > * gcc.dg/tree-ssa/loadpre8.c: Likewise. > > * gcc.dg/tree-ssa/ssa-pre-16.c: Likewise. > > * gcc.dg/tree-ssa/ssa-pre-18.c: Likewise. > > * gcc.dg/tree-ssa/ssa-pre-20.c: Likewise. > > * gcc.dg/tree-ssa/ssa-pre-3.c: Likewise. > > * gfortran.dg/pr42108.f90: Likewise. > > > > Index: trunk/gcc/passes.def > > =================================================================== > > --- trunk.orig/gcc/passes.def 2016-05-18 11:46:56.518134310 +0200 > > +++ trunk/gcc/passes.def 2016-05-18 11:47:16.006355920 +0200 > > @@ -243,12 +243,14 @@ along with GCC; see the file COPYING3. > > NEXT_PASS (pass_cse_sincos); > > NEXT_PASS (pass_optimize_bswap); > > NEXT_PASS (pass_laddress); > > + NEXT_PASS (pass_lim); > > NEXT_PASS (pass_split_crit_edges); > > NEXT_PASS (pass_pre); > > NEXT_PASS (pass_sink_code); > > NEXT_PASS (pass_sancov); > > NEXT_PASS (pass_asan); > > NEXT_PASS (pass_tsan); > > + NEXT_PASS (pass_dce); > > /* Pass group that runs when 1) enabled, 2) there are loops > > in the function. Make sure to run pass_fix_loops before > > to discover/remove loops before running the gate function > > @@ -257,9 +259,6 @@ along with GCC; see the file COPYING3. > > NEXT_PASS (pass_tree_loop); > > PUSH_INSERT_PASSES_WITHIN (pass_tree_loop) > > NEXT_PASS (pass_tree_loop_init); > > - NEXT_PASS (pass_lim); > > - NEXT_PASS (pass_copy_prop); > > - NEXT_PASS (pass_dce); > > NEXT_PASS (pass_tree_unswitch); > > NEXT_PASS (pass_scev_cprop); > > NEXT_PASS (pass_record_bounds); > > Index: trunk/gcc/testsuite/gcc.dg/autopar/outer-6.c > > =================================================================== > > --- trunk.orig/gcc/testsuite/gcc.dg/autopar/outer-6.c 2016-01-20 > > 15:36:51.477802338 +0100 > > +++ trunk/gcc/testsuite/gcc.dg/autopar/outer-6.c 2016-05-18 > > 12:40:29.342665450 +0200 > > @@ -24,7 +24,7 @@ void parloop (int N) > > for (i = 0; i < N; i++) > > { > > for (j = 0; j < N; j++) > > - y[i]=x[i][j]; > > + y[i]+=x[i][j]; > > sum += y[i]; > > } > > g_sum = sum; > > Index: trunk/gcc/testsuite/gcc.dg/graphite/scop-18.c > > =================================================================== > > --- trunk.orig/gcc/testsuite/gcc.dg/graphite/scop-18.c 2015-09-14 > > 10:21:31.364089947 +0200 > > +++ trunk/gcc/testsuite/gcc.dg/graphite/scop-18.c 2016-05-18 > > 12:38:35.673369299 +0200 > > @@ -13,13 +13,13 @@ void test (void) > > for (i = 0; i < 24; i++) > > for (j = 0; j < 24; j++) > > for (k = 0; k < 24; k++) > > - A[i][j] = B[i][k] * C[k][j]; > > + A[i][j] += B[i][k] * C[k][j]; > > > > /* These loops should still be strip mined. */ > > for (i = 0; i < 1000; i++) > > for (j = 0; j < 1000; j++) > > for (k = 0; k < 1000; k++) > > - A[i][j] = B[i][k] * C[k][j]; > > + A[i][j] += B[i][k] * C[k][j]; > > } > > > > /* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } > > */ > > Index: trunk/gcc/testsuite/gcc.dg/pr41783.c > > =================================================================== > > --- trunk.orig/gcc/testsuite/gcc.dg/pr41783.c 2015-06-09 > > 15:45:14.092224446 +0200 > > +++ trunk/gcc/testsuite/gcc.dg/pr41783.c 2016-05-18 > > 11:47:31.454531583 +0200 > > @@ -1,5 +1,5 @@ > > /* { dg-do compile } */ > > -/* { dg-options "-O3 -fdump-tree-pre" } */ > > +/* { dg-options "-O3 -fdump-tree-pre -fno-tree-loop-im" } */ > > int db[100]; > > int a_global_var, fact; > > int main() > > Index: trunk/gcc/testsuite/gcc.dg/tree-ssa/loadpre10.c > > =================================================================== > > --- trunk.orig/gcc/testsuite/gcc.dg/tree-ssa/loadpre10.c 2015-06-09 > > 15:45:27.104343935 +0200 > > +++ trunk/gcc/testsuite/gcc.dg/tree-ssa/loadpre10.c 2016-05-18 > > 11:48:23.031118053 +0200 > > @@ -1,5 +1,5 @@ > > /* { dg-do compile } */ > > -/* { dg-options "-O2 -fdump-tree-pre-stats" } */ > > +/* { dg-options "-O2 -fdump-tree-pre-stats -fno-tree-loop-im" } */ > > struct tree_common > > { > > int code; > > Index: trunk/gcc/testsuite/gcc.dg/tree-ssa/loadpre23.c > > =================================================================== > > --- trunk.orig/gcc/testsuite/gcc.dg/tree-ssa/loadpre23.c 2015-11-05 > > 09:52:40.426667086 +0100 > > +++ trunk/gcc/testsuite/gcc.dg/tree-ssa/loadpre23.c 2016-05-18 > > 11:48:36.795274560 +0200 > > @@ -1,5 +1,5 @@ > > /* { dg-do compile } */ > > -/* { dg-options "-O2 -fdump-tree-pre-stats" } */ > > +/* { dg-options "-O2 -fdump-tree-pre-stats -fno-tree-loop-im" } */ > > > > struct { > > int a; > > Index: trunk/gcc/testsuite/gcc.dg/tree-ssa/loadpre24.c > > =================================================================== > > --- trunk.orig/gcc/testsuite/gcc.dg/tree-ssa/loadpre24.c 2015-11-05 > > 09:52:40.425667074 +0100 > > +++ trunk/gcc/testsuite/gcc.dg/tree-ssa/loadpre24.c 2016-05-18 > > 11:48:51.159437887 +0200 > > @@ -1,5 +1,5 @@ > > /* { dg-do compile } */ > > -/* { dg-options "-O2 -fdump-tree-pre-stats" } */ > > +/* { dg-options "-O2 -fdump-tree-pre-stats -fno-tree-loop-im" } */ > > > > int a; > > > > Index: trunk/gcc/testsuite/gcc.dg/tree-ssa/loadpre25.c > > =================================================================== > > --- trunk.orig/gcc/testsuite/gcc.dg/tree-ssa/loadpre25.c 2015-11-05 > > 09:52:40.426667086 +0100 > > +++ trunk/gcc/testsuite/gcc.dg/tree-ssa/loadpre25.c 2016-05-18 > > 11:49:02.815570421 +0200 > > @@ -1,5 +1,5 @@ > > /* { dg-do compile } */ > > -/* { dg-options "-O2 -fdump-tree-pre-stats" } */ > > +/* { dg-options "-O2 -fdump-tree-pre-stats -fno-tree-loop-im" } */ > > struct X { int i; }; > > int foo(struct X *a, int argc) > > { > > Index: trunk/gcc/testsuite/gcc.dg/tree-ssa/loadpre4.c > > =================================================================== > > --- trunk.orig/gcc/testsuite/gcc.dg/tree-ssa/loadpre4.c 2015-11-05 > > 09:52:40.426667086 +0100 > > +++ trunk/gcc/testsuite/gcc.dg/tree-ssa/loadpre4.c 2016-05-18 > > 11:49:16.363724467 +0200 > > @@ -1,5 +1,5 @@ > > /* { dg-do compile } */ > > -/* { dg-options "-O2 -fdump-tree-pre-stats" } */ > > +/* { dg-options "-O2 -fdump-tree-pre-stats -fno-tree-loop-im" } */ > > int main(int *a, int argc) > > { > > int i; > > Index: trunk/gcc/testsuite/gcc.dg/tree-ssa/loadpre8.c > > =================================================================== > > --- trunk.orig/gcc/testsuite/gcc.dg/tree-ssa/loadpre8.c 2015-06-09 > > 15:45:27.003343009 +0200 > > +++ trunk/gcc/testsuite/gcc.dg/tree-ssa/loadpre8.c 2016-05-18 > > 11:49:28.355860820 +0200 > > @@ -1,5 +1,5 @@ > > /* { dg-do compile } */ > > -/* { dg-options "-O2 -fdump-tree-pre-stats -std=gnu89" } */ > > +/* { dg-options "-O2 -fdump-tree-pre-stats -std=gnu89 -fno-tree-loop-im" } > > */ > > typedef union tree_node *tree; > > struct tree_common > > { > > Index: trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-16.c > > =================================================================== > > --- trunk.orig/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-16.c 2015-06-09 > > 15:45:26.659339850 +0200 > > +++ trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-16.c 2016-05-18 > > 11:50:17.428418769 +0200 > > @@ -1,5 +1,5 @@ > > /* { dg-do compile } */ > > -/* { dg-options "-O2 -fdump-tree-pre-stats -std=c99" } */ > > +/* { dg-options "-O2 -fdump-tree-pre-stats -std=c99 -fno-tree-loop-im" } */ > > int foo(int k, int *x) > > { > > int j=0; > > Index: trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-18.c > > =================================================================== > > --- trunk.orig/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-18.c 2015-06-09 > > 15:45:26.681340051 +0200 > > +++ trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-18.c 2016-05-18 > > 11:50:30.372565939 +0200 > > @@ -1,5 +1,5 @@ > > /* { dg-do compile } */ > > -/* { dg-options "-O2 -fdump-tree-pre-details" } */ > > +/* { dg-options "-O2 -fdump-tree-pre-details -fno-tree-loop-im" } */ > > > > struct Bar { int a; int b; }; > > struct Foo { int x; struct Bar y; }; > > Index: trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-20.c > > =================================================================== > > --- trunk.orig/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-20.c 2015-06-09 > > 15:45:27.045343392 +0200 > > +++ trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-20.c 2016-05-18 > > 11:50:59.072892246 +0200 > > @@ -1,5 +1,5 @@ > > /* { dg-do compile } */ > > -/* { dg-options "-O2 -fdump-tree-pre-stats" } */ > > +/* { dg-options "-O2 -fdump-tree-pre-stats -fno-tree-loop-im" } */ > > > > double pcheck; > > > > Index: trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-3.c > > =================================================================== > > --- trunk.orig/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-3.c 2015-11-05 > > 09:41:27.166224870 +0100 > > +++ trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-3.c 2016-05-18 > > 11:51:13.045051099 +0200 > > @@ -1,5 +1,5 @@ > > /* { dg-do compile } */ > > -/* { dg-options "-O2 -fdump-tree-pre-stats" } */ > > +/* { dg-options "-O2 -fdump-tree-pre-stats -fno-tree-loop-im" } */ > > unsigned foo1 (unsigned a, unsigned b, unsigned j, unsigned k) > > { > > unsigned i; > > Index: trunk/gcc/testsuite/gfortran.dg/pr42108.f90 > > =================================================================== > > --- trunk.orig/gcc/testsuite/gfortran.dg/pr42108.f90 2015-06-09 > > 15:45:08.686174805 +0200 > > +++ trunk/gcc/testsuite/gfortran.dg/pr42108.f90 2016-05-18 > > 11:53:12.382407812 +0200 > > @@ -1,5 +1,5 @@ > > ! { dg-do compile } > > -! { dg-options "-O2 -fdump-tree-fre1 -fdump-tree-pre-details" } > > +! { dg-options "-O2 -fdump-tree-fre1 -fdump-tree-pre-details > > -fno-tree-loop-im" } > > > > subroutine eval(foo1,foo2,foo3,foo4,x,n,nnd) > > implicit real*8 (a-h,o-z) > > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)