From 3b18bc426a5c853bda2bdb9e646c5b00483e982a Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Tue, 3 Sep 2013 14:43:46 -0600 Subject: [PATCH] tree-ssa-threadedge.c (thread_across_edge): Record entire path when not threading through a joiner block. * 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 | 10 ++++++++ gcc/testsuite/ChangeLog | 5 ++++ .../gcc.dg/tree-ssa/ssa-dom-thread-3.c | 3 +-- gcc/tree-flow.h | 2 +- gcc/tree-ssa-threadedge.c | 18 +++++++++------ gcc/tree-ssa-threadupdate.c | 23 +++++++++++++------ 6 files changed, 44 insertions(+), 17 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f7980686c19..0adc930380a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2013-09-03 Jeff Law + + * 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 * tree-vect-data-refs.c (vect_compute_data_ref_alignment): diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8712a19a36d..dbc88b17e16 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-09-03 Jeff Law + + * tree-ssa/ssa-dom-thread-3.c: Update due to changes in debug + dump output. + 2013-09-03 Meador Inge 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 d67f8692862..c2efd15eb33 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 ab42470f19a..333e1687e5d 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); +extern void register_jump_thread (vec, 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 fc33647cfc8..dddcfce5a3b 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 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 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 8a872a3f9f7..8e40f6668cf 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 path) +register_jump_thread (vec 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 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 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);