Make MemoryBuiltins aware of TargetLibraryInfo.
This disables malloc-specific optimization when -fno-builtin (or -ffreestanding) is specified. This has been a problem for a long time but became more severe with the recent memory builtin improvements. Since the memory builtin functions are used everywhere, this required passing TLI in many places. This means that functions that now have an optional TLI argument, like RecursivelyDeleteTriviallyDeadFunctions, won't remove dead mallocs anymore if the TLI argument is missing. I've updated most passes to do the right thing. Fixes PR13694 and probably others. llvm-svn: 162841
This commit is contained in:
@@ -148,7 +148,7 @@ AliasAnalysis::ModRefResult GetLocation(const Instruction *Inst,
|
||||
return AliasAnalysis::ModRef;
|
||||
}
|
||||
|
||||
if (const CallInst *CI = isFreeCall(Inst)) {
|
||||
if (const CallInst *CI = isFreeCall(Inst, AA->getTargetLibraryInfo())) {
|
||||
// calls to free() deallocate the entire structure
|
||||
Loc = AliasAnalysis::Location(CI->getArgOperand(0));
|
||||
return AliasAnalysis::Mod;
|
||||
@@ -479,7 +479,7 @@ getPointerDependencyFrom(const AliasAnalysis::Location &MemLoc, bool isLoad,
|
||||
// a subsequent bitcast of the malloc call result. There can be stores to
|
||||
// the malloced memory between the malloc call and its bitcast uses, and we
|
||||
// need to continue scanning until the malloc call.
|
||||
if (isa<AllocaInst>(Inst) || isNoAliasFn(Inst)) {
|
||||
if (isa<AllocaInst>(Inst) || isNoAliasFn(Inst, AA->getTargetLibraryInfo())){
|
||||
const Value *AccessPtr = GetUnderlyingObject(MemLoc.Ptr, TD);
|
||||
|
||||
if (AccessPtr == Inst || AA->isMustAlias(Inst, AccessPtr))
|
||||
|
||||
Reference in New Issue
Block a user