Skip to content

Commit 9fe7aef

Browse files
authored
[CodeGen] Don't check attrs for stack realign (#92564)
shouldRealignStack/canRealignStack are repeatedly called in PEI (through hasStackRealignment). Checking function attributes is expensive, so cache this data in the MachineFrameInfo, which had most data already. This slightly changes the semantics of `MachineFrameInfo::ForcedRealign` to be also true when the `stackrealign` attribute is set.
1 parent dcbd1fb commit 9fe7aef

File tree

3 files changed

+13
-9
lines changed

3 files changed

+13
-9
lines changed

llvm/include/llvm/CodeGen/MachineFrameInfo.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,8 @@ class MachineFrameInfo {
346346

347347
MachineFrameInfo(const MachineFrameInfo &) = delete;
348348

349+
bool isStackRealignable() const { return StackRealignable; }
350+
349351
/// Return true if there are any stack objects in this function.
350352
bool hasStackObjects() const { return !Objects.empty(); }
351353

@@ -603,6 +605,12 @@ class MachineFrameInfo {
603605
/// Make sure the function is at least Align bytes aligned.
604606
void ensureMaxAlignment(Align Alignment);
605607

608+
/// Return true if stack realignment is forced by function attributes or if
609+
/// the stack alignment.
610+
bool shouldRealignStack() const {
611+
return ForcedRealign || MaxAlignment > StackAlignment;
612+
}
613+
606614
/// Return true if this function adjusts the stack -- e.g.,
607615
/// when calling another function. This is only valid during and after
608616
/// prolog/epilog code insertion.

llvm/lib/CodeGen/MachineFunction.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,11 @@ void MachineFunction::init() {
200200
// explicitly asked us not to.
201201
bool CanRealignSP = STI->getFrameLowering()->isStackRealignable() &&
202202
!F.hasFnAttribute("no-realign-stack");
203+
bool ForceRealignSP = F.hasFnAttribute(Attribute::StackAlignment) ||
204+
F.hasFnAttribute("stackrealign");
203205
FrameInfo = new (Allocator) MachineFrameInfo(
204206
getFnStackAlignment(STI, F), /*StackRealignable=*/CanRealignSP,
205-
/*ForcedRealign=*/CanRealignSP &&
206-
F.hasFnAttribute(Attribute::StackAlignment));
207+
/*ForcedRealign=*/ForceRealignSP && CanRealignSP);
207208

208209
setUnsafeStackSize(F, *FrameInfo);
209210

llvm/lib/CodeGen/TargetRegisterInfo.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -474,16 +474,11 @@ bool TargetRegisterInfo::isCalleeSavedPhysReg(
474474
}
475475

476476
bool TargetRegisterInfo::canRealignStack(const MachineFunction &MF) const {
477-
return !MF.getFunction().hasFnAttribute("no-realign-stack");
477+
return MF.getFrameInfo().isStackRealignable();
478478
}
479479

480480
bool TargetRegisterInfo::shouldRealignStack(const MachineFunction &MF) const {
481-
const MachineFrameInfo &MFI = MF.getFrameInfo();
482-
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
483-
const Function &F = MF.getFunction();
484-
return F.hasFnAttribute("stackrealign") ||
485-
(MFI.getMaxAlign() > TFI->getStackAlign()) ||
486-
F.hasFnAttribute(Attribute::StackAlignment);
481+
return MF.getFrameInfo().shouldRealignStack();
487482
}
488483

489484
bool TargetRegisterInfo::regmaskSubsetEqual(const uint32_t *mask0,

0 commit comments

Comments
 (0)