]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/112767 - spurious diagnostic after sccp/loop-split swap
authorRichard Biener <rguenther@suse.de>
Thu, 30 Nov 2023 11:38:53 +0000 (12:38 +0100)
committerRichard Biener <rguenther@suse.de>
Thu, 30 Nov 2023 12:31:26 +0000 (13:31 +0100)
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.

gcc/testsuite/gcc.dg/graphite/pr83255.c
gcc/testsuite/gcc.dg/tree-ssa/pr112767.c [new file with mode: 0644]
gcc/tree-scalar-evolution.cc

index cb376fa61be457f3e7fd8927b3aecfd73c8ed001..0753263278701d85fef4c8bb0ded489840f528af 100644 (file)
@@ -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 (file)
index 0000000..3f9bc06
--- /dev/null
@@ -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;
+  }
+}
index f61277c32df39dd34b1f8fa6c404eefde4e9bad9..065bcd0743d7f7b979d50d6cdd13413092fa3c94 100644 (file)
@@ -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");
        }