Index: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp =================================================================== --- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp +++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp @@ -760,6 +760,20 @@ return MRI_NoModRef; } + // If the CallSite is to malloc or calloc, we can assume that it doesn't + // modify any IR visible value. This is only valid because we assume these + // routines do not read values visible in the IR. TODO: Consider special + // casing realloc and strdup routines which access only their arguments as + // well. Or alternatively, replace all of this with inaccessiblememonly once + // that's implemented fully. + auto *Inst = CS.getInstruction(); + if (isMallocLikeFn(Inst, &TLI) || isCallocLikeFn(Inst, &TLI)) { + // Be conservative if the accessed pointer may alias the allocation - + // fallback to the generic handling below. + if (getBestAAResults().alias(MemoryLocation(Inst), Loc) == NoAlias) + return MRI_NoModRef; + } + // While the assume intrinsic is marked as arbitrarily writing so that // proper control dependencies will be maintained, it never aliases any // particular memory location. Index: llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp =================================================================== --- llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp +++ llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp @@ -669,26 +669,13 @@ // If this is an allocation, and if we know that the accessed pointer is to // the allocation, return Def. This means that there is no dependence and // the access can be optimized based on that. For example, a load could - // turn into undef. - // Note: Only determine this to be a malloc if Inst is the malloc call, not - // 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. + // turn into undef. Note that we can bypass the allocation itself when + // looking for a clobber in many cases; that's an alias property and is + // handled by BasicAA. if (isa(Inst) || isNoAliasFn(Inst, TLI)) { const Value *AccessPtr = GetUnderlyingObject(MemLoc.Ptr, DL); - if (AccessPtr == Inst || AA->isMustAlias(Inst, AccessPtr)) return MemDepResult::getDef(Inst); - if (isInvariantLoad) - continue; - // Be conservative if the accessed pointer may alias the allocation - - // fallback to the generic handling below. - if ((AA->alias(Inst, AccessPtr) == NoAlias) && - // If the allocation is not aliased and does not read memory (like - // strdup), it is safe to ignore. - (isa(Inst) || isMallocLikeFn(Inst, TLI) || - isCallocLikeFn(Inst, TLI))) - continue; } if (isInvariantLoad)