tree-ssa-threadedge.c (thread_across_edge): Record entire path when not threading...
authorJeff Law <law@redhat.com>
Tue, 3 Sep 2013 20:43:46 +0000 (14:43 -0600)
committerJeff Law <law@gcc.gnu.org>
Tue, 3 Sep 2013 20:43:46 +0000 (14:43 -0600)
* tree-ssa-threadedge.c (thread_across_edge): Record entire path
when not threading through a joiner block.  Pass joiner/no joiner
state to register_jump_thread.
* tree-ssa-threadupdate.c (register_jump_thread): Get joiner/no joiner
state from argument rather than implying on path length.
Dump the entire jump thread path into debugging dump.
* tree-flow.h (register_jump_thread): Update prototype.

* tree-ssa/ssa-dom-thread-3.c: Update due to changes in debug
dump output.

From-SVN: r202232

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c
gcc/tree-flow.h
gcc/tree-ssa-threadedge.c
gcc/tree-ssa-threadupdate.c

index f7980686c1933fa06cb88d7b0f6f0526a76fee8f..0adc930380a290d9594df9c578f2a2bdcabeb2ed 100644 (file)
@@ -1,3 +1,13 @@
+2013-09-03  Jeff Law  <law@redhat.com>
+
+       * tree-ssa-threadedge.c (thread_across_edge): Record entire path
+       when not threading through a joiner block.  Pass joiner/no joiner
+       state to register_jump_thread.
+       * tree-ssa-threadupdate.c (register_jump_thread): Get joiner/no joiner
+       state from argument rather than implying on path length.
+       Dump the entire jump thread path into debugging dump.
+       * tree-flow.h (register_jump_thread): Update prototype.
+
 2013-08-29  Xinliang David Li  <davidxl@google.com>
 
        * tree-vect-data-refs.c (vect_compute_data_ref_alignment):
index 8712a19a36da4cfbc6099df36354d3567591ff22..dbc88b17e164f31d067fb0b659fb4cc7773dfdd9 100644 (file)
@@ -1,3 +1,8 @@
+2013-09-03  Jeff Law  <law@redhat.com>
+
+       * tree-ssa/ssa-dom-thread-3.c: Update due to changes in debug
+       dump output.
+
 2013-09-03  Meador Inge  <meadori@codesourcery.com>
 
        Revert:
index d67f86928624067cffe3ad0ab7ed6a20d0572fb0..c2efd15eb3327e3e73d194c58258ef3e679968e6 100644 (file)
@@ -43,6 +43,5 @@ expand_one_var (tree var, unsigned char toplevel, unsigned char really_expand)
 }
 /* We should thread the jump, through an intermediate block.  */
 /* { dg-final { scan-tree-dump-times "Threaded" 1 "dom1"} } */
-/* { dg-final { scan-tree-dump-times "one or more intermediate" 1 "dom1"} } */
-/* { dg-final { cleanup-tree-dump "dom1" } } */
+/* { dg-final { scan-tree-dump-times "Registering jump thread .through joiner block.: \\(.*\\);  \\(.*\\);  \\(.*\\);" 1 "dom1"} } */
 
index ab42470f19af613c70e15459281191f14aa5eee7..333e1687e5d56393b004dd4955b639517367070d 100644 (file)
@@ -749,7 +749,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 (vec<edge>);
+extern void register_jump_thread (vec<edge>, bool);
 
 /* In gimplify.c  */
 tree force_gimple_operand_1 (tree, gimple_seq *, gimple_predicate, tree);
index fc33647cfc8b3f011679fa3b3a1d1d2f4c5bef22..dddcfce5a3b12768797ef678912e60f11b34194f 100644 (file)
@@ -901,6 +901,10 @@ thread_across_edge (gimple dummy_cond,
          if (dest == e->dest)
            goto fail;
 
+         vec<edge> path = vNULL;
+         path.safe_push (e);
+         path.safe_push (taken_edge);
+
          /* DEST could be null for a computed jump to an absolute
             address.  If DEST is not null, then see if we can thread
             through it as well, this helps capture secondary effects
@@ -922,7 +926,10 @@ thread_across_edge (gimple dummy_cond,
                                                  simplify,
                                                  visited);
                  if (e2)
-                   taken_edge = e2;
+                   {
+                     taken_edge = e2;
+                     path.safe_push (e2);
+                   }
                }
              while (e2);
              BITMAP_FREE (visited);
@@ -931,13 +938,10 @@ thread_across_edge (gimple dummy_cond,
          remove_temporary_equivalences (stack);
          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 ();
+             register_jump_thread (path, false);
            }
+         path.release ();
          return;
        }
     }
@@ -1009,7 +1013,7 @@ thread_across_edge (gimple dummy_cond,
              {
                propagate_threaded_block_debug_into (e3->dest,
                                                     taken_edge->dest);
-               register_jump_thread (path);
+               register_jump_thread (path, true);
              }
          }
 
index 8a872a3f9f79fab8ccb0702ad4292c375cf2e0d1..8e40f6668cf52dbf602403495421d190abb1f448 100644 (file)
@@ -1303,7 +1303,7 @@ thread_through_all_blocks (bool may_peel_loop_headers)
    after fixing the SSA graph.  */
 
 void
-register_jump_thread (vec<edge> path)
+register_jump_thread (vec<edge> path, bool through_joiner)
 {
   /* Convert PATH into 3 edge representation we've been using.  This
      is temporary until we convert this file to use a path representation
@@ -1312,7 +1312,7 @@ register_jump_thread (vec<edge> path)
   edge e2 = path[1];
   edge e3;
 
-  if (path.length () <= 2)
+  if (!through_joiner)
     e3 = NULL;
   else
     e3 = path[path.length () - 1];
@@ -1322,14 +1322,23 @@ register_jump_thread (vec<edge> path)
   if (e2 == NULL)
     return;
 
+  if (dump_file && (dump_flags & TDF_DETAILS))
+    {
+      unsigned int i;
+
+      fprintf (dump_file,
+              "  Registering jump thread %s:",
+              through_joiner ? "(through joiner block)" : "");
+
+      for (i = 0; i < path.length (); i++)
+       fprintf (dump_file, " (%d, %d); ",
+                path[i]->src->index, path[i]->dest->index);
+      fputc ('\n', dump_file);
+    }
+    
   if (!threaded_edges.exists ())
     threaded_edges.create (15);
 
-  if (dump_file && (dump_flags & TDF_DETAILS)
-      && e->dest != e2->src)
-    fprintf (dump_file,
-            "  Registering jump thread around one or more intermediate blocks\n");
-
   threaded_edges.safe_push (e);
   threaded_edges.safe_push (e2);
   threaded_edges.safe_push (e3);