Skip to content

Commit 1814b32

Browse files
committed
Address review comments.
Fixed issue lower tailcc and related constructs. Code style changes.
1 parent e864f0c commit 1814b32

File tree

2 files changed

+67
-18
lines changed

2 files changed

+67
-18
lines changed

llvm/lib/Target/AArch64/AArch64FrameLowering.cpp

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2171,34 +2171,34 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
21712171
}
21722172

21732173
StackOffset SVECalleeSavesSize = {}, SVELocalsSize = SVEStackSize;
2174-
MachineBasicBlock::iterator CalleeSavesBegin = MBBI, CalleeSavesEnd = MBBI;
2174+
MachineBasicBlock::iterator CalleeSavesEnd = MBBI;
2175+
2176+
StackOffset CFAOffset =
2177+
StackOffset::getFixed((int64_t)MFI.getStackSize() - NumBytes);
21752178

21762179
// Process the SVE callee-saves to determine what space needs to be
21772180
// allocated.
21782181
if (int64_t CalleeSavedSize = AFI->getSVECalleeSavedStackSize()) {
21792182
LLVM_DEBUG(dbgs() << "SVECalleeSavedStackSize = " << CalleeSavedSize
21802183
<< "\n");
2184+
SVECalleeSavesSize = StackOffset::getScalable(CalleeSavedSize);
2185+
SVELocalsSize = SVEStackSize - SVECalleeSavesSize;
21812186
// Find callee save instructions in frame.
2182-
CalleeSavesBegin = MBBI;
2187+
// Note: With FPAfterSVECalleeSaves the callee saves have already been
2188+
// allocated.
21832189
if (!FPAfterSVECalleeSaves) {
2190+
MachineBasicBlock::iterator CalleeSavesBegin = MBBI;
21842191
assert(IsSVECalleeSave(CalleeSavesBegin) && "Unexpected instruction");
21852192
while (IsSVECalleeSave(MBBI) && MBBI != MBB.getFirstTerminator())
21862193
++MBBI;
2187-
}
2188-
CalleeSavesEnd = MBBI;
2194+
CalleeSavesEnd = MBBI;
21892195

2190-
SVECalleeSavesSize = StackOffset::getScalable(CalleeSavedSize);
2191-
SVELocalsSize = SVEStackSize - SVECalleeSavesSize;
2192-
}
2193-
2194-
// Allocate space for the callee saves (if any).
2195-
StackOffset CFAOffset =
2196-
StackOffset::getFixed((int64_t)MFI.getStackSize() - NumBytes);
2197-
StackOffset LocalsSize = SVELocalsSize + StackOffset::getFixed(NumBytes);
2198-
if (!FPAfterSVECalleeSaves) {
2199-
allocateStackSpace(MBB, CalleeSavesBegin, 0, SVECalleeSavesSize, false,
2200-
nullptr, EmitAsyncCFI && !HasFP, CFAOffset,
2201-
MFI.hasVarSizedObjects() || LocalsSize);
2196+
StackOffset LocalsSize = SVELocalsSize + StackOffset::getFixed(NumBytes);
2197+
// Allocate space for the callee saves (if any).
2198+
allocateStackSpace(MBB, CalleeSavesBegin, 0, SVECalleeSavesSize, false,
2199+
nullptr, EmitAsyncCFI && !HasFP, CFAOffset,
2200+
MFI.hasVarSizedObjects() || LocalsSize);
2201+
}
22022202
}
22032203
CFAOffset += SVECalleeSavesSize;
22042204

@@ -2379,7 +2379,7 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
23792379
// Assume we can't combine the last pop with the sp restore.
23802380
bool CombineAfterCSRBump = false;
23812381
if (FPAfterSVECalleeSaves) {
2382-
AfterCSRPopSize = FixedObject;
2382+
AfterCSRPopSize += FixedObject;
23832383
} else if (!CombineSPBump && PrologueSaveSize != 0) {
23842384
MachineBasicBlock::iterator Pop = std::prev(MBB.getFirstTerminator());
23852385
while (Pop->getOpcode() == TargetOpcode::CFI_INSTRUCTION ||
@@ -2693,7 +2693,7 @@ AArch64FrameLowering::getFrameIndexReferenceFromSP(const MachineFunction &MF,
26932693
if (MFI.getStackID(FI) == TargetStackID::ScalableVector) {
26942694
if (FPAfterSVECalleeSaves &&
26952695
-ObjectOffset <= (int64_t)AFI->getSVECalleeSavedStackSize())
2696-
return StackOffset::get(0, ObjectOffset);
2696+
return StackOffset::getScalable(ObjectOffset);
26972697
return StackOffset::get(-((int64_t)AFI->getCalleeSavedStackSize()),
26982698
ObjectOffset);
26992699
}

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

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1397,3 +1397,52 @@ entry:
13971397
store double %d, ptr %b
13981398
ret i32 0
13991399
}
1400+
1401+
define tailcc void @f15(double %d, <vscale x 4 x i32> %vs, [9 x i64]) {
1402+
; CHECK-LABEL: f15:
1403+
; CHECK: .seh_proc f15
1404+
; CHECK-NEXT: // %bb.0:
1405+
; CHECK-NEXT: addvl sp, sp, #-1
1406+
; CHECK-NEXT: .seh_allocz 1
1407+
; CHECK-NEXT: str z8, [sp] // 16-byte Folded Spill
1408+
; CHECK-NEXT: .seh_save_zreg z8, 0
1409+
; CHECK-NEXT: str x28, [sp, #-16]! // 8-byte Folded Spill
1410+
; CHECK-NEXT: .seh_save_reg_x x28, 16
1411+
; CHECK-NEXT: str x30, [sp, #8] // 8-byte Folded Spill
1412+
; CHECK-NEXT: .seh_save_reg x30, 8
1413+
; CHECK-NEXT: sub sp, sp, #16
1414+
; CHECK-NEXT: .seh_stackalloc 16
1415+
; CHECK-NEXT: addvl sp, sp, #-1
1416+
; CHECK-NEXT: .seh_allocz 1
1417+
; CHECK-NEXT: .seh_endprologue
1418+
; CHECK-NEXT: //APP
1419+
; CHECK-NEXT: //NO_APP
1420+
; CHECK-NEXT: stp d0, d0, [sp, #8]
1421+
; CHECK-NEXT: .seh_startepilogue
1422+
; CHECK-NEXT: addvl sp, sp, #1
1423+
; CHECK-NEXT: .seh_allocz 1
1424+
; CHECK-NEXT: add sp, sp, #16
1425+
; CHECK-NEXT: .seh_stackalloc 16
1426+
; CHECK-NEXT: ldr x30, [sp, #8] // 8-byte Folded Reload
1427+
; CHECK-NEXT: .seh_save_reg x30, 8
1428+
; CHECK-NEXT: ldr x28, [sp] // 8-byte Folded Reload
1429+
; CHECK-NEXT: .seh_save_reg x28, 0
1430+
; CHECK-NEXT: add sp, sp, #16
1431+
; CHECK-NEXT: .seh_stackalloc 16
1432+
; CHECK-NEXT: ldr z8, [sp] // 16-byte Folded Reload
1433+
; CHECK-NEXT: .seh_save_zreg z8, 0
1434+
; CHECK-NEXT: addvl sp, sp, #1
1435+
; CHECK-NEXT: .seh_allocz 1
1436+
; CHECK-NEXT: add sp, sp, #80
1437+
; CHECK-NEXT: .seh_stackalloc 80
1438+
; CHECK-NEXT: .seh_endepilogue
1439+
; CHECK-NEXT: ret
1440+
; CHECK-NEXT: .seh_endfunclet
1441+
; CHECK-NEXT: .seh_endproc
1442+
%a = alloca double
1443+
%b = alloca <vscale x 16 x i8>
1444+
tail call void asm sideeffect "", "~{d8},~{x28}"() #1
1445+
store double %d, ptr %a
1446+
store double %d, ptr %b
1447+
ret void
1448+
}

0 commit comments

Comments
 (0)