Skip to content

Commit e864f0c

Browse files
committed
Actually fix handling of "CSR" references.
Previous version didn't non-CSR SVE allocations correctly.
1 parent 8a233c8 commit e864f0c

File tree

2 files changed

+101
-7
lines changed

2 files changed

+101
-7
lines changed

llvm/lib/Target/AArch64/AArch64FrameLowering.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2881,12 +2881,15 @@ StackOffset AArch64FrameLowering::resolveFrameOffsetReference(
28812881
StackOffset SVECalleeSavedStack =
28822882
StackOffset::getScalable(AFI->getSVECalleeSavedStackSize());
28832883
if (UseFP) {
2884-
if (!isFixed)
2885-
ScalableOffset = SVECalleeSavedStack - SVEStackSize;
2886-
else
2884+
if (isFixed)
28872885
ScalableOffset = SVECalleeSavedStack;
2888-
} else if (!UseFP && isFixed) {
2889-
ScalableOffset = SVEStackSize;
2886+
else if (!isCSR)
2887+
ScalableOffset = SVECalleeSavedStack - SVEStackSize;
2888+
} else {
2889+
if (isFixed)
2890+
ScalableOffset = SVEStackSize;
2891+
else if (isCSR)
2892+
ScalableOffset = SVEStackSize - SVECalleeSavedStack;
28902893
}
28912894
} else {
28922895
if (UseFP && !(isFixed || isCSR))

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

Lines changed: 93 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1265,15 +1265,58 @@ entry:
12651265
ret i32 0
12661266
}
12671267

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" {
1268+
define i32 @f12(double %d, <vscale x 4 x i32> %vs) "aarch64_pstate_sm_compatible" {
12701269
; CHECK-LABEL: f12:
12711270
; CHECK: .seh_proc f12
12721271
; CHECK-NEXT: // %bb.0: // %entry
12731272
; CHECK-NEXT: addvl sp, sp, #-1
12741273
; CHECK-NEXT: .seh_allocz 1
12751274
; CHECK-NEXT: str z8, [sp] // 16-byte Folded Spill
12761275
; CHECK-NEXT: .seh_save_zreg z8, 0
1276+
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
1277+
; CHECK-NEXT: .seh_save_reg_x x30, 16
1278+
; CHECK-NEXT: addvl sp, sp, #-1
1279+
; CHECK-NEXT: .seh_allocz 1
1280+
; CHECK-NEXT: .seh_endprologue
1281+
; CHECK-NEXT: addvl x8, sp, #1
1282+
; CHECK-NEXT: mov w0, wzr
1283+
; CHECK-NEXT: //APP
1284+
; CHECK-NEXT: //NO_APP
1285+
; CHECK-NEXT: str d0, [x8, #8]
1286+
; CHECK-NEXT: str d0, [sp]
1287+
; CHECK-NEXT: .seh_startepilogue
1288+
; CHECK-NEXT: addvl sp, sp, #1
1289+
; CHECK-NEXT: .seh_allocz 1
1290+
; CHECK-NEXT: ldr x30, [sp] // 8-byte Folded Reload
1291+
; CHECK-NEXT: .seh_save_reg x30, 0
1292+
; CHECK-NEXT: add sp, sp, #16
1293+
; CHECK-NEXT: .seh_stackalloc 16
1294+
; CHECK-NEXT: ldr z8, [sp] // 16-byte Folded Reload
1295+
; CHECK-NEXT: .seh_save_zreg z8, 0
1296+
; CHECK-NEXT: addvl sp, sp, #1
1297+
; CHECK-NEXT: .seh_allocz 1
1298+
; CHECK-NEXT: .seh_endepilogue
1299+
; CHECK-NEXT: ret
1300+
; CHECK-NEXT: .seh_endfunclet
1301+
; CHECK-NEXT: .seh_endproc
1302+
entry:
1303+
%a = alloca double
1304+
%b = alloca <vscale x 16 x i8>
1305+
tail call void asm sideeffect "", "~{d8}"() #1
1306+
store double %d, ptr %a
1307+
store double %d, ptr %b
1308+
ret i32 0
1309+
}
1310+
1311+
; Check handling of alloca allocated into CSR space, with frame pointer.
1312+
define i32 @f13(double %d, <vscale x 4 x i32> %vs) "frame-pointer"="all" {
1313+
; CHECK-LABEL: f13:
1314+
; CHECK: .seh_proc f13
1315+
; CHECK-NEXT: // %bb.0: // %entry
1316+
; CHECK-NEXT: addvl sp, sp, #-1
1317+
; CHECK-NEXT: .seh_allocz 1
1318+
; CHECK-NEXT: str z8, [sp] // 16-byte Folded Spill
1319+
; CHECK-NEXT: .seh_save_zreg z8, 0
12771320
; CHECK-NEXT: str x28, [sp, #-32]! // 8-byte Folded Spill
12781321
; CHECK-NEXT: .seh_save_reg_x x28, 32
12791322
; CHECK-NEXT: stp x29, x30, [sp, #8] // 16-byte Folded Spill
@@ -1306,3 +1349,51 @@ entry:
13061349
store double %d, ptr %a
13071350
ret i32 0
13081351
}
1352+
1353+
define i32 @f14(double %d, <vscale x 4 x i32> %vs) "frame-pointer"="all" {
1354+
; CHECK-LABEL: f14:
1355+
; CHECK: .seh_proc f14
1356+
; CHECK-NEXT: // %bb.0: // %entry
1357+
; CHECK-NEXT: addvl sp, sp, #-1
1358+
; CHECK-NEXT: .seh_allocz 1
1359+
; CHECK-NEXT: str z8, [sp] // 16-byte Folded Spill
1360+
; CHECK-NEXT: .seh_save_zreg z8, 0
1361+
; CHECK-NEXT: str x28, [sp, #-32]! // 8-byte Folded Spill
1362+
; CHECK-NEXT: .seh_save_reg_x x28, 32
1363+
; CHECK-NEXT: stp x29, x30, [sp, #8] // 16-byte Folded Spill
1364+
; CHECK-NEXT: .seh_save_fplr 8
1365+
; CHECK-NEXT: add x29, sp, #8
1366+
; CHECK-NEXT: .seh_add_fp 8
1367+
; CHECK-NEXT: .seh_endprologue
1368+
; CHECK-NEXT: addvl sp, sp, #-1
1369+
; CHECK-NEXT: addvl x8, x29, #-1
1370+
; CHECK-NEXT: mov w0, wzr
1371+
; CHECK-NEXT: //APP
1372+
; CHECK-NEXT: //NO_APP
1373+
; CHECK-NEXT: str d0, [x29, #16]
1374+
; CHECK-NEXT: stur d0, [x8, #-8]
1375+
; CHECK-NEXT: .seh_startepilogue
1376+
; CHECK-NEXT: addvl sp, sp, #1
1377+
; CHECK-NEXT: .seh_allocz 1
1378+
; CHECK-NEXT: ldp x29, x30, [sp, #8] // 16-byte Folded Reload
1379+
; CHECK-NEXT: .seh_save_fplr 8
1380+
; CHECK-NEXT: ldr x28, [sp] // 8-byte Folded Reload
1381+
; CHECK-NEXT: .seh_save_reg x28, 0
1382+
; CHECK-NEXT: add sp, sp, #32
1383+
; CHECK-NEXT: .seh_stackalloc 32
1384+
; CHECK-NEXT: ldr z8, [sp] // 16-byte Folded Reload
1385+
; CHECK-NEXT: .seh_save_zreg z8, 0
1386+
; CHECK-NEXT: addvl sp, sp, #1
1387+
; CHECK-NEXT: .seh_allocz 1
1388+
; CHECK-NEXT: .seh_endepilogue
1389+
; CHECK-NEXT: ret
1390+
; CHECK-NEXT: .seh_endfunclet
1391+
; CHECK-NEXT: .seh_endproc
1392+
entry:
1393+
%a = alloca double
1394+
%b = alloca <vscale x 16 x i8>
1395+
tail call void asm sideeffect "", "~{d8},~{x28}"() #1
1396+
store double %d, ptr %a
1397+
store double %d, ptr %b
1398+
ret i32 0
1399+
}

0 commit comments

Comments
 (0)