http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51211
--- Comment #2 from Patrick Marlier <patrick.marlier at gmail dot com> 2011-11-18 22:52:44 UTC --- After looking at it. I guess the problem was in the tracer... The tracer tries to duplicate the BB where the __transaction_atomic is. Unfortunately this is not valid with trans-mem passes. Either duplicate all blocks of the transaction or forbid the duplicate of the block. I choose the second one. Patrick Marlier. Index: gcc/tracer.c =================================================================== --- gcc/tracer.c (revision 181425) +++ gcc/tracer.c (working copy) @@ -90,10 +90,14 @@ static bool ignore_bb_p (const_basic_block bb) { + gimple g; if (bb->index < NUM_FIXED_BLOCKS) return true; if (optimize_bb_for_size_p (bb)) return true; + g = last_stmt (CONST_CAST_BB (bb)); + if (g && gimple_code (g) == GIMPLE_TRANSACTION) + return true; return false; }