This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Improve jump thread dumping
- From: Jeff Law <law at redhat dot com>
- To: gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 03 Sep 2013 14:43:35 -0600
- Subject: Improve jump thread dumping
- Authentication-results: sourceware.org; auth=none
This finishes passing the entire path of a jump threading opportunity to
register_jump_thread and arranges to dump the entire path when dumping
details.
Bootstrapped and regression tested on x86_64-unknown-linux-gnu.
Installed onto the trunk.
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f798068..0adc930 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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):
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8712a19..dbc88b1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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:
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c
index d67f869..c2efd15 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c
@@ -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"} } */
diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h
index ab42470..333e168 100644
--- a/gcc/tree-flow.h
+++ b/gcc/tree-flow.h
@@ -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);
diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c
index fc33647..dddcfce 100644
--- a/gcc/tree-ssa-threadedge.c
+++ b/gcc/tree-ssa-threadedge.c
@@ -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);
}
}
diff --git a/gcc/tree-ssa-threadupdate.c b/gcc/tree-ssa-threadupdate.c
index 8a872a3..8e40f66 100644
--- a/gcc/tree-ssa-threadupdate.c
+++ b/gcc/tree-ssa-threadupdate.c
@@ -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);