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)

Reply via email to