getAllocAlignment: respect allocalign attribute if present

As with allocsize(), we prefer the table data to attributes.

Differential Revision: https://reviews.llvm.org/D118263
This commit is contained in:
Augie Fackler 2022-01-25 23:50:22 -05:00
parent b32735d599
commit dba73135c8
2 changed files with 12 additions and 4 deletions

View File

@ -100,7 +100,10 @@ inline CallInst *isFreeCall(Value *I, const TargetLibraryInfo *TLI) {
/// insertion or speculative execution of allocation routines.
bool isAllocRemovable(const CallBase *V, const TargetLibraryInfo *TLI);
/// Gets the alignment argument for an aligned_alloc-like function
/// Gets the alignment argument for an aligned_alloc-like function, using either
/// built-in knowledge based on fuction names/signatures or allocalign
/// attributes. Note: the Value returned may not indicate a valid alignment, per
/// the definition of the allocalign attribute.
Value *getAllocAlignment(const CallBase *V, const TargetLibraryInfo *TLI);
/// Return the size of the requested allocation. With a trivial mapper, this is

View File

@ -334,10 +334,15 @@ Value *llvm::getAllocAlignment(const CallBase *V,
assert(isAllocationFn(V, TLI));
const Optional<AllocFnsTy> FnData = getAllocationData(V, AnyAlloc, TLI);
if (!FnData.hasValue() || FnData->AlignParam < 0) {
return nullptr;
if (FnData.hasValue() && FnData->AlignParam >= 0) {
return V->getOperand(FnData->AlignParam);
}
return V->getOperand(FnData->AlignParam);
unsigned AllocAlignParam;
if (V->getAttributes().hasAttrSomewhere(Attribute::AllocAlign,
&AllocAlignParam)) {
return V->getOperand(AllocAlignParam-1);
}
return nullptr;
}
/// When we're compiling N-bit code, and the user uses parameters that are