]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/99912 - schedule DSE before SRA
authorRichard Biener <rguenther@suse.de>
Wed, 7 Apr 2021 10:09:44 +0000 (12:09 +0200)
committerRichard Biener <rguenther@suse.de>
Tue, 27 Apr 2021 13:17:34 +0000 (15:17 +0200)
For the testcase in the PR the main SRA pass is unable to do some
important scalarizations because dead stores of addresses make
the candiate variables disqualified.  The following patch adds
another DSE pass before SRA forming a DCE/DSE pair and moves the
DSE pass that is currently closely after SRA up to after the
next DCE pass, forming another DCE/DSE pair now residing after PRE.

2021-04-07  Richard Biener  <rguenther@suse.de>

PR tree-optimization/99912
* passes.def (pass_all_optimizations): Add pass_dse before
the first pass_dce, move the first pass_dse before the
pass_dce following pass_pre.

* gcc.dg/tree-ssa/ldist-33.c: Disable PRE and LIM.
* gcc.dg/tree-ssa/pr96789.c: Adjust dump file scanned.
* gcc.dg/tree-ssa/ssa-dse-28.c: Likewise.
* gcc.dg/tree-ssa/ssa-dse-29.c: Likewise.

gcc/passes.def
gcc/testsuite/gcc.dg/tree-ssa/ldist-33.c
gcc/testsuite/gcc.dg/tree-ssa/pr96789.c
gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-28.c
gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-29.c

index e9ed3c7bc57733e1fd8449fe4714c659dc2a95b1..61fe9fdc42c48e3a39aecbd2635a9863509a2f8b 100644 (file)
@@ -210,6 +210,7 @@ along with GCC; see the file COPYING3.  If not see
       NEXT_PASS (pass_merge_phi);
       NEXT_PASS (pass_thread_jumps);
       NEXT_PASS (pass_vrp, true /* warn_array_bounds_p */);
+      NEXT_PASS (pass_dse);
       NEXT_PASS (pass_dce);
       NEXT_PASS (pass_stdarg);
       NEXT_PASS (pass_call_cdce);
@@ -236,7 +237,6 @@ along with GCC; see the file COPYING3.  If not see
       /* Identify paths that should never be executed in a conforming
         program and isolate those paths.  */
       NEXT_PASS (pass_isolate_erroneous_paths);
-      NEXT_PASS (pass_dse);
       NEXT_PASS (pass_reassoc, true /* insert_powi_p */);
       NEXT_PASS (pass_dce);
       NEXT_PASS (pass_forwprop);
@@ -254,6 +254,7 @@ along with GCC; see the file COPYING3.  If not see
       NEXT_PASS (pass_sancov);
       NEXT_PASS (pass_asan);
       NEXT_PASS (pass_tsan);
+      NEXT_PASS (pass_dse);
       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
index 9e0cedf4fa36ffc6973df5e7af2ff791d9a36398..67846a5b183f1b7508b62741e07278b9b9f265ae 100644 (file)
@@ -1,5 +1,8 @@
 /* { dg-do compile { target size32plus } } */
-/* { dg-options "-O2 -ftree-loop-distribution -ftree-loop-distribute-patterns -fdump-tree-ldist-details" } */
+/* The desire is to show we can generate a memset from the outer loop
+   store.  Both store motion and PRE expose a DSE opportunity for this
+   zeroing - while desirable this defeats the purpose of this testcase.  */
+/* { dg-options "-O2 -fno-tree-loop-im -fno-tree-pre -ftree-loop-distribution -ftree-loop-distribute-patterns -fdump-tree-ldist-details" } */
 
 #define N (1024)
 double a[N][N], b[N][N], c[N][N];
index 5704952309b72cc1838115ef70f97eb3e9888173..4d4d4c8ac6f8178c7a5fe6e473d5e3afa905202a 100644 (file)
@@ -58,4 +58,4 @@ bar (int16_t res[16], uint8_t *val1, uint8_t *val2)
     }
 }
 
-/* { dg-final { scan-tree-dump {Deleted dead store:.*tmp} "dse3" } } */
+/* { dg-final { scan-tree-dump {Deleted dead store:.*tmp} "dse4" } } */
index b81cabe604a57f58e7c3460d65e3ee2c722cd413..3bf4e76c9653c264d9c00964c7bc655f29a42151 100644 (file)
@@ -17,5 +17,6 @@ int foo (int *p, int b)
 
 /* { dg-final { scan-tree-dump-not "Deleted dead store" "dse1"} } */
 /* { dg-final { scan-tree-dump-not "Deleted dead store" "dse2"} } */
-/* { dg-final { scan-tree-dump-not "Deleted dead store" "dse4"} } */
+/* { dg-final { scan-tree-dump-not "Deleted dead store" "dse3"} } */
+/* { dg-final { scan-tree-dump-not "Deleted dead store" "dse5"} } */
 
index f4ef89c590cd42ef2869584226f9e69f18fd94aa..4990ae0d18c8943089688711f649ed9fae5ae37f 100644 (file)
@@ -22,5 +22,6 @@ foo(int cond, struct z *s)
 
 /* { dg-final { scan-tree-dump-times "Deleted dead store" 3 "dse1"} } */
 /* { dg-final { scan-tree-dump-not "Deleted dead store" "dse2"} } */
-/* { dg-final { scan-tree-dump-not "Deleted dead store" "dse4"} } */
+/* { dg-final { scan-tree-dump-not "Deleted dead store" "dse3"} } */
+/* { dg-final { scan-tree-dump-not "Deleted dead store" "dse5"} } */