re PR tree-optimization/59322 (ICE with segfault on valid code at -O1, -O2, and ...
authorJeff Law <law@redhat.com>
Tue, 3 Dec 2013 03:36:58 +0000 (20:36 -0700)
committerJeff Law <law@gcc.gnu.org>
Tue, 3 Dec 2013 03:36:58 +0000 (20:36 -0700)
PR tree-optimization/59322
* tree-ssa-threadedge.c (create_edge_and_update_destination_phis):
Remove code which copied jump threading paths.

PR tree-optimization/59322
* gcc.c-torture/compile/pr59322.c: New test

From-SVN: r205617

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr59322.c [new file with mode: 0644]
gcc/tree-ssa-threadupdate.c

index df4c84cac9a233cee0bd95ae5811bb911f5461d3..a9202c7fc9165f8c0d54ad9ca0409a88695c9326 100644 (file)
@@ -1,3 +1,9 @@
+2013-12-02  Jeff Law  <law@redhat.com>
+
+       PR tree-optimization/59322
+       * tree-ssa-threadedge.c (create_edge_and_update_destination_phis):
+       Remove code which copied jump threading paths.
+
 2013-12-02  Sriraman Tallam  <tmsriram@google.com>
 
        PR target/58944
index 579c59ba1b704415ca54eb95398b0b1712a99eb8..80490ced7a0d8b6c04ff5d6eaea1e5bb110373e9 100644 (file)
@@ -1,3 +1,8 @@
+2013-12-02  Jeff Law  <law@redhat.com>
+
+       PR tree-optimization/59322
+       * gcc.c-torture/compile/pr59322.c: New test
+
 2013-12-02  Sriraman Tallam  <tmsriram@google.com>
 
        PR target/58944
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr59322.c b/gcc/testsuite/gcc.c-torture/compile/pr59322.c
new file mode 100644 (file)
index 0000000..918d6bd
--- /dev/null
@@ -0,0 +1,16 @@
+
+int a, b, d;
+short c;
+
+int
+foo ()
+{
+  for (b = 0; b; b = a)
+    for (c = 18; c < 10; c++)
+      {
+       d = c;
+       if (d)
+         return 0;
+      }
+  return 0;
+}
index 24d0f42a168dca4c09a8f06d79931f9afb9fbff0..ad727a1afec5249da9fb18d9b15656d4685d73fb 100644 (file)
@@ -421,27 +421,22 @@ create_edge_and_update_destination_phis (struct redirection_data *rd,
   e->probability = REG_BR_PROB_BASE;
   e->count = bb->count;
 
-  /* We have to copy path -- which means creating a new vector as well
-     as all the jump_thread_edge entries.  */
-  if (rd->path->last ()->e->aux)
-    {
-      vec<jump_thread_edge *> *path = THREAD_PATH (rd->path->last ()->e);
-      vec<jump_thread_edge *> *copy = new vec<jump_thread_edge *> ();
+  /* We used to copy the thread path here.  That was added in 2007
+     and dutifully updated through the representation changes in 2013.
 
-      /* Sadly, the elements of the vector are pointers and need to
-        be copied as well.  */
-      for (unsigned int i = 0; i < path->length (); i++)
-       {
-         jump_thread_edge *x
-           = new jump_thread_edge ((*path)[i]->e, (*path)[i]->type);
-         copy->safe_push (x);
-       }
-      e->aux = (void *)copy;
-    }
-  else
-    {
-      e->aux = NULL;
-    }
+     In 2013 we added code to thread from an interior node through
+     the backedge to another interior node.  That runs after the code
+     to thread through loop headers from outside the loop.
+
+     The latter may delete edges in the CFG, including those
+     which appeared in the jump threading path we copied here.  Thus
+     we'd end up using a dangling pointer.
+
+     After reviewing the 2007/2011 code, I can't see how anything
+     depended on copying the AUX field and clearly copying the jump
+     threading path is problematical due to embedded edge pointers.
+     It has been removed.  */
+  e->aux = NULL;
 
   /* If there are any PHI nodes at the destination of the outgoing edge
      from the duplicate block, then we will need to add a new argument