Skip to content

[DataLayout] Change return type of getStackAlignment to MaybeAlign #105478

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 3 additions & 9 deletions llvm/include/llvm/IR/DataLayout.h
Original file line number Diff line number Diff line change
Expand Up @@ -220,15 +220,9 @@ class DataLayout {

bool isIllegalInteger(uint64_t Width) const { return !isLegalInteger(Width); }

/// Returns true if the given alignment exceeds the natural stack alignment.
bool exceedsNaturalStackAlignment(Align Alignment) const {
return StackNaturalAlign && (Alignment > *StackNaturalAlign);
}

Align getStackAlignment() const {
assert(StackNaturalAlign && "StackNaturalAlign must be defined");
return *StackNaturalAlign;
}
/// Returns the natural stack alignment, or MaybeAlign() if one wasn't
/// specified.
MaybeAlign getStackAlignment() const { return StackNaturalAlign; }

unsigned getAllocaAddrSpace() const { return AllocaAddrSpace; }

Expand Down
8 changes: 4 additions & 4 deletions llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9134,8 +9134,8 @@ LegalizerHelper::lowerMemcpy(MachineInstr &MI, Register Dst, Register Src,
// realignment.
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
if (!TRI->hasStackRealignment(MF))
while (NewAlign > Alignment && DL.exceedsNaturalStackAlignment(NewAlign))
NewAlign = NewAlign.previous();
if (MaybeAlign StackAlign = DL.getStackAlignment())
NewAlign = std::min(NewAlign, *StackAlign);

if (NewAlign > Alignment) {
Alignment = NewAlign;
Expand Down Expand Up @@ -9242,8 +9242,8 @@ LegalizerHelper::lowerMemmove(MachineInstr &MI, Register Dst, Register Src,
// realignment.
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
if (!TRI->hasStackRealignment(MF))
while (NewAlign > Alignment && DL.exceedsNaturalStackAlignment(NewAlign))
NewAlign = NewAlign.previous();
if (MaybeAlign StackAlign = DL.getStackAlignment())
NewAlign = std::min(NewAlign, *StackAlign);

if (NewAlign > Alignment) {
Alignment = NewAlign;
Expand Down
12 changes: 6 additions & 6 deletions llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7894,8 +7894,8 @@ static SDValue getMemcpyLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl,
// optimization.
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
if (!TRI->hasStackRealignment(MF))
while (NewAlign > Alignment && DL.exceedsNaturalStackAlignment(NewAlign))
NewAlign = NewAlign.previous();
if (MaybeAlign StackAlign = DL.getStackAlignment())
NewAlign = std::min(NewAlign, *StackAlign);

if (NewAlign > Alignment) {
// Give the stack frame object a larger alignment if needed.
Expand Down Expand Up @@ -8089,8 +8089,8 @@ static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl,
// optimization.
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
if (!TRI->hasStackRealignment(MF))
while (NewAlign > Alignment && DL.exceedsNaturalStackAlignment(NewAlign))
NewAlign = NewAlign.previous();
if (MaybeAlign StackAlign = DL.getStackAlignment())
NewAlign = std::min(NewAlign, *StackAlign);

if (NewAlign > Alignment) {
// Give the stack frame object a larger alignment if needed.
Expand Down Expand Up @@ -8207,8 +8207,8 @@ static SDValue getMemsetStores(SelectionDAG &DAG, const SDLoc &dl,
// optimization.
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
if (!TRI->hasStackRealignment(MF))
while (NewAlign > Alignment && DL.exceedsNaturalStackAlignment(NewAlign))
NewAlign = NewAlign.previous();
if (MaybeAlign StackAlign = DL.getStackAlignment())
NewAlign = std::min(NewAlign, *StackAlign);

if (NewAlign > Alignment) {
// Give the stack frame object a larger alignment if needed.
Expand Down
5 changes: 3 additions & 2 deletions llvm/lib/Target/AArch64/AArch64CallingConvention.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -209,10 +209,11 @@ static bool CC_AArch64_Custom_Block(unsigned &ValNo, MVT &ValVT, MVT &LocVT,
State.AllocateReg(Reg);
}

const Align StackAlign =
const MaybeAlign StackAlign =
State.getMachineFunction().getDataLayout().getStackAlignment();
assert(StackAlign && "data layout string is missing stack alignment");
const Align MemAlign = ArgFlags.getNonZeroMemAlign();
Align SlotAlign = std::min(MemAlign, StackAlign);
Align SlotAlign = std::min(MemAlign, *StackAlign);
if (!Subtarget.isTargetDarwin())
SlotAlign = std::max(SlotAlign, Align(8));

Expand Down
5 changes: 3 additions & 2 deletions llvm/lib/Target/ARM/ARMCallingConv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,9 +190,10 @@ static bool CC_ARM_AAPCS_Custom_Aggregate(unsigned ValNo, MVT ValVT,
// Try to allocate a contiguous block of registers, each of the correct
// size to hold one member.
auto &DL = State.getMachineFunction().getDataLayout();
const Align StackAlign = DL.getStackAlignment();
const MaybeAlign StackAlign = DL.getStackAlignment();
assert(StackAlign && "data layout string is missing stack alignment");
const Align FirstMemberAlign(PendingMembers[0].getExtraInfo());
Align Alignment = std::min(FirstMemberAlign, StackAlign);
Align Alignment = std::min(FirstMemberAlign, *StackAlign);

ArrayRef<MCPhysReg> RegList;
switch (LocVT.SimpleTy) {
Expand Down
14 changes: 9 additions & 5 deletions llvm/lib/Target/ARM/ARMISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2461,8 +2461,9 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,

// Since callee will pop argument stack as a tail call, we must keep the
// popped size 16-byte aligned.
Align StackAlign = DAG.getDataLayout().getStackAlignment();
NumBytes = alignTo(NumBytes, StackAlign);
MaybeAlign StackAlign = DAG.getDataLayout().getStackAlignment();
assert(StackAlign && "data layout string is missing stack alignment");
NumBytes = alignTo(NumBytes, *StackAlign);

// SPDiff will be negative if this tail call requires more space than we
// would automatically have in our incoming argument space. Positive if we
Expand Down Expand Up @@ -4711,8 +4712,9 @@ SDValue ARMTargetLowering::LowerFormalArguments(
if (canGuaranteeTCO(CallConv, TailCallOpt)) {
// The only way to guarantee a tail call is if the callee restores its
// argument area, but it must also keep the stack aligned when doing so.
const DataLayout &DL = DAG.getDataLayout();
StackArgSize = alignTo(StackArgSize, DL.getStackAlignment());
MaybeAlign StackAlign = DAG.getDataLayout().getStackAlignment();
assert(StackAlign && "data layout string is missing stack alignment");
StackArgSize = alignTo(StackArgSize, *StackAlign);

AFI->setArgumentStackToRestore(StackArgSize);
}
Expand Down Expand Up @@ -22030,7 +22032,9 @@ Align ARMTargetLowering::getABIAlignmentForCallingConv(

// Avoid over-aligning vector parameters. It would require realigning the
// stack and waste space for no real benefit.
return std::min(ABITypeAlign, DL.getStackAlignment());
MaybeAlign StackAlign = DL.getStackAlignment();
assert(StackAlign && "data layout string is missing stack alignment");
return std::min(ABITypeAlign, *StackAlign);
}

/// Return true if a type is an AAPCS-VFP homogeneous aggregate or one of
Expand Down
5 changes: 3 additions & 2 deletions llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1189,8 +1189,9 @@ WebAssemblyTargetLowering::LowerCall(CallLoweringInfo &CLI,
if (IsVarArg && NumBytes) {
// For non-fixed arguments, next emit stores to store the argument values
// to the stack buffer at the offsets computed above.
int FI = MF.getFrameInfo().CreateStackObject(NumBytes,
Layout.getStackAlignment(),
MaybeAlign StackAlign = Layout.getStackAlignment();
assert(StackAlign && "data layout string is missing stack alignment");
int FI = MF.getFrameInfo().CreateStackObject(NumBytes, *StackAlign,
/*isSS=*/false);
unsigned ValNo = 0;
SmallVector<SDValue, 8> Chains;
Expand Down
6 changes: 3 additions & 3 deletions llvm/lib/Transforms/IPO/ExpandVariadics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -748,10 +748,10 @@ bool ExpandVariadics::expandCall(Module &M, IRBuilder<> &Builder, CallBase *CB,
// This is an awkward way to guess whether there is a known stack alignment
// without hitting an assert in DL.getStackAlignment, 1024 is an arbitrary
// number likely to be greater than the natural stack alignment.
// TODO: DL.getStackAlignment could return a MaybeAlign instead of assert
Align AllocaAlign = MaxFieldAlign;
if (DL.exceedsNaturalStackAlignment(Align(1024)))
AllocaAlign = std::max(AllocaAlign, DL.getStackAlignment());
if (MaybeAlign StackAlign = DL.getStackAlignment();
StackAlign && *StackAlign > AllocaAlign)
AllocaAlign = *StackAlign;

// Put the alloca to hold the variadic args in the entry basic block.
Builder.SetInsertPointPastAllocas(CBF);
Expand Down
3 changes: 2 additions & 1 deletion llvm/lib/Transforms/Utils/Local.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1506,7 +1506,8 @@ Align llvm::tryEnforceAlignment(Value *V, Align PrefAlign,

// If the preferred alignment is greater than the natural stack alignment
// then don't round up. This avoids dynamic stack realignment.
if (DL.exceedsNaturalStackAlignment(PrefAlign))
MaybeAlign StackAlign = DL.getStackAlignment();
if (StackAlign && PrefAlign > *StackAlign)
return CurrentAlign;
AI->setAlignment(PrefAlign);
return PrefAlign;
Expand Down
15 changes: 15 additions & 0 deletions llvm/unittests/IR/DataLayoutTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -444,6 +444,21 @@ TEST(DataLayout, ParseNonIntegralAddrSpace) {
FailedWithMessage("address space 0 cannot be non-integral"));
}

TEST(DataLayout, GetStackAlignment) {
DataLayout Default;
EXPECT_FALSE(Default.getStackAlignment().has_value());

std::pair<StringRef, Align> Cases[] = {
{"S8", Align(1)},
{"S64", Align(8)},
{"S32768", Align(4096)},
};
for (auto [Layout, Val] : Cases) {
DataLayout DL = cantFail(DataLayout::parse(Layout));
EXPECT_EQ(DL.getStackAlignment(), Val) << Layout;
}
}

TEST(DataLayout, GetPointerSizeInBits) {
std::tuple<StringRef, unsigned, unsigned, unsigned> Cases[] = {
{"", 64, 64, 64},
Expand Down
Loading