tree-optimization/99912 - schedule DSE before SRA

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.
This commit is contained in:
Richard Biener 2021-04-07 12:09:44 +02:00
parent 39073938b4
commit d8e1f1d241
5 changed files with 11 additions and 5 deletions

View 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

View 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];

View 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" } } */

View 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"} } */

View 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"} } */