Skip to content

Commit a1b6990

Browse files
committed
Add swift async test
1 parent 7e05ecd commit a1b6990

File tree

2 files changed

+61
-8
lines changed

2 files changed

+61
-8
lines changed

llvm/lib/Target/AArch64/AArch64PrologueEpilogue.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1435,6 +1435,17 @@ void AArch64EpilogueEmitter::emitEpilogue() {
14351435
--SEHEpilogueStartI;
14361436
}
14371437

1438+
// Determine the ranges of SVE callee-saves. This is done before emitting any
1439+
// code at the end of the epilogue (for Swift async), which can get in the way
1440+
// of finding SVE callee-saves with CalleeSavesAboveFrameRecord.
1441+
auto [PPR, ZPR] = getSVEStackFrameSizes();
1442+
auto [PPRRange, ZPRRange] = partitionSVECS(
1443+
MBB,
1444+
SVELayout == SVEStackLayout::CalleeSavesAboveFrameRecord
1445+
? MBB.getFirstTerminator()
1446+
: FirstGPRRestoreI,
1447+
PPR.CalleeSavesSize, ZPR.CalleeSavesSize, /*IsEpilogue=*/true);
1448+
14381449
if (HasFP && AFI->hasSwiftAsyncContext())
14391450
emitSwiftAsyncContextFramePointer(EpilogueEndI, DL);
14401451

@@ -1457,14 +1468,6 @@ void AArch64EpilogueEmitter::emitEpilogue() {
14571468
NumBytes -= PrologueSaveSize;
14581469
assert(NumBytes >= 0 && "Negative stack allocation size!?");
14591470

1460-
auto [PPR, ZPR] = getSVEStackFrameSizes();
1461-
auto [PPRRange, ZPRRange] = partitionSVECS(
1462-
MBB,
1463-
SVELayout == SVEStackLayout::CalleeSavesAboveFrameRecord
1464-
? MBB.getFirstTerminator()
1465-
: FirstGPRRestoreI,
1466-
PPR.CalleeSavesSize, ZPR.CalleeSavesSize, /*IsEpilogue=*/true);
1467-
14681471
StackOffset SVECalleeSavesSize = ZPR.CalleeSavesSize + PPR.CalleeSavesSize;
14691472
StackOffset SVEStackSize =
14701473
SVECalleeSavesSize + PPR.LocalsSize + ZPR.LocalsSize;

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

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1560,3 +1560,53 @@ define tailcc void @f15(double %d, <vscale x 4 x i32> %vs, [9 x i64], i32 %i) {
15601560
store i32 %i, ptr %a
15611561
ret void
15621562
}
1563+
1564+
declare ptr @llvm.swift.async.context.addr()
1565+
1566+
define void @f16(ptr swiftasync %ctx, <vscale x 2 x i64> %foo) {
1567+
; CHECK-LABEL: f16:
1568+
; CHECK: .seh_proc f16
1569+
; CHECK-NEXT: // %bb.0:
1570+
; CHECK-NEXT: orr x29, x29, #0x1000000000000000
1571+
; CHECK-NEXT: .seh_nop
1572+
; CHECK-NEXT: addvl sp, sp, #-1
1573+
; CHECK-NEXT: .seh_allocz 1
1574+
; CHECK-NEXT: str z8, [sp] // 16-byte Folded Spill
1575+
; CHECK-NEXT: .seh_save_zreg z8, 0
1576+
; CHECK-NEXT: sub sp, sp, #32
1577+
; CHECK-NEXT: .seh_stackalloc 32
1578+
; CHECK-NEXT: stp x29, x30, [sp, #8] // 16-byte Folded Spill
1579+
; CHECK-NEXT: .seh_save_fplr 8
1580+
; CHECK-NEXT: str x22, [sp]
1581+
; CHECK-NEXT: .seh_nop
1582+
; CHECK-NEXT: add x29, sp, #8
1583+
; CHECK-NEXT: .seh_add_fp 8
1584+
; CHECK-NEXT: .seh_endprologue
1585+
; CHECK-NEXT: sub sp, sp, #16
1586+
; CHECK-NEXT: //APP
1587+
; CHECK-NEXT: //NO_APP
1588+
; CHECK-NEXT: ldr x8, [x22]
1589+
; CHECK-NEXT: stur x8, [x29, #-8]
1590+
; CHECK-NEXT: .seh_startepilogue
1591+
; CHECK-NEXT: add sp, sp, #16
1592+
; CHECK-NEXT: .seh_stackalloc 16
1593+
; CHECK-NEXT: ldp x29, x30, [sp, #8] // 16-byte Folded Reload
1594+
; CHECK-NEXT: add sp, sp, #32
1595+
; CHECK-NEXT: .seh_stackalloc 32
1596+
; CHECK-NEXT: .seh_save_fplr 8
1597+
; CHECK-NEXT: ldr z8, [sp] // 16-byte Folded Reload
1598+
; CHECK-NEXT: .seh_save_zreg z8, 0
1599+
; CHECK-NEXT: and x29, x29, #0xefffffffffffffff
1600+
; CHECK-NEXT: .seh_nop
1601+
; CHECK-NEXT: addvl sp, sp, #1
1602+
; CHECK-NEXT: .seh_allocz 1
1603+
; CHECK-NEXT: .seh_endepilogue
1604+
; CHECK-NEXT: ret
1605+
; CHECK-NEXT: .seh_endfunclet
1606+
; CHECK-NEXT: .seh_endproc
1607+
tail call void asm sideeffect "", "~{z8}"()
1608+
%1 = load ptr, ptr %ctx, align 8
1609+
%2 = tail call ptr @llvm.swift.async.context.addr()
1610+
store ptr %1, ptr %2, align 8
1611+
ret void
1612+
}

0 commit comments

Comments
 (0)