Skip to content

Commit dc92067

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

File tree

4 files changed

+292
-202
lines changed

4 files changed

+292
-202
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2518,7 +2518,9 @@ 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+
const Value *PointerValue =
2522+
dyn_cast_or_null<const Value *>(ST->getPointerInfo().V);
2523+
if (CallRetResNo == ResNo || !ST->isSimple() || !PointerValue ||
25222524
ST->getAddressSpace() != 0 ||
25232525
ST->getAlign() <
25242526
getDataLayout().getABITypeAlign(StoreType->getScalarType()) ||

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

Lines changed: 113 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp --version 2
22
; RUN: llc -mtriple=riscv32 -mattr=+d \
33
; RUN: -verify-machineinstrs -target-abi=ilp32d < %s \
44
; RUN: | FileCheck -check-prefix=RV32IFD %s
@@ -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:

0 commit comments

Comments
 (0)