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
This commit is contained in:
Tom de Vries 2013-11-14 00:10:24 +00:00 committed by Tom de Vries
parent 2f1aee044c
commit d5ae1c255d
4 changed files with 31 additions and 15 deletions

View file

@ -1,3 +1,11 @@
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.

View file

@ -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);

View file

@ -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

View file

@ -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);