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.
> Thanks,
> - Tom
>
> 2013-11-06 Tom de Vries <[email protected]>
>
> * tree-ssa-tail-merge.c (gimple_dont_merge_p): Factor function out
> of ...
> (gimple_equal_p): ... here, and ...
> (find_duplicate): ... here. Use gimple_dont_merge_p.