re PR tree-optimization/60891 (ICE: SIGSEGV (Invalid write/read) in pre_and_rev_post_...
authorRichard Biener <rguenther@suse.de>
Wed, 23 Apr 2014 08:23:33 +0000 (08:23 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 23 Apr 2014 08:23:33 +0000 (08:23 +0000)
2014-04-23  Richard Biener  <rguenther@suse.de>

PR middle-end/60891
* loop-init.c (loop_optimizer_init): Make sure to apply
LOOPS_MAY_HAVE_MULTIPLE_LATCHES before fixing up loops.

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

From-SVN: r209673

gcc/ChangeLog
gcc/loop-init.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr60891.c [new file with mode: 0644]

index 1098089..bac9f35 100644 (file)
@@ -1,3 +1,9 @@
+2014-04-23  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/60891
+       * loop-init.c (loop_optimizer_init): Make sure to apply
+       LOOPS_MAY_HAVE_MULTIPLE_LATCHES before fixing up loops.
+
 2014-04-22  Jakub Jelinek  <jakub@redhat.com>
 
        PR sanitizer/60275
index 90453f6..59f52d0 100644 (file)
@@ -94,20 +94,15 @@ loop_optimizer_init (unsigned flags)
   else
     {
       bool recorded_exits = loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS);
+      bool needs_fixup = loops_state_satisfies_p (LOOPS_NEED_FIXUP);
 
       gcc_assert (cfun->curr_properties & PROP_loops);
 
       /* Ensure that the dominators are computed, like flow_loops_find does.  */
       calculate_dominance_info (CDI_DOMINATORS);
 
-      if (loops_state_satisfies_p (LOOPS_NEED_FIXUP))
-       {
-         loops_state_clear (~0U);
-         fix_loop_structure (NULL);
-       }
-
 #ifdef ENABLE_CHECKING
-      else
+      if (!needs_fixup)
        verify_loop_structure ();
 #endif
 
@@ -115,6 +110,14 @@ loop_optimizer_init (unsigned flags)
       if (recorded_exits)
        release_recorded_exits ();
       loops_state_clear (~0U);
+
+      if (needs_fixup)
+       {
+         /* Apply LOOPS_MAY_HAVE_MULTIPLE_LATCHES early as fix_loop_structure
+            re-applies flags.  */
+         loops_state_set (flags & LOOPS_MAY_HAVE_MULTIPLE_LATCHES);
+         fix_loop_structure (NULL);
+       }
     }
 
   /* Apply flags to loops.  */
index abbd1cf..8f1bfc6 100644 (file)
@@ -1,3 +1,8 @@
+2014-04-23  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/60891
+       * gcc.dg/torture/pr60891.c: New testcase.
+
 2014-04-22  Jakub Jelinek  <jakub@redhat.com>
 
        PR sanitizer/60275
diff --git a/gcc/testsuite/gcc.dg/torture/pr60891.c b/gcc/testsuite/gcc.dg/torture/pr60891.c
new file mode 100644 (file)
index 0000000..c8fec87
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fno-tree-ch -fno-tree-cselim -fno-tree-dominator-opts" } */
+
+int a, b, c, d, e, f;
+
+void foo (int x)
+{
+  for (;;)
+    {
+      int g = c;
+      if (x)
+       {
+         if (e)
+           while (a)
+             --f;
+       }
+      for (b = 5; b; b--)
+       {
+       }
+      if (!g)
+       x = 0;
+    }
+}