From 4b9d47898a80491086e529ed002f199fa3814533 Mon Sep 17 00:00:00 2001 From: rth Date: Tue, 6 Nov 2012 23:55:11 +0000 Subject: Prevent "illegal" block sharing within transactions. * tree-ssa-tail-merge.c (find_duplicate): Do not consider is_tm_ending_fndecl calls as mergable. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@193268 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/tree-ssa-tail-merge.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'gcc/tree-ssa-tail-merge.c') diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c index f9dc8806439..1521badebf8 100644 --- a/gcc/tree-ssa-tail-merge.c +++ b/gcc/tree-ssa-tail-merge.c @@ -1213,7 +1213,18 @@ find_duplicate (same_succ same_succ, basic_block bb1, basic_block bb2) while (!gsi_end_p (gsi1) && !gsi_end_p (gsi2)) { - if (!gimple_equal_p (same_succ, gsi_stmt (gsi1), gsi_stmt (gsi2))) + gimple stmt1 = gsi_stmt (gsi1); + gimple stmt2 = gsi_stmt (gsi2); + + if (!gimple_equal_p (same_succ, stmt1, 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))) return; gsi_prev_nondebug (&gsi1); -- cgit v1.2.1