Skip to content

Commit a574ef6

Browse files
[AArch64] Fix incorrect big-endian spill in foldMemoryOperandImpl (#65601)
When an sreg sub-register of a q register was spilled, AArch64InstrInfo::foldMemoryOperandImpl would emit a spill of a d register, which gives the wrong result when the target is big-endian as the following q register fill will put the value in the top half. Fix this by greatly simplifying the existing code for widening the spill to only handle wzr to xzr widening, as the default result we get if the function returns nullptr is already that a widened spill will be emitted.
1 parent 31c2cf1 commit a574ef6

File tree

12 files changed

+515
-246
lines changed

12 files changed

+515
-246
lines changed

llvm/lib/Target/AArch64/AArch64InstrInfo.cpp

Lines changed: 6 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5507,42 +5507,14 @@ MachineInstr *AArch64InstrInfo::foldMemoryOperandImpl(
55075507
//
55085508
// STRXui %xzr, %stack.0
55095509
//
5510-
if (IsSpill && DstMO.isUndef() && SrcReg.isPhysical()) {
5510+
if (IsSpill && DstMO.isUndef() && SrcReg == AArch64::WZR &&
5511+
TRI.getRegSizeInBits(*getRegClass(DstReg)) == 64) {
55115512
assert(SrcMO.getSubReg() == 0 &&
55125513
"Unexpected subreg on physical register");
5513-
const TargetRegisterClass *SpillRC;
5514-
unsigned SpillSubreg;
5515-
switch (DstMO.getSubReg()) {
5516-
default:
5517-
SpillRC = nullptr;
5518-
break;
5519-
case AArch64::sub_32:
5520-
case AArch64::ssub:
5521-
if (AArch64::GPR32RegClass.contains(SrcReg)) {
5522-
SpillRC = &AArch64::GPR64RegClass;
5523-
SpillSubreg = AArch64::sub_32;
5524-
} else if (AArch64::FPR32RegClass.contains(SrcReg)) {
5525-
SpillRC = &AArch64::FPR64RegClass;
5526-
SpillSubreg = AArch64::ssub;
5527-
} else
5528-
SpillRC = nullptr;
5529-
break;
5530-
case AArch64::dsub:
5531-
if (AArch64::FPR64RegClass.contains(SrcReg)) {
5532-
SpillRC = &AArch64::FPR128RegClass;
5533-
SpillSubreg = AArch64::dsub;
5534-
} else
5535-
SpillRC = nullptr;
5536-
break;
5537-
}
5538-
5539-
if (SpillRC)
5540-
if (unsigned WidenedSrcReg =
5541-
TRI.getMatchingSuperReg(SrcReg, SpillSubreg, SpillRC)) {
5542-
storeRegToStackSlot(MBB, InsertPt, WidenedSrcReg, SrcMO.isKill(),
5543-
FrameIndex, SpillRC, &TRI, Register());
5544-
return &*--InsertPt;
5545-
}
5514+
storeRegToStackSlot(MBB, InsertPt, AArch64::XZR, SrcMO.isKill(),
5515+
FrameIndex, &AArch64::GPR64RegClass, &TRI,
5516+
Register());
5517+
return &*--InsertPt;
55465518
}
55475519

55485520
// Handle cases like filling use of:

llvm/test/CodeGen/AArch64/arm64-neon-mul-div.ll

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1486,7 +1486,8 @@ define <2 x float> @frem2f32(<2 x float> %A, <2 x float> %B) {
14861486
; CHECK-NEXT: mov s0, v0.s[1]
14871487
; CHECK-NEXT: mov s1, v1.s[1]
14881488
; CHECK-NEXT: bl fmodf
1489-
; CHECK-NEXT: str d0, [sp, #32] // 16-byte Folded Spill
1489+
; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
1490+
; CHECK-NEXT: str q0, [sp, #32] // 16-byte Folded Spill
14901491
; CHECK-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
14911492
; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0
14921493
; CHECK-NEXT: // kill: def $s1 killed $s1 killed $q1
@@ -1513,7 +1514,8 @@ define <4 x float> @frem4f32(<4 x float> %A, <4 x float> %B) {
15131514
; CHECK-NEXT: mov s0, v0.s[1]
15141515
; CHECK-NEXT: mov s1, v1.s[1]
15151516
; CHECK-NEXT: bl fmodf
1516-
; CHECK-NEXT: str d0, [sp] // 16-byte Folded Spill
1517+
; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
1518+
; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
15171519
; CHECK-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload
15181520
; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0
15191521
; CHECK-NEXT: // kill: def $s1 killed $s1 killed $q1
@@ -1569,6 +1571,7 @@ define <2 x double> @frem2d64(<2 x double> %A, <2 x double> %B) {
15691571
; CHECK-NEXT: mov d0, v0.d[1]
15701572
; CHECK-NEXT: mov d1, v1.d[1]
15711573
; CHECK-NEXT: bl fmod
1574+
; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
15721575
; CHECK-NEXT: str q0, [sp, #32] // 16-byte Folded Spill
15731576
; CHECK-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
15741577
; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0

llvm/test/CodeGen/AArch64/fexplog.ll

Lines changed: 215 additions & 90 deletions
Large diffs are not rendered by default.

llvm/test/CodeGen/AArch64/fold-int-pow2-with-fmul-or-fdiv.ll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ define <4 x float> @fmul_pow2_ldexp_4xfloat(<4 x i32> %i) {
5252
; CHECK-NEON-NEXT: fmov s0, #9.00000000
5353
; CHECK-NEON-NEXT: bl ldexpf
5454
; CHECK-NEON-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
55-
; CHECK-NEON-NEXT: str d0, [sp] // 16-byte Folded Spill
55+
; CHECK-NEON-NEXT: // kill: def $s0 killed $s0 def $q0
56+
; CHECK-NEON-NEXT: str q0, [sp] // 16-byte Folded Spill
5657
; CHECK-NEON-NEXT: fmov s0, #9.00000000
5758
; CHECK-NEON-NEXT: fmov w0, s1
5859
; CHECK-NEON-NEXT: bl ldexpf

llvm/test/CodeGen/AArch64/fpow.ll

Lines changed: 57 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ define <2 x double> @pow_v2f64(<2 x double> %a, <2 x double> %b) {
6666
; CHECK-SD-NEXT: mov d0, v0.d[1]
6767
; CHECK-SD-NEXT: mov d1, v1.d[1]
6868
; CHECK-SD-NEXT: bl pow
69+
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
6970
; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill
7071
; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
7172
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
@@ -92,9 +93,10 @@ define <2 x double> @pow_v2f64(<2 x double> %a, <2 x double> %b) {
9293
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
9394
; CHECK-GI-NEXT: // kill: def $d1 killed $d1 killed $q1
9495
; CHECK-GI-NEXT: bl pow
96+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
9597
; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
96-
; CHECK-GI-NEXT: fmov d0, d8
9798
; CHECK-GI-NEXT: fmov d1, d9
99+
; CHECK-GI-NEXT: fmov d0, d8
98100
; CHECK-GI-NEXT: bl pow
99101
; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload
100102
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
@@ -198,6 +200,7 @@ define <4 x double> @pow_v4f64(<4 x double> %a, <4 x double> %b) {
198200
; CHECK-SD-NEXT: stp q1, q3, [sp, #48] // 32-byte Folded Spill
199201
; CHECK-SD-NEXT: mov d1, v2.d[1]
200202
; CHECK-SD-NEXT: bl pow
203+
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
201204
; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill
202205
; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
203206
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
@@ -211,6 +214,7 @@ define <4 x double> @pow_v4f64(<4 x double> %a, <4 x double> %b) {
211214
; CHECK-SD-NEXT: mov d0, v0.d[1]
212215
; CHECK-SD-NEXT: mov d1, v1.d[1]
213216
; CHECK-SD-NEXT: bl pow
217+
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
214218
; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
215219
; CHECK-SD-NEXT: ldp q0, q1, [sp, #48] // 32-byte Folded Reload
216220
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
@@ -246,19 +250,22 @@ define <4 x double> @pow_v4f64(<4 x double> %a, <4 x double> %b) {
246250
; CHECK-GI-NEXT: // kill: def $d1 killed $d1 killed $q1
247251
; CHECK-GI-NEXT: mov d9, v4.d[1]
248252
; CHECK-GI-NEXT: bl pow
253+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
249254
; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Folded Spill
250-
; CHECK-GI-NEXT: fmov d0, d8
251255
; CHECK-GI-NEXT: fmov d1, d10
256+
; CHECK-GI-NEXT: fmov d0, d8
252257
; CHECK-GI-NEXT: bl pow
258+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
253259
; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
254-
; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload
255260
; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload
256-
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
261+
; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload
257262
; CHECK-GI-NEXT: // kill: def $d1 killed $d1 killed $q1
263+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
258264
; CHECK-GI-NEXT: bl pow
265+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
259266
; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill
260-
; CHECK-GI-NEXT: fmov d0, d9
261267
; CHECK-GI-NEXT: fmov d1, d11
268+
; CHECK-GI-NEXT: fmov d0, d9
262269
; CHECK-GI-NEXT: bl pow
263270
; CHECK-GI-NEXT: ldr q2, [sp, #48] // 16-byte Folded Reload
264271
; CHECK-GI-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
@@ -290,7 +297,8 @@ define <2 x float> @pow_v2f32(<2 x float> %a, <2 x float> %b) {
290297
; CHECK-SD-NEXT: mov s0, v0.s[1]
291298
; CHECK-SD-NEXT: mov s1, v1.s[1]
292299
; CHECK-SD-NEXT: bl powf
293-
; CHECK-SD-NEXT: str d0, [sp, #32] // 16-byte Folded Spill
300+
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
301+
; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill
294302
; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
295303
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
296304
; CHECK-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
@@ -319,9 +327,10 @@ define <2 x float> @pow_v2f32(<2 x float> %a, <2 x float> %b) {
319327
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
320328
; CHECK-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
321329
; CHECK-GI-NEXT: bl powf
322-
; CHECK-GI-NEXT: str d0, [sp] // 16-byte Folded Spill
323-
; CHECK-GI-NEXT: fmov s0, s8
330+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
331+
; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
324332
; CHECK-GI-NEXT: fmov s1, s9
333+
; CHECK-GI-NEXT: fmov s0, s8
325334
; CHECK-GI-NEXT: bl powf
326335
; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload
327336
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
@@ -347,7 +356,8 @@ define <3 x float> @pow_v3f32(<3 x float> %a, <3 x float> %b) {
347356
; CHECK-SD-NEXT: mov s0, v0.s[1]
348357
; CHECK-SD-NEXT: mov s1, v1.s[1]
349358
; CHECK-SD-NEXT: bl powf
350-
; CHECK-SD-NEXT: str d0, [sp] // 16-byte Folded Spill
359+
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
360+
; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
351361
; CHECK-SD-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload
352362
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
353363
; CHECK-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
@@ -387,13 +397,15 @@ define <3 x float> @pow_v3f32(<3 x float> %a, <3 x float> %b) {
387397
; CHECK-GI-NEXT: mov s11, v1.s[2]
388398
; CHECK-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
389399
; CHECK-GI-NEXT: bl powf
390-
; CHECK-GI-NEXT: str d0, [sp, #16] // 16-byte Folded Spill
391-
; CHECK-GI-NEXT: fmov s0, s8
400+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
401+
; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
392402
; CHECK-GI-NEXT: fmov s1, s10
403+
; CHECK-GI-NEXT: fmov s0, s8
393404
; CHECK-GI-NEXT: bl powf
394-
; CHECK-GI-NEXT: str d0, [sp] // 16-byte Folded Spill
395-
; CHECK-GI-NEXT: fmov s0, s9
405+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
406+
; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
396407
; CHECK-GI-NEXT: fmov s1, s11
408+
; CHECK-GI-NEXT: fmov s0, s9
397409
; CHECK-GI-NEXT: bl powf
398410
; CHECK-GI-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload
399411
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
@@ -422,7 +434,8 @@ define <4 x float> @pow_v4f32(<4 x float> %a, <4 x float> %b) {
422434
; CHECK-SD-NEXT: mov s0, v0.s[1]
423435
; CHECK-SD-NEXT: mov s1, v1.s[1]
424436
; CHECK-SD-NEXT: bl powf
425-
; CHECK-SD-NEXT: str d0, [sp] // 16-byte Folded Spill
437+
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
438+
; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
426439
; CHECK-SD-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload
427440
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
428441
; CHECK-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
@@ -475,17 +488,20 @@ define <4 x float> @pow_v4f32(<4 x float> %a, <4 x float> %b) {
475488
; CHECK-GI-NEXT: mov s13, v1.s[3]
476489
; CHECK-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
477490
; CHECK-GI-NEXT: bl powf
478-
; CHECK-GI-NEXT: str d0, [sp, #32] // 16-byte Folded Spill
479-
; CHECK-GI-NEXT: fmov s0, s8
491+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
492+
; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill
480493
; CHECK-GI-NEXT: fmov s1, s11
494+
; CHECK-GI-NEXT: fmov s0, s8
481495
; CHECK-GI-NEXT: bl powf
482-
; CHECK-GI-NEXT: str d0, [sp, #16] // 16-byte Folded Spill
483-
; CHECK-GI-NEXT: fmov s0, s9
496+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
497+
; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
484498
; CHECK-GI-NEXT: fmov s1, s12
499+
; CHECK-GI-NEXT: fmov s0, s9
485500
; CHECK-GI-NEXT: bl powf
486-
; CHECK-GI-NEXT: str d0, [sp] // 16-byte Folded Spill
487-
; CHECK-GI-NEXT: fmov s0, s10
501+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
502+
; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
488503
; CHECK-GI-NEXT: fmov s1, s13
504+
; CHECK-GI-NEXT: fmov s0, s10
489505
; CHECK-GI-NEXT: bl powf
490506
; CHECK-GI-NEXT: ldp q2, q1, [sp, #16] // 32-byte Folded Reload
491507
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
@@ -517,7 +533,8 @@ define <8 x float> @pow_v8f32(<8 x float> %a, <8 x float> %b) {
517533
; CHECK-SD-NEXT: stp q1, q3, [sp, #32] // 32-byte Folded Spill
518534
; CHECK-SD-NEXT: mov s1, v2.s[1]
519535
; CHECK-SD-NEXT: bl powf
520-
; CHECK-SD-NEXT: str d0, [sp, #64] // 16-byte Folded Spill
536+
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
537+
; CHECK-SD-NEXT: str q0, [sp, #64] // 16-byte Folded Spill
521538
; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
522539
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
523540
; CHECK-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
@@ -546,7 +563,8 @@ define <8 x float> @pow_v8f32(<8 x float> %a, <8 x float> %b) {
546563
; CHECK-SD-NEXT: mov s0, v0.s[1]
547564
; CHECK-SD-NEXT: mov s1, v1.s[1]
548565
; CHECK-SD-NEXT: bl powf
549-
; CHECK-SD-NEXT: str d0, [sp, #16] // 16-byte Folded Spill
566+
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
567+
; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
550568
; CHECK-SD-NEXT: ldp q0, q1, [sp, #32] // 32-byte Folded Reload
551569
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
552570
; CHECK-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
@@ -614,32 +632,39 @@ define <8 x float> @pow_v8f32(<8 x float> %a, <8 x float> %b) {
614632
; CHECK-GI-NEXT: mov s2, v3.s[3]
615633
; CHECK-GI-NEXT: stp s2, s5, [sp, #200] // 8-byte Folded Spill
616634
; CHECK-GI-NEXT: bl powf
617-
; CHECK-GI-NEXT: str d0, [sp, #96] // 16-byte Folded Spill
618-
; CHECK-GI-NEXT: fmov s0, s8
635+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
636+
; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Folded Spill
619637
; CHECK-GI-NEXT: fmov s1, s14
638+
; CHECK-GI-NEXT: fmov s0, s8
620639
; CHECK-GI-NEXT: bl powf
621-
; CHECK-GI-NEXT: str d0, [sp, #32] // 16-byte Folded Spill
622-
; CHECK-GI-NEXT: fmov s0, s9
640+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
641+
; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill
623642
; CHECK-GI-NEXT: fmov s1, s15
643+
; CHECK-GI-NEXT: fmov s0, s9
624644
; CHECK-GI-NEXT: bl powf
625-
; CHECK-GI-NEXT: str d0, [sp, #80] // 16-byte Folded Spill
626-
; CHECK-GI-NEXT: fmov s0, s10
645+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
646+
; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Folded Spill
627647
; CHECK-GI-NEXT: fmov s1, s13
648+
; CHECK-GI-NEXT: fmov s0, s10
628649
; CHECK-GI-NEXT: bl powf
629-
; CHECK-GI-NEXT: str d0, [sp, #64] // 16-byte Folded Spill
650+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
651+
; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Folded Spill
630652
; CHECK-GI-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload
631653
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
632654
; CHECK-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
633655
; CHECK-GI-NEXT: bl powf
634656
; CHECK-GI-NEXT: fmov s1, s12
635-
; CHECK-GI-NEXT: str d0, [sp, #16] // 16-byte Folded Spill
657+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
658+
; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
636659
; CHECK-GI-NEXT: ldr s0, [sp, #48] // 4-byte Folded Reload
637660
; CHECK-GI-NEXT: bl powf
638661
; CHECK-GI-NEXT: fmov s1, s11
639-
; CHECK-GI-NEXT: str d0, [sp, #48] // 16-byte Folded Spill
662+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
663+
; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Folded Spill
640664
; CHECK-GI-NEXT: ldr s0, [sp, #112] // 4-byte Folded Reload
641665
; CHECK-GI-NEXT: bl powf
642-
; CHECK-GI-NEXT: str d0, [sp, #112] // 16-byte Folded Spill
666+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
667+
; CHECK-GI-NEXT: str q0, [sp, #112] // 16-byte Folded Spill
643668
; CHECK-GI-NEXT: ldp s1, s0, [sp, #200] // 8-byte Folded Reload
644669
; CHECK-GI-NEXT: bl powf
645670
; CHECK-GI-NEXT: ldp q3, q2, [sp, #16] // 32-byte Folded Reload

0 commit comments

Comments
 (0)