public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Help PR70729, shuffle LIM and PRE
@ 2016-05-18 10:56 Richard Biener
  2016-05-26 14:39 ` Christophe Lyon
  0 siblings, 1 reply; 3+ messages in thread
From: Richard Biener @ 2016-05-18 10:56 UTC (permalink / raw)
  To: gcc-patches


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.

2016-05-18  Richard Biener  <rguenther@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)

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Help PR70729, shuffle LIM and PRE
  2016-05-18 10:56 [PATCH] Help PR70729, shuffle LIM and PRE Richard Biener
@ 2016-05-26 14:39 ` Christophe Lyon
  2016-05-27 12:01   ` Richard Biener
  0 siblings, 1 reply; 3+ messages in thread
From: Christophe Lyon @ 2016-05-26 14:39 UTC (permalink / raw)
  To: Richard Biener; +Cc: gcc-patches

On 18 May 2016 at 12:55, Richard Biener <rguenther@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  <rguenther@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)

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Help PR70729, shuffle LIM and PRE
  2016-05-26 14:39 ` Christophe Lyon
@ 2016-05-27 12:01   ` Richard Biener
  0 siblings, 0 replies; 3+ messages in thread
From: Richard Biener @ 2016-05-27 12:01 UTC (permalink / raw)
  To: Christophe Lyon; +Cc: gcc-patches

On Thu, 26 May 2016, Christophe Lyon wrote:

> On 18 May 2016 at 12:55, Richard Biener <rguenther@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  <rguenther@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 <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-05-27 10:03 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-18 10:56 [PATCH] Help PR70729, shuffle LIM and PRE Richard Biener
2016-05-26 14:39 ` Christophe Lyon
2016-05-27 12:01   ` Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).