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