aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTom de Vries <tom@codesourcery.com>2013-11-14 00:10:24 +0000
committerTom de Vries <vries@gcc.gnu.org>2013-11-14 00:10:24 +0000
commitd5ae1c255dcb4c19c7e3cbe77c0f62f9c998b109 (patch)
tree9399a3d930c606d932f13d9c33e08e1b075ecf66 /gcc
parent2f1aee044cb8edb759a20f6cace56fad368d35fa (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/gimple.h1
-rw-r--r--gcc/trans-mem.c16
-rw-r--r--gcc/tree-ssa-tail-merge.c21
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);