forked from OSchip/llvm-project
[X86][X87] Mark pseudo memory fold instructions as load/sideeffects (PR21160, PR34080, PR34454).
Match regular x87 memory fold instructions with load/sideeffects tags, to prevent the schedulers from re-ordering them across the fnstcw/fldcw sequences for truncating stores while they are still pseudo during the stack conversion pass. llvm-svn: 321424
This commit is contained in:
parent
ed99c332c3
commit
e0434fad16
|
@ -141,6 +141,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,
|
||||
|
@ -177,10 +178,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]
|
||||
|
@ -226,12 +225,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 {
|
||||
|
|
|
@ -62,6 +62,7 @@ define void @computeJD(%struct.DateTime*) nounwind {
|
|||
; CHECK-NEXT: imull $60000, 24(%ebx), %ecx # imm = 0xEA60
|
||||
; CHECK-NEXT: addl %eax, %ecx
|
||||
; CHECK-NEXT: fldl 28(%ebx)
|
||||
; CHECK-NEXT: fmuls {{\.LCPI.*}}
|
||||
; CHECK-NEXT: fnstcw (%esp)
|
||||
; CHECK-NEXT: movzwl (%esp), %eax
|
||||
; CHECK-NEXT: movw $3199, (%esp) # imm = 0xC7F
|
||||
|
@ -69,7 +70,6 @@ define void @computeJD(%struct.DateTime*) nounwind {
|
|||
; CHECK-NEXT: movw %ax, (%esp)
|
||||
; CHECK-NEXT: movl %ecx, %eax
|
||||
; CHECK-NEXT: sarl $31, %eax
|
||||
; CHECK-NEXT: fmuls {{\.LCPI.*}}
|
||||
; CHECK-NEXT: fistpll {{[0-9]+}}(%esp)
|
||||
; CHECK-NEXT: fldcw (%esp)
|
||||
; CHECK-NEXT: addl {{[0-9]+}}(%esp), %ecx
|
||||
|
|
Loading…
Reference in New Issue