]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/106249 - unroll-and-jam and LC SSA upate
authorRichard Biener <rguenther@suse.de>
Wed, 13 Jul 2022 06:27:57 +0000 (08:27 +0200)
committerRichard Biener <rguenther@suse.de>
Wed, 13 Jul 2022 06:30:44 +0000 (08:30 +0200)
When I delayed the LC SSA update in unroll-and-jam this exposed
an issue that tree_transform_and_unroll_loop does a full function
LC SSA verification when new_loop is NULL (when it doesn't need to
do versioning).  That wasn't intended.  I also took the chance
to make the versioning in tree_transform_and_unroll_loop use
TODO_update_ssa_nophi for the loop versioning SSA update which
I somehow missed earlier.

PR tree-optimization/106249
* tree-ssa-loop-manip.cc (tree_transform_and_unroll_loop):
Only verify LC SSA of the new_loop if we created it.
Use TODO_update_ssa_nophi for the SSA update after versioning
the loop.

* gcc.dg/pr106249.c: New testcase.

gcc/testsuite/gcc.dg/pr106249.c [new file with mode: 0644]
gcc/tree-ssa-loop-manip.cc

diff --git a/gcc/testsuite/gcc.dg/pr106249.c b/gcc/testsuite/gcc.dg/pr106249.c
new file mode 100644 (file)
index 0000000..f97b07f
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O -floop-unroll-and-jam --param unroll-jam-min-percent=0" } */
+
+void
+foo (double *arr)
+{
+  int i, j;
+
+  for (i = 0; i < 4; ++i)
+    for (j = 0; j < 4; ++j)
+      arr[j] = 0;
+
+  for (i = 1; i < 4; ++i)
+    for (j = 0; j < 4; ++j)
+      arr[j] = 1.0 / (i + 1);
+}
index c531f1f12fd4c13a28d834bdca1fbbab64a7e57f..410a8516370e568f223c5bafd3722a93b5b0a085 100644 (file)
@@ -1208,7 +1208,7 @@ tree_transform_and_unroll_loop (class loop *loop, unsigned factor,
                               profile_probability::guessed_always (),
                               true);
       gcc_assert (new_loop != NULL);
-      update_ssa (TODO_update_ssa);
+      update_ssa (TODO_update_ssa_no_phi);
 
       /* Prepare the cfg and update the phi nodes.  Move the loop exit to the
         loop latch (and make its condition dummy, for the moment).  */
@@ -1428,7 +1428,8 @@ tree_transform_and_unroll_loop (class loop *loop, unsigned factor,
   checking_verify_flow_info ();
   checking_verify_loop_structure ();
   checking_verify_loop_closed_ssa (true, loop);
-  checking_verify_loop_closed_ssa (true, new_loop);
+  if (new_loop)
+    checking_verify_loop_closed_ssa (true, new_loop);
 }
 
 /* Wrapper over tree_transform_and_unroll_loop for case we do not