forked from OSchip/llvm-project
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:
parent
b32735d599
commit
dba73135c8
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue