Andi Kleen <a...@firstfloor.org> writes: Ping!
> From: Andi Kleen <a...@linux.intel.com> > > xbegin/xend/xabort were missing memory barriers. This can > lead to memory operations being moved out of transactions, which would > cause unexpected races. > > Always generate implicit memory barriers for these intrinsics. > > The compat header versions always generated memory barriers, > so this also improves compatibility. > > Passes test suite. Ok for release branches? > > gcc/: > > 2014-10-28 Andi Kleen <a...@linux.intel.com> > > PR target/63672 > * config/i386/i386.c (ix86_expand_builtin): Generate memory > barrier after abort. > * config/i386/i386.md (xbegin): Add memory barrier. > (xend): Rename to ... > (xend_1): New. Generate memory barrier and emit xend. > --- > gcc/config/i386/i386.c | 1 + > gcc/config/i386/i386.md | 18 +++++++++++++++++- > 2 files changed, 18 insertions(+), 1 deletion(-) > > diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c > index ec3e056..ec0df40 100644 > --- a/gcc/config/i386/i386.c > +++ b/gcc/config/i386/i386.c > @@ -36413,6 +36413,7 @@ addcarryx: > return const0_rtx; > } > emit_insn (gen_xabort (op0)); > + emit_insn (gen_memory_blockage ()); > return 0; > > default: > diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md > index 7ba07c3..3544e60 100644 > --- a/gcc/config/i386/i386.md > +++ b/gcc/config/i386/i386.md > @@ -18530,6 +18530,9 @@ > > emit_move_insn (operands[0], ax_reg); > > + operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode)); > + MEM_VOLATILE_P (operands[0]) = 1; > + > DONE; > }) > > @@ -18546,13 +18549,26 @@ > [(set_attr "type" "other") > (set_attr "length" "6")]) > > -(define_insn "xend" > +(define_insn "xend_1" > [(unspec_volatile [(const_int 0)] UNSPECV_XEND)] > "TARGET_RTM" > "xend" > [(set_attr "type" "other") > (set_attr "length" "3")]) > > +(define_expand "xend" > + [(set (match_dup 0) > + (unspec:BLK [(const_int 0)] UNSPECV_XEND))] /* or match_dup 0 ? */ > + "TARGET_RTM" > +{ > + emit_insn (gen_xend_1 ()); > + > + operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode)); > + MEM_VOLATILE_P (operands[0]) = 1; > + > + DONE; > +}) > + > (define_insn "xabort" > [(unspec_volatile [(match_operand:SI 0 "const_0_to_255_operand" "n")] > UNSPECV_XABORT)] -- a...@linux.intel.com -- Speaking for myself only