PR tree-optimization/59322
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Dec 2013 03:36:58 +0000 (03:36 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Dec 2013 03:36:58 +0000 (03:36 +0000)
* 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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@205617 138bc75d-0d04-0410-961f-82ee72b054a4

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

index df4c84c..a9202c7 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 579c59b..80490ce 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 24d0f42..ad727a1 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