Just something I noticed while looking at a problem tonight. We threaded all the way back to the start of a jump threading path because we didn't mark both blocks on the starting edge.

Bootstrapped and regression tested on x86_64-unknown-linux-gnu. Installed on the trunk.

Jeff
        * tree-ssa-threadedge.c (thread_across_edge): Mark the start of the
        jump thread path properly.

diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c
index a144875..7600d7b 100644
--- a/gcc/tree-ssa-threadedge.c
+++ b/gcc/tree-ssa-threadedge.c
@@ -1078,8 +1078,9 @@ thread_across_edge (gimple dummy_cond,
      
        /* Avoid threading to any block we have already visited.  */
        bitmap_clear (visited);
-       bitmap_set_bit (visited, taken_edge->dest->index);
+       bitmap_set_bit (visited, e->src->index);
        bitmap_set_bit (visited, e->dest->index);
+       bitmap_set_bit (visited, taken_edge->dest->index);
         vec<jump_thread_edge *> *path = new vec<jump_thread_edge *> ();
 
        /* Record whether or not we were able to thread through a successor

Reply via email to