> Date: Mon, 25 Dec 2017 00:52:56 +0100 > From: Patrick Wildt <patr...@blueri.se> > > Hi, > > gerhard@ found a bug in LLVM's i386 code. He noticed that some floating > point instructions were "optimized" and thus reordered between other FP > instructions that changed floating point modes, so that those reordered > instructions were running with an incorrent mode. > > I don't completely grasp the internals, but it looks someone at LLVM > took care of my bug report and changed some pseudo memory instructions > to have side effects, so that they aren't reordered. This has fixed > our test case. > > https://github.com/llvm-mirror/llvm/commit/63029e5caea7ef0af525e4f66249ca7ffa7e1280 > > ok?
Sure. Wonder if that will end up in a 5.0.2 release at some point... > diff --git a/gnu/llvm/lib/Target/X86/X86InstrFPStack.td > b/gnu/llvm/lib/Target/X86/X86InstrFPStack.td > index 11b1d070ef2..fb7eb87c64d 100644 > --- a/gnu/llvm/lib/Target/X86/X86InstrFPStack.td > +++ b/gnu/llvm/lib/Target/X86/X86InstrFPStack.td > @@ -139,6 +139,7 @@ def _Fp80 : FpI_<(outs RFP80:$dst), (ins RFP80:$src1, > RFP80:$src2), TwoArgFP, > // These instructions cannot address 80-bit memory. > multiclass FPBinary<SDNode OpNode, Format fp, string asmstring, > bit Forward = 1> { > +let mayLoad = 1, hasSideEffects = 1 in { > // ST(0) = ST(0) + [mem] > def _Fp32m : FpIf32<(outs RFP32:$dst), > (ins RFP32:$src1, f32mem:$src2), OneArgFPRW, > @@ -175,10 +176,8 @@ def _Fp80m64: FpI_<(outs RFP80:$dst), > (OpNode RFP80:$src1, (f80 (extloadf64 addr:$src2)))), > (set RFP80:$dst, > (OpNode (f80 (extloadf64 addr:$src2)), > RFP80:$src1)))]>; > -let mayLoad = 1 in > def _F32m : FPI<0xD8, fp, (outs), (ins f32mem:$src), > !strconcat("f", asmstring, "{s}\t$src")>; > -let mayLoad = 1 in > def _F64m : FPI<0xDC, fp, (outs), (ins f64mem:$src), > !strconcat("f", asmstring, "{l}\t$src")>; > // ST(0) = ST(0) + [memint] > @@ -224,12 +223,11 @@ def _FpI32m80 : FpI_<(outs RFP80:$dst), (ins > RFP80:$src1, i32mem:$src2), > (OpNode RFP80:$src1, (X86fild addr:$src2, i32))), > (set RFP80:$dst, > (OpNode (X86fild addr:$src2, i32), > RFP80:$src1)))]>; > -let mayLoad = 1 in > def _FI16m : FPI<0xDE, fp, (outs), (ins i16mem:$src), > !strconcat("fi", asmstring, "{s}\t$src")>; > -let mayLoad = 1 in > def _FI32m : FPI<0xDA, fp, (outs), (ins i32mem:$src), > !strconcat("fi", asmstring, "{l}\t$src")>; > +} // mayLoad = 1, hasSideEffects = 1 > } > > let Defs = [FPSW] in { > >