re PR middle-end/56525 (Access to ggc_freed memory in flow_loops_find)
authorRichard Biener <rguenther@suse.de>
Tue, 5 Mar 2013 12:51:28 +0000 (12:51 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 5 Mar 2013 12:51:28 +0000 (12:51 +0000)
2013-03-05  Richard Biener  <rguenther@suse.de>

PR middle-end/56525
* loop-init.c (fix_loop_structure): Remove loops in two stages,
not freeing them until the end.

From-SVN: r196462

gcc/ChangeLog
gcc/loop-init.c

index 9d07f8296e7f00ff555cfaf783ca760951f4e5b4..06a0ca2b6fe3abd809d0b32cf13b58aa7a5b1a57 100644 (file)
@@ -1,3 +1,9 @@
+2013-03-05  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/56525
+       * loop-init.c (fix_loop_structure): Remove loops in two stages,
+       not freeing them until the end.
+
 2013-03-05  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
 
        * config/s390/s390.h: Define DWARF2_ASM_LINE_DEBUG_INFO.
index b1954ca484f79bd46d54a6e0a586db218d1c7e7a..f75493817bb6275ff5f2246a2d33db614110ab34 100644 (file)
@@ -186,7 +186,7 @@ fix_loop_structure (bitmap changed_bbs)
   int record_exits = 0;
   loop_iterator li;
   struct loop *loop;
-  unsigned old_nloops;
+  unsigned old_nloops, i;
 
   timevar_push (TV_LOOP_INIT);
 
@@ -230,8 +230,9 @@ fix_loop_structure (bitmap changed_bbs)
          flow_loop_tree_node_add (loop_outer (loop), ploop);
        }
 
-      /* Remove the loop and free its data.  */
-      delete_loop (loop);
+      /* Remove the loop.  */
+      loop->header = NULL;
+      flow_loop_tree_node_remove (loop);
     }
 
   /* Remember the number of loops so we can return how many new loops
@@ -253,6 +254,14 @@ fix_loop_structure (bitmap changed_bbs)
        }
     }
 
+  /* Finally free deleted loops.  */
+  FOR_EACH_VEC_ELT (*get_loops (), i, loop)
+    if (loop && loop->header == NULL)
+      {
+       (*get_loops ())[i] = NULL;
+       flow_loop_free (loop);
+      }
+
   loops_state_clear (LOOPS_NEED_FIXUP);
 
   /* Apply flags to loops.  */