Skip to content

Commit 8a233c8

Browse files
committed
Fix handling of "CSR" references.
1 parent 54ed0b6 commit 8a233c8

File tree

2 files changed

+84
-2
lines changed

2 files changed

+84
-2
lines changed

llvm/lib/Target/AArch64/AArch64FrameLowering.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@
4444
// | |
4545
// |-----------------------------------|
4646
// | |
47+
// | (Win64 only) callee-saved SVE reg |
48+
// | |
49+
// |-----------------------------------|
50+
// | |
4751
// | callee-saved gpr registers | <--.
4852
// | | | On Darwin platforms these
4953
// |- - - - - - - - - - - - - - - - - -| | callee saves are swapped,
@@ -2877,11 +2881,11 @@ StackOffset AArch64FrameLowering::resolveFrameOffsetReference(
28772881
StackOffset SVECalleeSavedStack =
28782882
StackOffset::getScalable(AFI->getSVECalleeSavedStackSize());
28792883
if (UseFP) {
2880-
if (!(isFixed || isCSR))
2884+
if (!isFixed)
28812885
ScalableOffset = SVECalleeSavedStack - SVEStackSize;
28822886
else
28832887
ScalableOffset = SVECalleeSavedStack;
2884-
} else if (!UseFP && (isFixed || isCSR)) {
2888+
} else if (!UseFP && isFixed) {
28852889
ScalableOffset = SVEStackSize;
28862890
}
28872891
} else {

llvm/test/CodeGen/AArch64/win-sve.ll

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1228,3 +1228,81 @@ define void @f10(i64 %n, <vscale x 2 x i64> %x) "frame-pointer"="all" {
12281228
call void @g10(ptr %p1, ptr %p2)
12291229
ret void
12301230
}
1231+
1232+
; Check handling of alloca allocated into CSR space, no frame pointer.
1233+
define i32 @f11(double %d, <vscale x 4 x i32> %vs) "aarch64_pstate_sm_compatible" {
1234+
; CHECK-LABEL: f11:
1235+
; CHECK: .seh_proc f11
1236+
; CHECK-NEXT: // %bb.0: // %entry
1237+
; CHECK-NEXT: addvl sp, sp, #-1
1238+
; CHECK-NEXT: .seh_allocz 1
1239+
; CHECK-NEXT: str z8, [sp] // 16-byte Folded Spill
1240+
; CHECK-NEXT: .seh_save_zreg z8, 0
1241+
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
1242+
; CHECK-NEXT: .seh_save_reg_x x30, 16
1243+
; CHECK-NEXT: .seh_endprologue
1244+
; CHECK-NEXT: mov w0, wzr
1245+
; CHECK-NEXT: //APP
1246+
; CHECK-NEXT: //NO_APP
1247+
; CHECK-NEXT: str d0, [sp, #8]
1248+
; CHECK-NEXT: .seh_startepilogue
1249+
; CHECK-NEXT: ldr x30, [sp] // 8-byte Folded Reload
1250+
; CHECK-NEXT: .seh_save_reg x30, 0
1251+
; CHECK-NEXT: add sp, sp, #16
1252+
; CHECK-NEXT: .seh_stackalloc 16
1253+
; CHECK-NEXT: ldr z8, [sp] // 16-byte Folded Reload
1254+
; CHECK-NEXT: .seh_save_zreg z8, 0
1255+
; CHECK-NEXT: addvl sp, sp, #1
1256+
; CHECK-NEXT: .seh_allocz 1
1257+
; CHECK-NEXT: .seh_endepilogue
1258+
; CHECK-NEXT: ret
1259+
; CHECK-NEXT: .seh_endfunclet
1260+
; CHECK-NEXT: .seh_endproc
1261+
entry:
1262+
%a = alloca double
1263+
tail call void asm sideeffect "", "~{d8}"() #1
1264+
store double %d, ptr %a
1265+
ret i32 0
1266+
}
1267+
1268+
; Check handling of alloca allocated into CSR space, with frame pointer.
1269+
define i32 @f12(double %d, <vscale x 4 x i32> %vs) "frame-pointer"="all" {
1270+
; CHECK-LABEL: f12:
1271+
; CHECK: .seh_proc f12
1272+
; CHECK-NEXT: // %bb.0: // %entry
1273+
; CHECK-NEXT: addvl sp, sp, #-1
1274+
; CHECK-NEXT: .seh_allocz 1
1275+
; CHECK-NEXT: str z8, [sp] // 16-byte Folded Spill
1276+
; CHECK-NEXT: .seh_save_zreg z8, 0
1277+
; CHECK-NEXT: str x28, [sp, #-32]! // 8-byte Folded Spill
1278+
; CHECK-NEXT: .seh_save_reg_x x28, 32
1279+
; CHECK-NEXT: stp x29, x30, [sp, #8] // 16-byte Folded Spill
1280+
; CHECK-NEXT: .seh_save_fplr 8
1281+
; CHECK-NEXT: add x29, sp, #8
1282+
; CHECK-NEXT: .seh_add_fp 8
1283+
; CHECK-NEXT: .seh_endprologue
1284+
; CHECK-NEXT: mov w0, wzr
1285+
; CHECK-NEXT: //APP
1286+
; CHECK-NEXT: //NO_APP
1287+
; CHECK-NEXT: str d0, [x29, #16]
1288+
; CHECK-NEXT: .seh_startepilogue
1289+
; CHECK-NEXT: ldp x29, x30, [sp, #8] // 16-byte Folded Reload
1290+
; CHECK-NEXT: .seh_save_fplr 8
1291+
; CHECK-NEXT: ldr x28, [sp] // 8-byte Folded Reload
1292+
; CHECK-NEXT: .seh_save_reg x28, 0
1293+
; CHECK-NEXT: add sp, sp, #32
1294+
; CHECK-NEXT: .seh_stackalloc 32
1295+
; CHECK-NEXT: ldr z8, [sp] // 16-byte Folded Reload
1296+
; CHECK-NEXT: .seh_save_zreg z8, 0
1297+
; CHECK-NEXT: addvl sp, sp, #1
1298+
; CHECK-NEXT: .seh_allocz 1
1299+
; CHECK-NEXT: .seh_endepilogue
1300+
; CHECK-NEXT: ret
1301+
; CHECK-NEXT: .seh_endfunclet
1302+
; CHECK-NEXT: .seh_endproc
1303+
entry:
1304+
%a = alloca double
1305+
tail call void asm sideeffect "", "~{d8},~{x28}"() #1
1306+
store double %d, ptr %a
1307+
ret i32 0
1308+
}

0 commit comments

Comments
 (0)