aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2023-11-30 12:38:53 +0100
committerRichard Biener <rguenther@suse.de>2023-11-30 13:31:26 +0100
commit2dde9f326ded84814a78c3044294b535c1f97b41 (patch)
tree2c046a11b555c269b6aaa78c21693da4ba8761cc
parent8a6062a47b33da6d961c6354fd5788bc46aef0a9 (diff)
downloadgcc-2dde9f326ded84814a78c3044294b535c1f97b41.zip
gcc-2dde9f326ded84814a78c3044294b535c1f97b41.tar.gz
gcc-2dde9f326ded84814a78c3044294b535c1f97b41.tar.bz2
tree-optimization/112767 - spurious diagnostic after sccp/loop-split swap
We are diagnosing an unreachable loop which we only manage to elide after the copyprop pass after sccp which leaves the code open for diagnosing by the intermittent ivcanon pass. The following makes sure to clean things up a bit earlier, propagating constant final values to uses immediately. PR tree-optimization/112767 * tree-scalar-evolution.cc (final_value_replacement_loop): Propagate constants to immediate uses immediately. * gcc.dg/tree-ssa/pr112767.c: New testcase. * gcc.dg/graphite/pr83255.c: Disable SCCP.
-rw-r--r--gcc/testsuite/gcc.dg/graphite/pr83255.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr112767.c18
-rw-r--r--gcc/tree-scalar-evolution.cc11
3 files changed, 29 insertions, 2 deletions
diff --git a/gcc/testsuite/gcc.dg/graphite/pr83255.c b/gcc/testsuite/gcc.dg/graphite/pr83255.c
index cb376fa..0753263 100644
--- a/gcc/testsuite/gcc.dg/graphite/pr83255.c
+++ b/gcc/testsuite/gcc.dg/graphite/pr83255.c
@@ -1,5 +1,5 @@
/* { dg-do run } */
-/* { dg-options "-O -floop-nest-optimize -fdump-tree-graphite-details" } */
+/* { dg-options "-O -floop-nest-optimize -fno-tree-scev-cprop -fdump-tree-graphite-details" } */
int rx, in;
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr112767.c b/gcc/testsuite/gcc.dg/tree-ssa/pr112767.c
new file mode 100644
index 0000000..3f9bc06
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr112767.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+double reg_dict[32];
+
+void foo(int);
+
+void initialize()
+{
+ int i=8;
+ for (int phi=0; phi<8; ++phi) {
+ reg_dict[i]=0; /* { dg-bogus "undefined behavior" } */
+ int sn = 0;
+ if (i < 16) sn = 20;
+ foo(sn);
+ ++i;
+ }
+}
diff --git a/gcc/tree-scalar-evolution.cc b/gcc/tree-scalar-evolution.cc
index f61277c..065bcd0 100644
--- a/gcc/tree-scalar-evolution.cc
+++ b/gcc/tree-scalar-evolution.cc
@@ -3841,11 +3841,20 @@ final_value_replacement_loop (class loop *loop)
print_gimple_stmt (dump_file, phi, 0);
fprintf (dump_file, " with expr: ");
print_generic_expr (dump_file, def);
+ fprintf (dump_file, "\n");
}
any = true;
def = unshare_expr (def);
remove_phi_node (&psi, false);
+ /* Propagate constants immediately. */
+ if (CONSTANT_CLASS_P (def))
+ {
+ replace_uses_by (rslt, def);
+ release_ssa_name (rslt);
+ continue;
+ }
+
/* Create the replacement statements. */
gimple_seq stmts;
def = force_gimple_operand (def, &stmts, false, NULL_TREE);
@@ -3877,7 +3886,7 @@ final_value_replacement_loop (class loop *loop)
gsi_insert_seq_before (&gsi, stmts, GSI_SAME_STMT);
if (dump_file)
{
- fprintf (dump_file, "\n final stmt:\n ");
+ fprintf (dump_file, " final stmt:\n ");
print_gimple_stmt (dump_file, SSA_NAME_DEF_STMT (rslt), 0);
fprintf (dump_file, "\n");
}