Skip to content

Commit

Permalink
Revert "Extract utility function for checking initial value of alloca…
Browse files Browse the repository at this point in the history
…tion [NFC]"

This reverts commit 9ce30fe.  Appears to be causing a problem on a buildbot, revert while investigating.

https://green.lab.llvm.org/green//job/clang-stage1-RA/26818/consoleFull#-1502953973d489585b-5106-414a-ac11-3ff90657619c
  • Loading branch information
preames committed Jan 7, 2022
1 parent 6d065ef commit c6a0c15
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 43 deletions.
10 changes: 0 additions & 10 deletions llvm/include/llvm/Analysis/MemoryBuiltins.h
Expand Up @@ -115,16 +115,6 @@ inline CallInst *isFreeCall(Value *I, const TargetLibraryInfo *TLI) {
return const_cast<CallInst*>(isFreeCall((const Value*)I, TLI));
}

//===----------------------------------------------------------------------===//
// Properties of allocation functions
//

/// If this allocation function initializes memory to a fixed value, return
/// said value in the requested type. Otherwise, return nullptr.
Constant *getInitialValueOfAllocation(const CallInst *Alloc,
const TargetLibraryInfo *TLI,
Type *Ty);

//===----------------------------------------------------------------------===//
// Utility functions to compute size of objects.
//
Expand Down
16 changes: 0 additions & 16 deletions llvm/lib/Analysis/MemoryBuiltins.cpp
Expand Up @@ -312,22 +312,6 @@ bool llvm::isStrdupLikeFn(const Value *V, const TargetLibraryInfo *TLI) {
return getAllocationData(V, StrDupLike, TLI).hasValue();
}

Constant *llvm::getInitialValueOfAllocation(const CallInst *Alloc,
const TargetLibraryInfo *TLI,
Type *Ty) {
assert(isAllocationFn(Alloc, TLI));

// malloc and aligned_alloc are uninitialized (undef)
if (isMallocLikeFn(Alloc, TLI) || isAlignedAllocLikeFn(Alloc, TLI))
return UndefValue::get(Ty);

// calloc zero initializes
if (isCallocLikeFn(Alloc, TLI))
return Constant::getNullValue(Ty);

return nullptr;
}

/// isLibFreeFunction - Returns true if the function is a builtin free()
bool llvm::isLibFreeFunction(const Function *F, const LibFunc TLIFn) {
unsigned ExpectedNumParams;
Expand Down
10 changes: 7 additions & 3 deletions llvm/lib/Transforms/IPO/Attributor.cpp
Expand Up @@ -207,9 +207,13 @@ Constant *AA::getInitialValueForObj(Value &Obj, Type &Ty,
const TargetLibraryInfo *TLI) {
if (isa<AllocaInst>(Obj))
return UndefValue::get(&Ty);
if (isAllocationFn(&Obj, TLI))
return getInitialValueOfAllocation(&cast<CallInst>(Obj), TLI, &Ty);

if (isNoAliasFn(&Obj, TLI)) {
if (isMallocLikeFn(&Obj, TLI) || isAlignedAllocLikeFn(&Obj, TLI))
return UndefValue::get(&Ty);
if (isCallocLikeFn(&Obj, TLI))
return Constant::getNullValue(&Ty);
return nullptr;
}
auto *GV = dyn_cast<GlobalVariable>(&Obj);
if (!GV || !GV->hasLocalLinkage())
return nullptr;
Expand Down
19 changes: 10 additions & 9 deletions llvm/lib/Transforms/Scalar/GVN.cpp
Expand Up @@ -1104,19 +1104,20 @@ bool GVNPass::AnalyzeLoadAvailability(LoadInst *Load, MemDepResult DepInfo,
}
assert(DepInfo.isDef() && "follows from above");

// Loading the alloca -> undef.
// Loading immediately after lifetime begin -> undef.
if (isa<AllocaInst>(DepInst) || isLifetimeStart(DepInst)) {
// Loading the allocation -> undef.
if (isa<AllocaInst>(DepInst) || isMallocLikeFn(DepInst, TLI) ||
isAlignedAllocLikeFn(DepInst, TLI) ||
// Loading immediately after lifetime begin -> undef.
isLifetimeStart(DepInst)) {
Res = AvailableValue::get(UndefValue::get(Load->getType()));
return true;
}

if (isAllocationFn(DepInst, TLI))
if (auto *InitVal = getInitialValueOfAllocation(cast<CallInst>(DepInst),
TLI, Load->getType())) {
Res = AvailableValue::get(InitVal);
return true;
}
// Loading from calloc (which zero initializes memory) -> zero
if (isCallocLikeFn(DepInst, TLI)) {
Res = AvailableValue::get(Constant::getNullValue(Load->getType()));
return true;
}

if (StoreInst *S = dyn_cast<StoreInst>(DepInst)) {
// Reject loads and stores that are to the same address but are of
Expand Down
13 changes: 8 additions & 5 deletions llvm/lib/Transforms/Scalar/NewGVN.cpp
Expand Up @@ -1493,18 +1493,21 @@ NewGVN::performSymbolicLoadCoercion(Type *LoadType, Value *LoadPtr,
// undef value. This can happen when loading for a fresh allocation with no
// intervening stores, for example. Note that this is only true in the case
// that the result of the allocation is pointer equal to the load ptr.
if (isa<AllocaInst>(DepInst)) {
if (isa<AllocaInst>(DepInst) || isMallocLikeFn(DepInst, TLI) ||
isAlignedAllocLikeFn(DepInst, TLI)) {
return createConstantExpression(UndefValue::get(LoadType));
}
// If this load occurs either right after a lifetime begin,
// then the loaded value is undefined.
else if (auto *II = dyn_cast<IntrinsicInst>(DepInst)) {
if (II->getIntrinsicID() == Intrinsic::lifetime_start)
return createConstantExpression(UndefValue::get(LoadType));
} else if (isAllocationFn(DepInst, TLI))
if (auto *InitVal = getInitialValueOfAllocation(cast<CallInst>(DepInst),
TLI, LoadType))
return createConstantExpression(InitVal);
}
// If this load follows a calloc (which zero initializes memory),
// then the loaded value is zero
else if (isCallocLikeFn(DepInst, TLI)) {
return createConstantExpression(Constant::getNullValue(LoadType));
}

return nullptr;
}
Expand Down

0 comments on commit c6a0c15

Please sign in to comment.