diff mbox

Factor out gimple_dont_merge_p

Message ID 52836186.4020304@mentor.com
State New
Headers show

Commit Message

Tom de Vries Nov. 13, 2013, 11:24 a.m. UTC
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?

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.

Comments

Richard Biener Nov. 13, 2013, 11:30 a.m. UTC | #1
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 mbox

Patch

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