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? Patrick 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 {