diff options
author | Tom de Vries <tom@codesourcery.com> | 2013-11-14 00:10:24 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2013-11-14 00:10:24 +0000 |
commit | d5ae1c255dcb4c19c7e3cbe77c0f62f9c998b109 (patch) | |
tree | 9399a3d930c606d932f13d9c33e08e1b075ecf66 /gcc | |
parent | 2f1aee044cb8edb759a20f6cace56fad368d35fa (diff) | |
download | gcc-d5ae1c255dcb4c19c7e3cbe77c0f62f9c998b109.zip gcc-d5ae1c255dcb4c19c7e3cbe77c0f62f9c998b109.tar.gz gcc-d5ae1c255dcb4c19c7e3cbe77c0f62f9c998b109.tar.bz2 |
Add is_tm_ending
2013-11-14 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.
From-SVN: r204765
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/gimple.h | 1 | ||||
-rw-r--r-- | gcc/trans-mem.c | 16 | ||||
-rw-r--r-- | gcc/tree-ssa-tail-merge.c | 21 |
4 files changed, 31 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2524127..1afd8c0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 2013-11-14 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. + +2013-11-14 Tom de Vries <tom@codesourcery.com> + * tree-ssa-tail-merge.c (gimple_equal_p): Remove equal variable. 2013-11-13 Andrew MacLeod <amacleod@redhat,com> diff --git a/gcc/gimple.h b/gcc/gimple.h index db24800..9ed3238 100644 --- a/gcc/gimple.h +++ b/gcc/gimple.h @@ -957,6 +957,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 195380b..748fd5e 100644 --- a/gcc/trans-mem.c +++ b/gcc/trans-mem.c @@ -323,6 +323,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 4068977..0967085 100644 --- a/gcc/tree-ssa-tail-merge.c +++ b/gcc/tree-ssa-tail-merge.c @@ -1100,14 +1100,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); @@ -1221,15 +1213,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); |