]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Add is_tm_ending
authorTom de Vries <tom@codesourcery.com>
Thu, 14 Nov 2013 00:10:24 +0000 (00:10 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Thu, 14 Nov 2013 00:10:24 +0000 (00:10 +0000)
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

gcc/ChangeLog
gcc/gimple.h
gcc/trans-mem.c
gcc/tree-ssa-tail-merge.c

index 25241277ed41dcc04962df95b475932118a5d73c..1afd8c03b61de72300f543f89cc06d020f333dc7 100644 (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.
index db24800b43a39f11764a081746ff50beefcd4faf..9ed323899a8d942d727465f43c4238089097e254 100644 (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);
index 195380bee4dbb38886badb1e8228248a810c9155..748fd5edf603dd66200ac4851c5e1c50de1f9b3d 100644 (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
index 406897755fc112830b4f63ed35b2714416760fc0..09670857a59602dda3916374ddd365f772e7441f 100644 (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);