From 7b4963c118ee8bd63f6945939530554584b9ab7e Mon Sep 17 00:00:00 2001 From: patrick Date: Tue, 26 Dec 2017 19:34:27 +0000 Subject: [PATCH] Cherry-pick a change from LLVM that marks specific pseudo memory instructions to have side effects so the optimizer does not reorder them across fnstcw/fldcw sequences. Fixes a bug seen in sqlite3 on i386. ok kettenis@ --- gnu/llvm/lib/Target/X86/X86InstrFPStack.td | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 { +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 { -- 2.20.1