]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/100492 - avoid irreducible regions in loop distribution
authorRichard Biener <rguenther@suse.de>
Mon, 10 May 2021 09:37:27 +0000 (11:37 +0200)
committerRichard Biener <rguenther@suse.de>
Mon, 10 May 2021 11:05:58 +0000 (13:05 +0200)
When we distribute away a condition we rely on the ability to
change it to either 1 != 0 or 0 != 0 depending on the direction
of the exit branch in the respective loop.  But when the loop
contains an irreducible sub-region then for the conditions inside
this this fails and can lead to infinite loops being generated.

Avoid distibuting loops with irreducible sub-regions.

2021-05-10  Richard Biener  <rguenther@suse.de>

PR tree-optimization/100492
* tree-loop-distribution.c (find_seed_stmts_for_distribution):
Find nothing when the loop contains an irreducible region.

* gcc.dg/torture/pr100492.c: New testcase.

gcc/testsuite/gcc.dg/torture/pr100492.c [new file with mode: 0644]
gcc/tree-loop-distribution.c

diff --git a/gcc/testsuite/gcc.dg/torture/pr100492.c b/gcc/testsuite/gcc.dg/torture/pr100492.c
new file mode 100644 (file)
index 0000000..75229c8
--- /dev/null
@@ -0,0 +1,26 @@
+/* { dg-do run } */
+/* { dg-additional-options "-ftree-loop-distribution" } */
+
+extern void abort (void);
+
+signed char a, c;
+int b, d, *e = &d, g;
+signed static char f;
+int main() {
+  int h = 0;
+  int a_ = a;
+  for (; a_ < 1; a = ++a_) {
+    int *i[5], **j = &i[4], ***k[3][2] = {{&j}}, ****l = &k[2][1], *****m = &l;
+    char *n = &c;
+    f = *e = g = 0;
+    for (; g < 2; g++) {
+      for (b = 0; b < 3; b++)
+        h = (h && (*n = 0)) == 0;
+      if (g)
+        break;
+    }
+  }
+  if (f != 0)
+    abort ();
+  return 0;
+}
index 8b91a30d1c62d74908fd9f0f7dc675c837b60395..65aa1df4abae2c6acf40299f710bc62ee6bacc07 100644 (file)
@@ -3203,6 +3203,16 @@ find_seed_stmts_for_distribution (class loop *loop, vec<gimple *> *work_list)
   /* Initialize the worklist with stmts we seed the partitions with.  */
   for (unsigned i = 0; i < loop->num_nodes; ++i)
     {
+      /* In irreducible sub-regions we don't know how to redirect
+        conditions, so fail.  See PR100492.  */
+      if (bbs[i]->flags & BB_IRREDUCIBLE_LOOP)
+       {
+         if (dump_file && (dump_flags & TDF_DETAILS))
+           fprintf (dump_file, "loop %d contains an irreducible region.\n",
+                    loop->num);
+         work_list->truncate (0);
+         break;
+       }
       for (gphi_iterator gsi = gsi_start_phis (bbs[i]);
           !gsi_end_p (gsi); gsi_next (&gsi))
        {