Message ID | 52836186.4020304@mentor.com |
---|---|
State | New |
Headers | show |
On Wed, Nov 13, 2013 at 12:24 PM, Tom de Vries <Tom_deVries@mentor.com> wrote: > On 11-11-13 10:37, Richard Biener wrote: >> >> On Sat, 9 Nov 2013, Tom de Vries wrote: >> >>> Richard, >>> >>> This patch factors out gimple_dont_merge_p from gimple_equal_p and >>> find_duplicate. >>> >>> Bootstrapped and regtested on x86_64. >>> >>> OK for trunk? >> >> >> +static bool >> +gimple_dont_merge_p (gimple stmt) >> +{ >> + switch (gimple_code (stmt)) >> + { >> + case GIMPLE_CALL: >> + /* Eventually, we'll significantly complicate the CFG by adding >> + back edges to properly model the effects of transaction restart. >> + For the bulk of optimization this does not matter, but what we >> + cannot recover from is tail merging blocks between two separate >> + transactions. Avoid that by making commit not match. */ >> + if (gimple_call_builtin_p (stmt, BUILT_IN_TM_COMMIT)) >> + return true; >> + >> + /* We cannot tail-merge the builtins that end transactions. >> + ??? The alternative being unsharing of BBs in the tm_init pass. >> */ >> + if (flag_tm >> + && (gimple_call_flags (stmt) & ECF_TM_BUILTIN) >> + && is_tm_ending_fndecl (gimple_call_fndecl (stmt))) >> + return true; >> >> >> 1) BUILT_IN_TM_COMMIT is handled in is_tm_ending_fndecl, >> 2) fndecl may be NULL >> >> I'd simply get rid of gimple_dont_merge_p and call a >> is_tm_ending (gimple) function you'd add to TM. >> > > Richard, > > I've update the patch according to comments, bootstrapped and reg-tested. > > OK for trunk? Ok. Thanks, Richard. > > Thanks, > - Tom > > 2013-11-06 Tom de Vries <tom@codesourcery.com> > > * trans-mem.c (is_tm_ending): New function. > * gimple.h (is_tm_ending): Declare. > * tree-ssa-tail-merge.c (gimple_equal_p): Remove test on > BUILT_IN_TM_COMMIT. > (find_duplicate): Use is_tm_ending instead of is_tm_ending_fndecl. >
diff --git a/gcc/gimple.h b/gcc/gimple.h index 33e790c..8f902b9 100644 --- a/gcc/gimple.h +++ b/gcc/gimple.h @@ -1043,6 +1043,7 @@ extern bool infer_nonnull_range (gimple, tree); /* In trans-mem.c. */ extern void diagnose_tm_safe_errors (tree); extern void compute_transaction_bits (void); +extern bool is_tm_ending (gimple); /* In tree-nested.c. */ extern void lower_nested_functions (tree); diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c index 784ff24..7dca40e 100644 --- a/gcc/trans-mem.c +++ b/gcc/trans-mem.c @@ -321,6 +321,22 @@ is_tm_ending_fndecl (tree fndecl) return false; } +/* Return true if STMT is a built in function call that "ends" a + transaction. */ + +bool +is_tm_ending (gimple stmt) +{ + tree fndecl; + + if (gimple_code (stmt) != GIMPLE_CALL) + return false; + + fndecl = gimple_call_fndecl (stmt); + return (fndecl != NULL_TREE + && is_tm_ending_fndecl (fndecl)); +} + /* Return true if STMT is a TM load. */ static bool diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c index 00dd071..15356bd 100644 --- a/gcc/tree-ssa-tail-merge.c +++ b/gcc/tree-ssa-tail-merge.c @@ -1099,14 +1099,6 @@ gimple_equal_p (same_succ same_succ, gimple s1, gimple s2) if (!gimple_call_same_target_p (s1, s2)) return false; - /* Eventually, we'll significantly complicate the CFG by adding - back edges to properly model the effects of transaction restart. - For the bulk of optimization this does not matter, but what we - cannot recover from is tail merging blocks between two separate - transactions. Avoid that by making commit not match. */ - if (gimple_call_builtin_p (s1, BUILT_IN_TM_COMMIT)) - return false; - for (i = 0; i < gimple_call_num_args (s1); ++i) { t1 = gimple_call_arg (s1, i); @@ -1220,15 +1212,14 @@ find_duplicate (same_succ same_succ, basic_block bb1, basic_block bb2) gimple stmt1 = gsi_stmt (gsi1); gimple stmt2 = gsi_stmt (gsi2); - if (!gimple_equal_p (same_succ, stmt1, stmt2)) + /* What could be better than to this this here is to blacklist the bb + containing the stmt, when encountering the stmt f.i. in + same_succ_hash. */ + if (is_tm_ending (stmt1) + || is_tm_ending (stmt2)) return; - // We cannot tail-merge the builtins that end transactions. - // ??? The alternative being unsharing of BBs in the tm_init pass. - if (flag_tm - && is_gimple_call (stmt1) - && (gimple_call_flags (stmt1) & ECF_TM_BUILTIN) - && is_tm_ending_fndecl (gimple_call_fndecl (stmt1))) + if (!gimple_equal_p (same_succ, stmt1, stmt2)) return; gsi_prev_nondebug (&gsi1);