Skip to content

Commit 89153cf

Browse files
committed
[SDAG] Only apply sincos stack slot folding to IR pointers
Fixes #115323
1 parent 22b4b1a commit 89153cf

File tree

4 files changed

+186
-93
lines changed

4 files changed

+186
-93
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2518,7 +2518,12 @@ bool SelectionDAG::expandMultipleResultFPLibCall(
25182518
SDValue StoreValue = ST->getValue();
25192519
unsigned ResNo = StoreValue.getResNo();
25202520
Type *StoreType = StoreValue.getValueType().getTypeForEVT(Ctx);
2521-
if (CallRetResNo == ResNo || !ST->isSimple() ||
2521+
// If the pointer value does not come from the IR, it could come from ABI
2522+
// lowering and may alias with the arguments of the library call if they are
2523+
// passed via the stack.
2524+
const Value *PointerValue =
2525+
dyn_cast_or_null<const Value *>(ST->getPointerInfo().V);
2526+
if (!PointerValue || CallRetResNo == ResNo || !ST->isSimple() ||
25222527
ST->getAddressSpace() != 0 ||
25232528
ST->getAlign() <
25242529
getDataLayout().getABITypeAlign(StoreType->getScalarType()) ||

llvm/test/CodeGen/RISCV/llvm.frexp.ll

Lines changed: 112 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -543,42 +543,50 @@ define i32 @test_frexp_f32_i32_only_use_exp(float %a) nounwind {
543543
define { <4 x float>, <4 x i32> } @test_frexp_v4f32_v4i32(<4 x float> %a) nounwind {
544544
; RV32IFD-LABEL: test_frexp_v4f32_v4i32:
545545
; RV32IFD: # %bb.0:
546-
; RV32IFD-NEXT: addi sp, sp, -48
547-
; RV32IFD-NEXT: sw ra, 44(sp) # 4-byte Folded Spill
548-
; RV32IFD-NEXT: sw s0, 40(sp) # 4-byte Folded Spill
549-
; RV32IFD-NEXT: fsd fs0, 32(sp) # 8-byte Folded Spill
550-
; RV32IFD-NEXT: fsd fs1, 24(sp) # 8-byte Folded Spill
551-
; RV32IFD-NEXT: fsd fs2, 16(sp) # 8-byte Folded Spill
552-
; RV32IFD-NEXT: fsd fs3, 8(sp) # 8-byte Folded Spill
546+
; RV32IFD-NEXT: addi sp, sp, -64
547+
; RV32IFD-NEXT: sw ra, 60(sp) # 4-byte Folded Spill
548+
; RV32IFD-NEXT: sw s0, 56(sp) # 4-byte Folded Spill
549+
; RV32IFD-NEXT: fsd fs0, 48(sp) # 8-byte Folded Spill
550+
; RV32IFD-NEXT: fsd fs1, 40(sp) # 8-byte Folded Spill
551+
; RV32IFD-NEXT: fsd fs2, 32(sp) # 8-byte Folded Spill
552+
; RV32IFD-NEXT: fsd fs3, 24(sp) # 8-byte Folded Spill
553553
; RV32IFD-NEXT: fmv.s fs0, fa3
554554
; RV32IFD-NEXT: fmv.s fs1, fa2
555555
; RV32IFD-NEXT: fmv.s fs2, fa1
556556
; RV32IFD-NEXT: mv s0, a0
557-
; RV32IFD-NEXT: addi a0, a0, 16
557+
; RV32IFD-NEXT: addi a0, sp, 8
558558
; RV32IFD-NEXT: call frexpf
559559
; RV32IFD-NEXT: fmv.s fs3, fa0
560-
; RV32IFD-NEXT: addi a0, s0, 20
560+
; RV32IFD-NEXT: addi a0, sp, 12
561561
; RV32IFD-NEXT: fmv.s fa0, fs2
562562
; RV32IFD-NEXT: call frexpf
563563
; RV32IFD-NEXT: fmv.s fs2, fa0
564-
; RV32IFD-NEXT: addi a0, s0, 24
564+
; RV32IFD-NEXT: addi a0, sp, 16
565565
; RV32IFD-NEXT: fmv.s fa0, fs1
566566
; RV32IFD-NEXT: call frexpf
567567
; RV32IFD-NEXT: fmv.s fs1, fa0
568-
; RV32IFD-NEXT: addi a0, s0, 28
568+
; RV32IFD-NEXT: addi a0, sp, 20
569569
; RV32IFD-NEXT: fmv.s fa0, fs0
570570
; RV32IFD-NEXT: call frexpf
571+
; RV32IFD-NEXT: lw a0, 8(sp)
572+
; RV32IFD-NEXT: lw a1, 12(sp)
573+
; RV32IFD-NEXT: lw a2, 16(sp)
574+
; RV32IFD-NEXT: lw a3, 20(sp)
575+
; RV32IFD-NEXT: sw a0, 16(s0)
576+
; RV32IFD-NEXT: sw a1, 20(s0)
577+
; RV32IFD-NEXT: sw a2, 24(s0)
578+
; RV32IFD-NEXT: sw a3, 28(s0)
571579
; RV32IFD-NEXT: fsw fs3, 0(s0)
572580
; RV32IFD-NEXT: fsw fs2, 4(s0)
573581
; RV32IFD-NEXT: fsw fs1, 8(s0)
574582
; RV32IFD-NEXT: fsw fa0, 12(s0)
575-
; RV32IFD-NEXT: lw ra, 44(sp) # 4-byte Folded Reload
576-
; RV32IFD-NEXT: lw s0, 40(sp) # 4-byte Folded Reload
577-
; RV32IFD-NEXT: fld fs0, 32(sp) # 8-byte Folded Reload
578-
; RV32IFD-NEXT: fld fs1, 24(sp) # 8-byte Folded Reload
579-
; RV32IFD-NEXT: fld fs2, 16(sp) # 8-byte Folded Reload
580-
; RV32IFD-NEXT: fld fs3, 8(sp) # 8-byte Folded Reload
581-
; RV32IFD-NEXT: addi sp, sp, 48
583+
; RV32IFD-NEXT: lw ra, 60(sp) # 4-byte Folded Reload
584+
; RV32IFD-NEXT: lw s0, 56(sp) # 4-byte Folded Reload
585+
; RV32IFD-NEXT: fld fs0, 48(sp) # 8-byte Folded Reload
586+
; RV32IFD-NEXT: fld fs1, 40(sp) # 8-byte Folded Reload
587+
; RV32IFD-NEXT: fld fs2, 32(sp) # 8-byte Folded Reload
588+
; RV32IFD-NEXT: fld fs3, 24(sp) # 8-byte Folded Reload
589+
; RV32IFD-NEXT: addi sp, sp, 64
582590
; RV32IFD-NEXT: ret
583591
;
584592
; RV64IFD-LABEL: test_frexp_v4f32_v4i32:
@@ -631,44 +639,52 @@ define { <4 x float>, <4 x i32> } @test_frexp_v4f32_v4i32(<4 x float> %a) nounwi
631639
;
632640
; RV32IZFINXZDINX-LABEL: test_frexp_v4f32_v4i32:
633641
; RV32IZFINXZDINX: # %bb.0:
634-
; RV32IZFINXZDINX-NEXT: addi sp, sp, -32
635-
; RV32IZFINXZDINX-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
636-
; RV32IZFINXZDINX-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
637-
; RV32IZFINXZDINX-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
638-
; RV32IZFINXZDINX-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
639-
; RV32IZFINXZDINX-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
640-
; RV32IZFINXZDINX-NEXT: sw s4, 8(sp) # 4-byte Folded Spill
642+
; RV32IZFINXZDINX-NEXT: addi sp, sp, -48
643+
; RV32IZFINXZDINX-NEXT: sw ra, 44(sp) # 4-byte Folded Spill
644+
; RV32IZFINXZDINX-NEXT: sw s0, 40(sp) # 4-byte Folded Spill
645+
; RV32IZFINXZDINX-NEXT: sw s1, 36(sp) # 4-byte Folded Spill
646+
; RV32IZFINXZDINX-NEXT: sw s2, 32(sp) # 4-byte Folded Spill
647+
; RV32IZFINXZDINX-NEXT: sw s3, 28(sp) # 4-byte Folded Spill
648+
; RV32IZFINXZDINX-NEXT: sw s4, 24(sp) # 4-byte Folded Spill
641649
; RV32IZFINXZDINX-NEXT: mv s0, a4
642650
; RV32IZFINXZDINX-NEXT: mv s1, a3
643651
; RV32IZFINXZDINX-NEXT: mv s2, a2
644652
; RV32IZFINXZDINX-NEXT: mv a2, a1
645653
; RV32IZFINXZDINX-NEXT: mv s3, a0
646-
; RV32IZFINXZDINX-NEXT: addi a1, a0, 16
654+
; RV32IZFINXZDINX-NEXT: addi a1, sp, 8
647655
; RV32IZFINXZDINX-NEXT: mv a0, a2
648656
; RV32IZFINXZDINX-NEXT: call frexpf
649657
; RV32IZFINXZDINX-NEXT: mv s4, a0
650-
; RV32IZFINXZDINX-NEXT: addi a1, s3, 20
658+
; RV32IZFINXZDINX-NEXT: addi a1, sp, 12
651659
; RV32IZFINXZDINX-NEXT: mv a0, s2
652660
; RV32IZFINXZDINX-NEXT: call frexpf
653661
; RV32IZFINXZDINX-NEXT: mv s2, a0
654-
; RV32IZFINXZDINX-NEXT: addi a1, s3, 24
662+
; RV32IZFINXZDINX-NEXT: addi a1, sp, 16
655663
; RV32IZFINXZDINX-NEXT: mv a0, s1
656664
; RV32IZFINXZDINX-NEXT: call frexpf
657665
; RV32IZFINXZDINX-NEXT: mv s1, a0
658-
; RV32IZFINXZDINX-NEXT: addi a1, s3, 28
666+
; RV32IZFINXZDINX-NEXT: addi a1, sp, 20
659667
; RV32IZFINXZDINX-NEXT: mv a0, s0
660668
; RV32IZFINXZDINX-NEXT: call frexpf
669+
; RV32IZFINXZDINX-NEXT: lw a1, 8(sp)
670+
; RV32IZFINXZDINX-NEXT: lw a2, 12(sp)
671+
; RV32IZFINXZDINX-NEXT: lw a3, 16(sp)
672+
; RV32IZFINXZDINX-NEXT: lw a4, 20(sp)
673+
; RV32IZFINXZDINX-NEXT: sw a1, 16(s3)
674+
; RV32IZFINXZDINX-NEXT: sw a2, 20(s3)
675+
; RV32IZFINXZDINX-NEXT: sw a3, 24(s3)
676+
; RV32IZFINXZDINX-NEXT: sw a4, 28(s3)
661677
; RV32IZFINXZDINX-NEXT: sw s4, 0(s3)
662678
; RV32IZFINXZDINX-NEXT: sw s2, 4(s3)
663679
; RV32IZFINXZDINX-NEXT: sw s1, 8(s3)
664680
; RV32IZFINXZDINX-NEXT: sw a0, 12(s3)
665-
; RV32IZFINXZDINX-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
666-
; RV32IZFINXZDINX-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
667-
; RV32IZFINXZDINX-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
668-
; RV32IZFINXZDINX-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
669-
; RV32IZFINXZDINX-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
670-
; RV32IZFINXZDINX-NEXT: lw s4, 8(sp) # 4-byte Folded Reload
671-
; RV32IZFINXZDINX-NEXT: addi sp, sp, 32
681+
; RV32IZFINXZDINX-NEXT: lw ra, 44(sp) # 4-byte Folded Reload
682+
; RV32IZFINXZDINX-NEXT: lw s0, 40(sp) # 4-byte Folded Reload
683+
; RV32IZFINXZDINX-NEXT: lw s1, 36(sp) # 4-byte Folded Reload
684+
; RV32IZFINXZDINX-NEXT: lw s2, 32(sp) # 4-byte Folded Reload
685+
; RV32IZFINXZDINX-NEXT: lw s3, 28(sp) # 4-byte Folded Reload
686+
; RV32IZFINXZDINX-NEXT: lw s4, 24(sp) # 4-byte Folded Reload
687+
; RV32IZFINXZDINX-NEXT: addi sp, sp, 48
672688
; RV32IZFINXZDINX-NEXT: ret
673689
;
674690
; RV64IZFINXZDINX-LABEL: test_frexp_v4f32_v4i32:
@@ -1080,34 +1096,41 @@ define <4 x float> @test_frexp_v4f32_v4i32_only_use_fract(<4 x float> %a) nounwi
10801096
define <4 x i32> @test_frexp_v4f32_v4i32_only_use_exp(<4 x float> %a) nounwind {
10811097
; RV32IFD-LABEL: test_frexp_v4f32_v4i32_only_use_exp:
10821098
; RV32IFD: # %bb.0:
1083-
; RV32IFD-NEXT: addi sp, sp, -32
1084-
; RV32IFD-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
1085-
; RV32IFD-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
1086-
; RV32IFD-NEXT: fsd fs0, 16(sp) # 8-byte Folded Spill
1087-
; RV32IFD-NEXT: fsd fs1, 8(sp) # 8-byte Folded Spill
1088-
; RV32IFD-NEXT: fsd fs2, 0(sp) # 8-byte Folded Spill
1089-
; RV32IFD-NEXT: fmv.s fs0, fa2
1090-
; RV32IFD-NEXT: fmv.s fs1, fa1
1091-
; RV32IFD-NEXT: fmv.s fs2, fa0
1099+
; RV32IFD-NEXT: addi sp, sp, -48
1100+
; RV32IFD-NEXT: sw ra, 44(sp) # 4-byte Folded Spill
1101+
; RV32IFD-NEXT: sw s0, 40(sp) # 4-byte Folded Spill
1102+
; RV32IFD-NEXT: fsd fs0, 32(sp) # 8-byte Folded Spill
1103+
; RV32IFD-NEXT: fsd fs1, 24(sp) # 8-byte Folded Spill
1104+
; RV32IFD-NEXT: fsd fs2, 16(sp) # 8-byte Folded Spill
1105+
; RV32IFD-NEXT: fmv.s fs0, fa3
1106+
; RV32IFD-NEXT: fmv.s fs1, fa2
1107+
; RV32IFD-NEXT: fmv.s fs2, fa1
10921108
; RV32IFD-NEXT: mv s0, a0
1093-
; RV32IFD-NEXT: addi a0, a0, 12
1094-
; RV32IFD-NEXT: fmv.s fa0, fa3
1109+
; RV32IFD-NEXT: mv a0, sp
10951110
; RV32IFD-NEXT: call frexpf
1096-
; RV32IFD-NEXT: addi a0, s0, 8
1097-
; RV32IFD-NEXT: fmv.s fa0, fs0
1111+
; RV32IFD-NEXT: addi a0, sp, 4
1112+
; RV32IFD-NEXT: fmv.s fa0, fs2
10981113
; RV32IFD-NEXT: call frexpf
1099-
; RV32IFD-NEXT: addi a0, s0, 4
1114+
; RV32IFD-NEXT: addi a0, sp, 8
11001115
; RV32IFD-NEXT: fmv.s fa0, fs1
11011116
; RV32IFD-NEXT: call frexpf
1102-
; RV32IFD-NEXT: fmv.s fa0, fs2
1103-
; RV32IFD-NEXT: mv a0, s0
1117+
; RV32IFD-NEXT: addi a0, sp, 12
1118+
; RV32IFD-NEXT: fmv.s fa0, fs0
11041119
; RV32IFD-NEXT: call frexpf
1105-
; RV32IFD-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
1106-
; RV32IFD-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
1107-
; RV32IFD-NEXT: fld fs0, 16(sp) # 8-byte Folded Reload
1108-
; RV32IFD-NEXT: fld fs1, 8(sp) # 8-byte Folded Reload
1109-
; RV32IFD-NEXT: fld fs2, 0(sp) # 8-byte Folded Reload
1110-
; RV32IFD-NEXT: addi sp, sp, 32
1120+
; RV32IFD-NEXT: lw a0, 0(sp)
1121+
; RV32IFD-NEXT: lw a1, 4(sp)
1122+
; RV32IFD-NEXT: lw a2, 8(sp)
1123+
; RV32IFD-NEXT: lw a3, 12(sp)
1124+
; RV32IFD-NEXT: sw a0, 0(s0)
1125+
; RV32IFD-NEXT: sw a1, 4(s0)
1126+
; RV32IFD-NEXT: sw a2, 8(s0)
1127+
; RV32IFD-NEXT: sw a3, 12(s0)
1128+
; RV32IFD-NEXT: lw ra, 44(sp) # 4-byte Folded Reload
1129+
; RV32IFD-NEXT: lw s0, 40(sp) # 4-byte Folded Reload
1130+
; RV32IFD-NEXT: fld fs0, 32(sp) # 8-byte Folded Reload
1131+
; RV32IFD-NEXT: fld fs1, 24(sp) # 8-byte Folded Reload
1132+
; RV32IFD-NEXT: fld fs2, 16(sp) # 8-byte Folded Reload
1133+
; RV32IFD-NEXT: addi sp, sp, 48
11111134
; RV32IFD-NEXT: ret
11121135
;
11131136
; RV64IFD-LABEL: test_frexp_v4f32_v4i32_only_use_exp:
@@ -1151,34 +1174,43 @@ define <4 x i32> @test_frexp_v4f32_v4i32_only_use_exp(<4 x float> %a) nounwind {
11511174
;
11521175
; RV32IZFINXZDINX-LABEL: test_frexp_v4f32_v4i32_only_use_exp:
11531176
; RV32IZFINXZDINX: # %bb.0:
1154-
; RV32IZFINXZDINX-NEXT: addi sp, sp, -32
1155-
; RV32IZFINXZDINX-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
1156-
; RV32IZFINXZDINX-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
1157-
; RV32IZFINXZDINX-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
1158-
; RV32IZFINXZDINX-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
1159-
; RV32IZFINXZDINX-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
1160-
; RV32IZFINXZDINX-NEXT: mv s0, a3
1161-
; RV32IZFINXZDINX-NEXT: mv s1, a2
1162-
; RV32IZFINXZDINX-NEXT: mv s2, a1
1177+
; RV32IZFINXZDINX-NEXT: addi sp, sp, -48
1178+
; RV32IZFINXZDINX-NEXT: sw ra, 44(sp) # 4-byte Folded Spill
1179+
; RV32IZFINXZDINX-NEXT: sw s0, 40(sp) # 4-byte Folded Spill
1180+
; RV32IZFINXZDINX-NEXT: sw s1, 36(sp) # 4-byte Folded Spill
1181+
; RV32IZFINXZDINX-NEXT: sw s2, 32(sp) # 4-byte Folded Spill
1182+
; RV32IZFINXZDINX-NEXT: sw s3, 28(sp) # 4-byte Folded Spill
1183+
; RV32IZFINXZDINX-NEXT: mv s0, a4
1184+
; RV32IZFINXZDINX-NEXT: mv s1, a3
1185+
; RV32IZFINXZDINX-NEXT: mv s2, a2
1186+
; RV32IZFINXZDINX-NEXT: mv a2, a1
11631187
; RV32IZFINXZDINX-NEXT: mv s3, a0
1164-
; RV32IZFINXZDINX-NEXT: addi a1, a0, 12
1165-
; RV32IZFINXZDINX-NEXT: mv a0, a4
1188+
; RV32IZFINXZDINX-NEXT: addi a1, sp, 12
1189+
; RV32IZFINXZDINX-NEXT: mv a0, a2
11661190
; RV32IZFINXZDINX-NEXT: call frexpf
1167-
; RV32IZFINXZDINX-NEXT: addi a1, s3, 8
1168-
; RV32IZFINXZDINX-NEXT: mv a0, s0
1191+
; RV32IZFINXZDINX-NEXT: addi a1, sp, 16
1192+
; RV32IZFINXZDINX-NEXT: mv a0, s2
11691193
; RV32IZFINXZDINX-NEXT: call frexpf
1170-
; RV32IZFINXZDINX-NEXT: addi a1, s3, 4
1194+
; RV32IZFINXZDINX-NEXT: addi a1, sp, 20
11711195
; RV32IZFINXZDINX-NEXT: mv a0, s1
11721196
; RV32IZFINXZDINX-NEXT: call frexpf
1173-
; RV32IZFINXZDINX-NEXT: mv a0, s2
1174-
; RV32IZFINXZDINX-NEXT: mv a1, s3
1197+
; RV32IZFINXZDINX-NEXT: addi a1, sp, 24
1198+
; RV32IZFINXZDINX-NEXT: mv a0, s0
11751199
; RV32IZFINXZDINX-NEXT: call frexpf
1176-
; RV32IZFINXZDINX-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
1177-
; RV32IZFINXZDINX-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
1178-
; RV32IZFINXZDINX-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
1179-
; RV32IZFINXZDINX-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
1180-
; RV32IZFINXZDINX-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
1181-
; RV32IZFINXZDINX-NEXT: addi sp, sp, 32
1200+
; RV32IZFINXZDINX-NEXT: lw a0, 12(sp)
1201+
; RV32IZFINXZDINX-NEXT: lw a1, 16(sp)
1202+
; RV32IZFINXZDINX-NEXT: lw a2, 20(sp)
1203+
; RV32IZFINXZDINX-NEXT: lw a3, 24(sp)
1204+
; RV32IZFINXZDINX-NEXT: sw a0, 0(s3)
1205+
; RV32IZFINXZDINX-NEXT: sw a1, 4(s3)
1206+
; RV32IZFINXZDINX-NEXT: sw a2, 8(s3)
1207+
; RV32IZFINXZDINX-NEXT: sw a3, 12(s3)
1208+
; RV32IZFINXZDINX-NEXT: lw ra, 44(sp) # 4-byte Folded Reload
1209+
; RV32IZFINXZDINX-NEXT: lw s0, 40(sp) # 4-byte Folded Reload
1210+
; RV32IZFINXZDINX-NEXT: lw s1, 36(sp) # 4-byte Folded Reload
1211+
; RV32IZFINXZDINX-NEXT: lw s2, 32(sp) # 4-byte Folded Reload
1212+
; RV32IZFINXZDINX-NEXT: lw s3, 28(sp) # 4-byte Folded Reload
1213+
; RV32IZFINXZDINX-NEXT: addi sp, sp, 48
11821214
; RV32IZFINXZDINX-NEXT: ret
11831215
;
11841216
; RV64IZFINXZDINX-LABEL: test_frexp_v4f32_v4i32_only_use_exp:

llvm/test/CodeGen/X86/llvm.frexp.ll

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -325,27 +325,28 @@ define { <4 x float>, <4 x i32> } @test_frexp_v4f32_v4i32(<4 x float> %a) {
325325
;
326326
; WIN32-LABEL: test_frexp_v4f32_v4i32:
327327
; WIN32: # %bb.0:
328+
; WIN32-NEXT: pushl %edi
328329
; WIN32-NEXT: pushl %esi
329-
; WIN32-NEXT: subl $44, %esp
330+
; WIN32-NEXT: subl $60, %esp
330331
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %esi
331-
; WIN32-NEXT: leal 24(%esi), %eax
332+
; WIN32-NEXT: leal {{[0-9]+}}(%esp), %eax
332333
; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
333334
; WIN32-NEXT: flds {{[0-9]+}}(%esp)
334335
; WIN32-NEXT: fstpl (%esp)
335336
; WIN32-NEXT: calll _frexp
336337
; WIN32-NEXT: fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
337-
; WIN32-NEXT: leal 20(%esi), %eax
338+
; WIN32-NEXT: leal {{[0-9]+}}(%esp), %eax
338339
; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
339340
; WIN32-NEXT: flds {{[0-9]+}}(%esp)
340341
; WIN32-NEXT: fstpl (%esp)
341342
; WIN32-NEXT: calll _frexp
342343
; WIN32-NEXT: fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
343-
; WIN32-NEXT: leal 16(%esi), %eax
344+
; WIN32-NEXT: leal {{[0-9]+}}(%esp), %eax
344345
; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
345346
; WIN32-NEXT: flds {{[0-9]+}}(%esp)
346347
; WIN32-NEXT: fstpl (%esp)
347348
; WIN32-NEXT: calll _frexp
348-
; WIN32-NEXT: leal 28(%esi), %eax
349+
; WIN32-NEXT: leal {{[0-9]+}}(%esp), %eax
349350
; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
350351
; WIN32-NEXT: flds {{[0-9]+}}(%esp)
351352
; WIN32-NEXT: fstpl (%esp)
@@ -360,13 +361,22 @@ define { <4 x float>, <4 x i32> } @test_frexp_v4f32_v4i32(<4 x float> %a) {
360361
; WIN32-NEXT: flds {{[0-9]+}}(%esp)
361362
; WIN32-NEXT: flds {{[0-9]+}}(%esp)
362363
; WIN32-NEXT: flds {{[0-9]+}}(%esp)
364+
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %eax
365+
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %ecx
366+
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %edx
367+
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %edi
368+
; WIN32-NEXT: movl %edi, 28(%esi)
369+
; WIN32-NEXT: movl %edx, 24(%esi)
370+
; WIN32-NEXT: movl %ecx, 20(%esi)
371+
; WIN32-NEXT: movl %eax, 16(%esi)
363372
; WIN32-NEXT: fstps 12(%esi)
364373
; WIN32-NEXT: fstps 8(%esi)
365374
; WIN32-NEXT: fstps 4(%esi)
366375
; WIN32-NEXT: fstps (%esi)
367376
; WIN32-NEXT: movl %esi, %eax
368-
; WIN32-NEXT: addl $44, %esp
377+
; WIN32-NEXT: addl $60, %esp
369378
; WIN32-NEXT: popl %esi
379+
; WIN32-NEXT: popl %edi
370380
; WIN32-NEXT: retl
371381
%result = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %a)
372382
ret { <4 x float>, <4 x i32> } %result
@@ -489,35 +499,46 @@ define <4 x i32> @test_frexp_v4f32_v4i32_only_use_exp(<4 x float> %a) {
489499
;
490500
; WIN32-LABEL: test_frexp_v4f32_v4i32_only_use_exp:
491501
; WIN32: # %bb.0:
502+
; WIN32-NEXT: pushl %edi
492503
; WIN32-NEXT: pushl %esi
493-
; WIN32-NEXT: subl $12, %esp
504+
; WIN32-NEXT: subl $28, %esp
494505
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %esi
495-
; WIN32-NEXT: leal 8(%esi), %eax
506+
; WIN32-NEXT: leal {{[0-9]+}}(%esp), %eax
496507
; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
497508
; WIN32-NEXT: flds {{[0-9]+}}(%esp)
498509
; WIN32-NEXT: fstpl (%esp)
499510
; WIN32-NEXT: calll _frexp
500511
; WIN32-NEXT: fstp %st(0)
501-
; WIN32-NEXT: leal 4(%esi), %eax
512+
; WIN32-NEXT: leal {{[0-9]+}}(%esp), %eax
502513
; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
503514
; WIN32-NEXT: flds {{[0-9]+}}(%esp)
504515
; WIN32-NEXT: fstpl (%esp)
505516
; WIN32-NEXT: calll _frexp
506517
; WIN32-NEXT: fstp %st(0)
507-
; WIN32-NEXT: leal 12(%esi), %eax
518+
; WIN32-NEXT: leal {{[0-9]+}}(%esp), %eax
508519
; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
509520
; WIN32-NEXT: flds {{[0-9]+}}(%esp)
510521
; WIN32-NEXT: fstpl (%esp)
511522
; WIN32-NEXT: calll _frexp
512523
; WIN32-NEXT: fstp %st(0)
513-
; WIN32-NEXT: movl %esi, {{[0-9]+}}(%esp)
524+
; WIN32-NEXT: leal {{[0-9]+}}(%esp), %eax
525+
; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
514526
; WIN32-NEXT: flds {{[0-9]+}}(%esp)
515527
; WIN32-NEXT: fstpl (%esp)
516528
; WIN32-NEXT: calll _frexp
517529
; WIN32-NEXT: fstp %st(0)
530+
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %eax
531+
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %ecx
532+
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %edx
533+
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %edi
534+
; WIN32-NEXT: movl %edi, 12(%esi)
535+
; WIN32-NEXT: movl %edx, 8(%esi)
536+
; WIN32-NEXT: movl %ecx, 4(%esi)
537+
; WIN32-NEXT: movl %eax, (%esi)
518538
; WIN32-NEXT: movl %esi, %eax
519-
; WIN32-NEXT: addl $12, %esp
539+
; WIN32-NEXT: addl $28, %esp
520540
; WIN32-NEXT: popl %esi
541+
; WIN32-NEXT: popl %edi
521542
; WIN32-NEXT: retl
522543
%result = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %a)
523544
%result.1 = extractvalue { <4 x float>, <4 x i32> } %result, 1

0 commit comments

Comments
 (0)