Skip to content

Commit 73eaa2b

Browse files
committed
[AArch64][SVE] Remove isSVECC() in favour of changing the calling convention
We essentially had two different ways of setting the calling convention for a function: the proper calling convention and a target flag to override the calling convention. Removing the flag in favour of setting the calling convention is an NFC except in some (somewhat unsupported) cases. The cases that needed changes were: 1. Removing the "SVE_VectorCall is unsupported on Darwin" failure - The previous method of setting the SVE calling convention means that it has been possible to use the SVE CC on Darwin for a while now (and some tests depend on that). - It is unclear if this really should be allowed or not (but does pose a question for SME functions on Darwin that have SVE params) 2. Removing a Windows SVE test that used varargs and SVE arguments - This is not supported (and already fails LowerCall) 3. Updating the checks for a Windows + exceptions SVE test Note: The updated logic intends to closely match the code in `AArch64TargetLowering::LowerCall` (which also changes the CC).
1 parent a9dacb1 commit 73eaa2b

File tree

7 files changed

+60
-133
lines changed

7 files changed

+60
-133
lines changed

llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1356,8 +1356,7 @@ void AArch64AsmPrinter::emitFunctionEntryLabel() {
13561356
if (TT.isOSBinFormatELF() &&
13571357
(MF->getFunction().getCallingConv() == CallingConv::AArch64_VectorCall ||
13581358
MF->getFunction().getCallingConv() ==
1359-
CallingConv::AArch64_SVE_VectorCall ||
1360-
MF->getInfo<AArch64FunctionInfo>()->isSVECC())) {
1359+
CallingConv::AArch64_SVE_VectorCall)) {
13611360
auto *TS =
13621361
static_cast<AArch64TargetStreamer *>(OutStreamer->getTargetStreamer());
13631362
TS->emitDirectiveVariantPCS(CurrentFnSym);

llvm/lib/Target/AArch64/AArch64FrameLowering.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -339,10 +339,10 @@ static bool requiresSaveVG(const MachineFunction &MF);
339339
// on the stack. This function is safe to be called before callee-saves or
340340
// object offsets have been determined.
341341
static bool isLikelyToHaveSVEStack(MachineFunction &MF) {
342-
auto *AFI = MF.getInfo<AArch64FunctionInfo>();
343-
if (AFI->isSVECC())
342+
if (MF.getFunction().getCallingConv() == CallingConv::AArch64_SVE_VectorCall)
344343
return true;
345344

345+
auto *AFI = MF.getInfo<AArch64FunctionInfo>();
346346
if (AFI->hasCalculatedStackSizeSVE())
347347
return bool(getSVEStackSize(MF));
348348

@@ -3121,12 +3121,14 @@ static unsigned getPrologueDeath(MachineFunction &MF, unsigned Reg) {
31213121
static bool produceCompactUnwindFrame(MachineFunction &MF) {
31223122
const AArch64Subtarget &Subtarget = MF.getSubtarget<AArch64Subtarget>();
31233123
AttributeList Attrs = MF.getFunction().getAttributes();
3124-
AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
31253124
return Subtarget.isTargetMachO() &&
31263125
!(Subtarget.getTargetLowering()->supportSwiftError() &&
31273126
Attrs.hasAttrSomewhere(Attribute::SwiftError)) &&
31283127
MF.getFunction().getCallingConv() != CallingConv::SwiftTail &&
3129-
!requiresSaveVG(MF) && !AFI->isSVECC();
3128+
MF.getFunction().getCallingConv() !=
3129+
CallingConv::AArch64_SVE_VectorCall &&
3130+
3131+
!requiresSaveVG(MF);
31303132
}
31313133

31323134
static bool invalidateWindowsRegisterPairing(unsigned Reg1, unsigned Reg2,

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "llvm/ADT/APInt.h"
2525
#include "llvm/ADT/ArrayRef.h"
2626
#include "llvm/ADT/STLExtras.h"
27+
#include "llvm/ADT/ScopeExit.h"
2728
#include "llvm/ADT/SmallSet.h"
2829
#include "llvm/ADT/SmallVector.h"
2930
#include "llvm/ADT/SmallVectorExtras.h"
@@ -7837,24 +7838,44 @@ SDValue AArch64TargetLowering::LowerFormalArguments(
78377838
const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &DL,
78387839
SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
78397840
MachineFunction &MF = DAG.getMachineFunction();
7840-
const Function &F = MF.getFunction();
7841+
Function &F = MF.getFunction();
78417842
MachineFrameInfo &MFI = MF.getFrameInfo();
78427843
bool IsWin64 =
78437844
Subtarget->isCallingConvWin64(F.getCallingConv(), F.isVarArg());
78447845
bool StackViaX4 = CallConv == CallingConv::ARM64EC_Thunk_X64 ||
78457846
(isVarArg && Subtarget->isWindowsArm64EC());
78467847
AArch64FunctionInfo *FuncInfo = MF.getInfo<AArch64FunctionInfo>();
78477848

7848-
SmallVector<ISD::OutputArg, 4> Outs;
7849-
GetReturnInfo(CallConv, F.getReturnType(), F.getAttributes(), Outs,
7850-
DAG.getTargetLoweringInfo(), MF.getDataLayout());
7851-
if (any_of(Outs, [](ISD::OutputArg &Out){ return Out.VT.isScalableVector(); }))
7852-
FuncInfo->setIsSVECC(true);
7853-
78547849
// Assign locations to all of the incoming arguments.
78557850
SmallVector<CCValAssign, 16> ArgLocs;
78567851
CCState CCInfo(CallConv, isVarArg, MF, ArgLocs, *DAG.getContext());
78577852

7853+
// This logic is consistent with AArch64TargetLowering::LowerCall.
7854+
// The `ShouldUpgradeToSVECC` flag can be when analyzing arguments.
7855+
bool ShouldUpgradeToSVECC = false;
7856+
auto _ = make_scope_exit([&] {
7857+
if (CallConv != CallingConv::C && CallConv != CallingConv::Fast)
7858+
return;
7859+
7860+
if (!ShouldUpgradeToSVECC) {
7861+
// If the flag was not set, check if the return value requires the SVE CC.
7862+
SmallVector<ISD::OutputArg, 4> Outs;
7863+
GetReturnInfo(CallConv, F.getReturnType(), F.getAttributes(), Outs,
7864+
DAG.getTargetLoweringInfo(), MF.getDataLayout());
7865+
ShouldUpgradeToSVECC = any_of(
7866+
Outs, [](ISD::OutputArg &Out) { return Out.VT.isScalableVector(); });
7867+
}
7868+
7869+
if (!ShouldUpgradeToSVECC)
7870+
return;
7871+
7872+
if (isVarArg)
7873+
report_fatal_error("Passing/returning SVE types to variadic functions "
7874+
"is currently not supported");
7875+
7876+
F.setCallingConv(CallingConv::AArch64_SVE_VectorCall);
7877+
});
7878+
78587879
// At this point, Ins[].VT may already be promoted to i32. To correctly
78597880
// handle passing i8 as i8 instead of i32 on stack, we pass in both i32 and
78607881
// i8 to CC_AArch64_AAPCS with i32 being ValVT and i8 being LocVT.
@@ -7942,14 +7963,14 @@ SDValue AArch64TargetLowering::LowerFormalArguments(
79427963
RC = &AArch64::FPR128RegClass;
79437964
else if (RegVT.isScalableVector() &&
79447965
RegVT.getVectorElementType() == MVT::i1) {
7945-
FuncInfo->setIsSVECC(true);
79467966
RC = &AArch64::PPRRegClass;
7967+
ShouldUpgradeToSVECC = true;
79477968
} else if (RegVT == MVT::aarch64svcount) {
7948-
FuncInfo->setIsSVECC(true);
79497969
RC = &AArch64::PPRRegClass;
7970+
ShouldUpgradeToSVECC = true;
79507971
} else if (RegVT.isScalableVector()) {
7951-
FuncInfo->setIsSVECC(true);
79527972
RC = &AArch64::ZPRRegClass;
7973+
ShouldUpgradeToSVECC = true;
79537974
} else
79547975
llvm_unreachable("RegVT not supported by FORMAL_ARGUMENTS Lowering");
79557976

@@ -8597,14 +8618,6 @@ bool AArch64TargetLowering::isEligibleForTailCallOptimization(
85978618
CallAttrs.caller().hasStreamingBody())
85988619
return false;
85998620

8600-
// Functions using the C or Fast calling convention that have an SVE signature
8601-
// preserve more registers and should assume the SVE_VectorCall CC.
8602-
// The check for matching callee-saved regs will determine whether it is
8603-
// eligible for TCO.
8604-
if ((CallerCC == CallingConv::C || CallerCC == CallingConv::Fast) &&
8605-
MF.getInfo<AArch64FunctionInfo>()->isSVECC())
8606-
CallerCC = CallingConv::AArch64_SVE_VectorCall;
8607-
86088621
bool CCMatch = CallerCC == CalleeCC;
86098622

86108623
// When using the Windows calling convention on a non-windows OS, we want

llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -209,10 +209,6 @@ class AArch64FunctionInfo final : public MachineFunctionInfo {
209209

210210
bool IsMTETagged = false;
211211

212-
/// The function has Scalable Vector or Scalable Predicate register argument
213-
/// or return type
214-
bool IsSVECC = false;
215-
216212
/// The frame-index for the TPIDR2 object used for lazy saves.
217213
TPIDR2Object TPIDR2;
218214

@@ -280,9 +276,6 @@ class AArch64FunctionInfo final : public MachineFunctionInfo {
280276
int64_t getStreamingVGIdx() const { return StreamingVGIdx; };
281277
void setStreamingVGIdx(unsigned FrameIdx) { StreamingVGIdx = FrameIdx; };
282278

283-
bool isSVECC() const { return IsSVECC; };
284-
void setIsSVECC(bool s) { IsSVECC = s; };
285-
286279
TPIDR2Object &getTPIDR2Obj() { return TPIDR2; }
287280

288281
void initializeBaseYamlFields(const yaml::AArch64FunctionInfo &YamlMFI);

llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,6 @@ AArch64RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
104104
if (MF->getFunction().getCallingConv() ==
105105
CallingConv::AArch64_SVE_VectorCall)
106106
return CSR_Win_AArch64_SVE_AAPCS_SaveList;
107-
if (MF->getInfo<AArch64FunctionInfo>()->isSVECC())
108-
return CSR_Win_AArch64_SVE_AAPCS_SaveList;
109107
return CSR_Win_AArch64_AAPCS_SaveList;
110108
}
111109
if (MF->getFunction().getCallingConv() == CallingConv::AArch64_VectorCall)
@@ -148,8 +146,6 @@ AArch64RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
148146
// This is for OSes other than Windows; Windows is a separate case further
149147
// above.
150148
return CSR_AArch64_AAPCS_X18_SaveList;
151-
if (MF->getInfo<AArch64FunctionInfo>()->isSVECC())
152-
return CSR_AArch64_SVE_AAPCS_SaveList;
153149
return CSR_AArch64_AAPCS_SaveList;
154150
}
155151

@@ -165,8 +161,7 @@ AArch64RegisterInfo::getDarwinCalleeSavedRegs(const MachineFunction *MF) const {
165161
if (MF->getFunction().getCallingConv() == CallingConv::AArch64_VectorCall)
166162
return CSR_Darwin_AArch64_AAVPCS_SaveList;
167163
if (MF->getFunction().getCallingConv() == CallingConv::AArch64_SVE_VectorCall)
168-
report_fatal_error(
169-
"Calling convention SVE_VectorCall is unsupported on Darwin.");
164+
return CSR_Darwin_AArch64_SVE_AAPCS_SaveList;
170165
if (MF->getFunction().getCallingConv() ==
171166
CallingConv::AArch64_SME_ABI_Support_Routines_PreserveMost_From_X0)
172167
report_fatal_error(
@@ -205,8 +200,6 @@ AArch64RegisterInfo::getDarwinCalleeSavedRegs(const MachineFunction *MF) const {
205200
return CSR_Darwin_AArch64_RT_AllRegs_SaveList;
206201
if (MF->getFunction().getCallingConv() == CallingConv::Win64)
207202
return CSR_Darwin_AArch64_AAPCS_Win64_SaveList;
208-
if (MF->getInfo<AArch64FunctionInfo>()->isSVECC())
209-
return CSR_Darwin_AArch64_SVE_AAPCS_SaveList;
210203
return CSR_Darwin_AArch64_AAPCS_SaveList;
211204
}
212205

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
; RUN: sed -e "s,CC,cfguard_checkcc,g" %s | not --crash llc -mtriple=arm64-apple-darwin -o - 2>&1 | FileCheck %s --check-prefix=CFGUARD
2-
; RUN: sed -e "s,CC,aarch64_sve_vector_pcs,g" %s | not --crash llc -mtriple=arm64-apple-darwin -o - 2>&1 | FileCheck %s --check-prefix=SVE_VECTOR_PCS
32

43
define CC void @f0() {
54
unreachable
65
}
76

87
; CFGUARD: Calling convention CFGuard_Check is unsupported on Darwin.
9-
; SVE_VECTOR_PCS: Calling convention SVE_VectorCall is unsupported on Darwin.

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

Lines changed: 21 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -784,8 +784,6 @@ define void @f6(<vscale x 2 x i64> %x, [8 x i64] %pad, i64 %n9) personality ptr
784784
; CHECK-NEXT: .seh_proc f6
785785
; CHECK-NEXT: .seh_handler __CxxFrameHandler3, @unwind, @except
786786
; CHECK-NEXT: // %bb.0:
787-
; CHECK-NEXT: sub sp, sp, #16
788-
; CHECK-NEXT: .seh_stackalloc 16
789787
; CHECK-NEXT: addvl sp, sp, #-18
790788
; CHECK-NEXT: .seh_allocz 18
791789
; CHECK-NEXT: str p4, [sp] // 2-byte Folded Spill
@@ -853,21 +851,21 @@ define void @f6(<vscale x 2 x i64> %x, [8 x i64] %pad, i64 %n9) personality ptr
853851
; CHECK-NEXT: add x29, sp, #16
854852
; CHECK-NEXT: .seh_add_fp 16
855853
; CHECK-NEXT: .seh_endprologue
856-
; CHECK-NEXT: sub sp, sp, #64
854+
; CHECK-NEXT: sub sp, sp, #80
857855
; CHECK-NEXT: mov x0, #-2 // =0xfffffffffffffffe
858856
; CHECK-NEXT: addvl x8, x29, #18
859857
; CHECK-NEXT: mov x19, sp
860-
; CHECK-NEXT: stur x0, [x8, #16]
858+
; CHECK-NEXT: stur x0, [x8]
861859
; CHECK-NEXT: addvl x8, x29, #18
862-
; CHECK-NEXT: ldr x1, [x8, #32]
863-
; CHECK-NEXT: .Ltmp0:
860+
; CHECK-NEXT: ldr x1, [x8, #16]
861+
; CHECK-NEXT: .Ltmp0: // EH_LABEL
864862
; CHECK-NEXT: add x0, x19, #0
865863
; CHECK-NEXT: bl g6
866-
; CHECK-NEXT: .Ltmp1:
864+
; CHECK-NEXT: .Ltmp1: // EH_LABEL
867865
; CHECK-NEXT: // %bb.1: // %invoke.cont
868866
; CHECK-NEXT: .seh_startepilogue
869-
; CHECK-NEXT: add sp, sp, #64
870-
; CHECK-NEXT: .seh_stackalloc 64
867+
; CHECK-NEXT: add sp, sp, #80
868+
; CHECK-NEXT: .seh_stackalloc 80
871869
; CHECK-NEXT: ldp x29, x30, [sp, #16] // 16-byte Folded Reload
872870
; CHECK-NEXT: .seh_save_fplr 16
873871
; CHECK-NEXT: ldr x28, [sp, #8] // 8-byte Folded Reload
@@ -932,12 +930,8 @@ define void @f6(<vscale x 2 x i64> %x, [8 x i64] %pad, i64 %n9) personality ptr
932930
; CHECK-NEXT: .seh_save_preg p14, 10
933931
; CHECK-NEXT: ldr p15, [sp, #11, mul vl] // 2-byte Folded Reload
934932
; CHECK-NEXT: .seh_save_preg p15, 11
935-
; CHECK-NEXT: add sp, sp, #16
936-
; CHECK-NEXT: .seh_stackalloc 16
937933
; CHECK-NEXT: addvl sp, sp, #18
938934
; CHECK-NEXT: .seh_allocz 18
939-
; CHECK-NEXT: add sp, sp, #16
940-
; CHECK-NEXT: .seh_stackalloc 16
941935
; CHECK-NEXT: .seh_endepilogue
942936
; CHECK-NEXT: ret
943937
; CHECK-NEXT: .seh_endfunclet
@@ -1160,64 +1154,6 @@ define void @f8(<vscale x 2 x i64> %v) {
11601154
ret void
11611155
}
11621156

1163-
define void @f9(<vscale x 2 x i64> %v, ...) {
1164-
; CHECK-LABEL: f9:
1165-
; CHECK: .seh_proc f9
1166-
; CHECK-NEXT: // %bb.0:
1167-
; CHECK-NEXT: sub sp, sp, #64
1168-
; CHECK-NEXT: .seh_stackalloc 64
1169-
; CHECK-NEXT: addvl sp, sp, #-1
1170-
; CHECK-NEXT: .seh_allocz 1
1171-
; CHECK-NEXT: str z8, [sp] // 16-byte Folded Spill
1172-
; CHECK-NEXT: .seh_save_zreg z8, 0
1173-
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
1174-
; CHECK-NEXT: .seh_save_reg_x x30, 16
1175-
; CHECK-NEXT: .seh_endprologue
1176-
; CHECK-NEXT: addvl x8, sp, #1
1177-
; CHECK-NEXT: add x9, sp, #8
1178-
; CHECK-NEXT: str x2, [x8, #32]
1179-
; CHECK-NEXT: addvl x8, sp, #1
1180-
; CHECK-NEXT: str x0, [x8, #16]
1181-
; CHECK-NEXT: addvl x8, sp, #1
1182-
; CHECK-NEXT: str x1, [x8, #24]
1183-
; CHECK-NEXT: addvl x8, sp, #1
1184-
; CHECK-NEXT: str x3, [x8, #40]
1185-
; CHECK-NEXT: addvl x8, sp, #1
1186-
; CHECK-NEXT: str x4, [x8, #48]
1187-
; CHECK-NEXT: addvl x8, sp, #1
1188-
; CHECK-NEXT: str x5, [x8, #56]
1189-
; CHECK-NEXT: addvl x8, sp, #1
1190-
; CHECK-NEXT: str x6, [x8, #64]
1191-
; CHECK-NEXT: addvl x8, sp, #1
1192-
; CHECK-NEXT: str x7, [x8, #72]
1193-
; CHECK-NEXT: add x8, sp, #16
1194-
; CHECK-NEXT: addvl x8, x8, #1
1195-
; CHECK-NEXT: str x8, [sp, #8]
1196-
; CHECK-NEXT: //APP
1197-
; CHECK-NEXT: //NO_APP
1198-
; CHECK-NEXT: .seh_startepilogue
1199-
; CHECK-NEXT: ldr x30, [sp] // 8-byte Folded Reload
1200-
; CHECK-NEXT: .seh_save_reg x30, 0
1201-
; CHECK-NEXT: add sp, sp, #16
1202-
; CHECK-NEXT: .seh_stackalloc 16
1203-
; CHECK-NEXT: ldr z8, [sp] // 16-byte Folded Reload
1204-
; CHECK-NEXT: .seh_save_zreg z8, 0
1205-
; CHECK-NEXT: add sp, sp, #64
1206-
; CHECK-NEXT: .seh_stackalloc 64
1207-
; CHECK-NEXT: addvl sp, sp, #1
1208-
; CHECK-NEXT: .seh_allocz 1
1209-
; CHECK-NEXT: add sp, sp, #64
1210-
; CHECK-NEXT: .seh_stackalloc 64
1211-
; CHECK-NEXT: .seh_endepilogue
1212-
; CHECK-NEXT: ret
1213-
; CHECK-NEXT: .seh_endfunclet
1214-
; CHECK-NEXT: .seh_endproc
1215-
%va_list = alloca ptr
1216-
call void @llvm.va_start.p0(ptr %va_list)
1217-
call void asm "", "r,~{d8},~{memory}"(ptr %va_list)
1218-
ret void
1219-
}
1220-
12211157
declare void @g10(ptr,ptr)
12221158
define void @f10(i64 %n, <vscale x 2 x i64> %x) "frame-pointer"="all" {
12231159
; CHECK-LABEL: f10:
@@ -1546,40 +1482,33 @@ define tailcc void @f15(double %d, <vscale x 4 x i32> %vs, [9 x i64], i32 %i) {
15461482
; CHECK-LABEL: f15:
15471483
; CHECK: .seh_proc f15
15481484
; CHECK-NEXT: // %bb.0:
1549-
; CHECK-NEXT: addvl sp, sp, #-1
1550-
; CHECK-NEXT: .seh_allocz 1
1551-
; CHECK-NEXT: str z8, [sp] // 16-byte Folded Spill
1552-
; CHECK-NEXT: .seh_save_zreg z8, 0
1553-
; CHECK-NEXT: str x28, [sp, #-16]! // 8-byte Folded Spill
1554-
; CHECK-NEXT: .seh_save_reg_x x28, 16
1485+
; CHECK-NEXT: str x28, [sp, #-32]! // 8-byte Folded Spill
1486+
; CHECK-NEXT: .seh_save_reg_x x28, 32
15551487
; CHECK-NEXT: str x30, [sp, #8] // 8-byte Folded Spill
15561488
; CHECK-NEXT: .seh_save_reg x30, 8
1557-
; CHECK-NEXT: sub sp, sp, #16
1558-
; CHECK-NEXT: .seh_stackalloc 16
1489+
; CHECK-NEXT: str d8, [sp, #16] // 8-byte Folded Spill
1490+
; CHECK-NEXT: .seh_save_freg d8, 16
15591491
; CHECK-NEXT: addvl sp, sp, #-1
15601492
; CHECK-NEXT: .seh_allocz 1
15611493
; CHECK-NEXT: .seh_endprologue
1562-
; CHECK-NEXT: addvl x8, sp, #2
1494+
; CHECK-NEXT: addvl x8, sp, #1
1495+
; CHECK-NEXT: addvl x9, sp, #1
15631496
; CHECK-NEXT: //APP
15641497
; CHECK-NEXT: //NO_APP
1565-
; CHECK-NEXT: stp d0, d0, [sp, #8]
15661498
; CHECK-NEXT: ldr w8, [x8, #104]
1567-
; CHECK-NEXT: str w8, [sp, #8]
1499+
; CHECK-NEXT: str d0, [x9, #24]
1500+
; CHECK-NEXT: addvl x9, sp, #1
1501+
; CHECK-NEXT: str d0, [sp]
1502+
; CHECK-NEXT: str w8, [x9, #24]
15681503
; CHECK-NEXT: .seh_startepilogue
15691504
; CHECK-NEXT: addvl sp, sp, #1
15701505
; CHECK-NEXT: .seh_allocz 1
1571-
; CHECK-NEXT: add sp, sp, #16
1572-
; CHECK-NEXT: .seh_stackalloc 16
1506+
; CHECK-NEXT: ldr d8, [sp, #16] // 8-byte Folded Reload
1507+
; CHECK-NEXT: .seh_save_freg d8, 16
15731508
; CHECK-NEXT: ldr x30, [sp, #8] // 8-byte Folded Reload
15741509
; CHECK-NEXT: .seh_save_reg x30, 8
1575-
; CHECK-NEXT: ldr x28, [sp] // 8-byte Folded Reload
1576-
; CHECK-NEXT: .seh_save_reg x28, 0
1577-
; CHECK-NEXT: add sp, sp, #16
1578-
; CHECK-NEXT: .seh_stackalloc 16
1579-
; CHECK-NEXT: ldr z8, [sp] // 16-byte Folded Reload
1580-
; CHECK-NEXT: .seh_save_zreg z8, 0
1581-
; CHECK-NEXT: addvl sp, sp, #1
1582-
; CHECK-NEXT: .seh_allocz 1
1510+
; CHECK-NEXT: ldr x28, [sp], #32 // 8-byte Folded Reload
1511+
; CHECK-NEXT: .seh_save_reg_x x28, 32
15831512
; CHECK-NEXT: add sp, sp, #80
15841513
; CHECK-NEXT: .seh_stackalloc 80
15851514
; CHECK-NEXT: .seh_endepilogue

0 commit comments

Comments
 (0)