tree-flow.h (register_jump_thread): Pass vector of edges instead of each important...
authorJeff Law <law@redhat.com>
Wed, 21 Aug 2013 19:27:54 +0000 (13:27 -0600)
committerJeff Law <law@gcc.gnu.org>
Wed, 21 Aug 2013 19:27:54 +0000 (13:27 -0600)
       * tree-flow.h (register_jump_thread): Pass vector of edges
       instead of each important edge.
       * tree-ssa-threadedge.c (thread_across_edge): Build the jump
       thread path into a vector and pass that to register_jump_thread.
       * tree-ssa-threadupdate.c (register_jump_thread): Conver the
       passed in edge vector to the current 3-edge form.

From-SVN: r201907

gcc/ChangeLog
gcc/tree-flow.h
gcc/tree-ssa-threadedge.c
gcc/tree-ssa-threadupdate.c

index 7162f3498cfd691b0f62e3ebf05f35cf87565e74..ba9c7c9f3b1174717c8f8257af904c3e447576e1 100644 (file)
@@ -1,5 +1,12 @@
 2013-08-21  Jeff Law  <law@redhat.com>
 
+       * tree-flow.h (register_jump_thread): Pass vector of edges
+       instead of each important edge.
+       * tree-ssa-threadedge.c (thread_across_edge): Build the jump
+       thread path into a vector and pass that to register_jump_thread.
+       * tree-ssa-threadupdate.c (register_jump_thread): Conver the
+       passed in edge vector to the current 3-edge form.
+
        Revert:
        2013-08-20  Alexey Makhalov  <makhaloff@gmail.com>
 
index caa8d7457fbf54eb0b582c42e5bf21e21619cf3c..01e65621092527579a815b55abb0f7d3fe05d1fe 100644 (file)
@@ -750,7 +750,7 @@ bool may_be_nonaddressable_p (tree expr);
 
 /* In tree-ssa-threadupdate.c.  */
 extern bool thread_through_all_blocks (bool);
-extern void register_jump_thread (edge, edge, edge);
+extern void register_jump_thread (vec<edge>);
 
 /* In gimplify.c  */
 tree force_gimple_operand_1 (tree, gimple_seq *, gimple_predicate, tree);
index 357b6712a7588745848449ba2cda83eb95b26e84..320dec52afdf0505f860b447b1bd94349ddb70fa 100644 (file)
@@ -937,10 +937,15 @@ thread_across_edge (gimple dummy_cond,
            }
 
          remove_temporary_equivalences (stack);
-         if (!taken_edge)
-           return;
-         propagate_threaded_block_debug_into (taken_edge->dest, e->dest);
-         register_jump_thread (e, taken_edge, NULL);
+         if (taken_edge)
+           {
+             vec<edge> path = vNULL;
+             propagate_threaded_block_debug_into (taken_edge->dest, e->dest);
+             path.safe_push (e);
+             path.safe_push (taken_edge);
+             register_jump_thread (path);
+             path.release ();
+           }
          return;
        }
     }
@@ -969,9 +974,12 @@ thread_across_edge (gimple dummy_cond,
        bitmap_clear (visited);
        bitmap_set_bit (visited, taken_edge->dest->index);
        bitmap_set_bit (visited, e->dest->index);
+        vec<edge> path = vNULL;
 
        /* Record whether or not we were able to thread through a successor
           of E->dest.  */
+       path.safe_push (e);
+       path.safe_push (taken_edge);
        found = false;
        e3 = taken_edge;
        do
@@ -988,6 +996,7 @@ thread_across_edge (gimple dummy_cond,
 
            if (e2)
              {
+               path.safe_push (e2);
                e3 = e2;
                found = true;
              }
@@ -1008,10 +1017,11 @@ thread_across_edge (gimple dummy_cond,
              {
                propagate_threaded_block_debug_into (e3->dest,
                                                     taken_edge->dest);
-               register_jump_thread (e, taken_edge, e3);
+               register_jump_thread (path);
              }
          }
 
+        path.release();
       }
     BITMAP_FREE (visited);
   }
index 0e4cbc98ced5d0f32f12d6987e63df3255a80612..e84542c93ff7f18422086de44ebf44420552abf2 100644 (file)
@@ -1264,8 +1264,19 @@ thread_through_all_blocks (bool may_peel_loop_headers)
    after fixing the SSA graph.  */
 
 void
-register_jump_thread (edge e, edge e2, edge e3)
+register_jump_thread (vec<edge> path)
 {
+  /* Convert PATH into 3 edge representation we've been using.  This
+     is temporary until we convert this file to use a path representation
+     throughout.  */
+  edge e = path[0];
+  edge e2 = path[1];
+
+  if (path.length () <= 2)
+    e3 = NULL;
+  else
+    e3 = path[path.length () - 1];
+
   /* This can occur if we're jumping to a constant address or
      or something similar.  Just get out now.  */
   if (e2 == NULL)