* tree-ssa-threadupdate.c (thread_through_loop_header): Do not
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 Nov 2013 03:30:08 +0000 (03:30 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 Nov 2013 03:30:08 +0000 (03:30 +0000)
thread through a joiner which has the latch edge.

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

gcc/ChangeLog
gcc/tree-ssa-threadupdate.c

index 14ed90f..841fd6c 100644 (file)
@@ -1,3 +1,8 @@
+2013-11-19  Jeff Law  <law@redhat.com>
+
+       * tree-ssa-threadupdate.c (thread_through_loop_header):  Do not
+       thread through a joiner which has the latch edge.
+
 2013-11-19  Jan Hubicka  <jh@suse.cz>
 
        * md.texi (setmem): Document new parameter.
index 97dc6cb..bc23f4c 100644 (file)
@@ -1060,11 +1060,22 @@ thread_through_loop_header (struct loop *loop, bool may_peel_loop_headers)
   if (single_succ_p (header))
     goto fail;
 
+  /* If we threaded the latch using a joiner block, we cancel the
+     threading opportunity out of an abundance of caution.  However,
+     still allow threading from outside to inside the loop.  */
   if (latch->aux)
     {
       vec<jump_thread_edge *> *path = THREAD_PATH (latch);
       if ((*path)[1]->type == EDGE_COPY_SRC_JOINER_BLOCK)
-       goto fail;
+       {
+         delete_jump_thread_path (path);
+         latch->aux = NULL;
+       }
+    }
+
+  if (latch->aux)
+    {
+      vec<jump_thread_edge *> *path = THREAD_PATH (latch);
       tgt_edge = (*path)[1]->e;
       tgt_bb = tgt_edge->dest;
     }