mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-29 06:30:39 +00:00
Fix more fallout from r158919, similar to PR13547.
This code used to only handle malloc-like calls, which do not read memory. r158919 changed it to check isNoAliasFn(), which includes strdup-like and realloc-like calls, but it was not checking for dependencies on the memory read by those calls. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@163106 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c4d2560a20
commit
84451a110d
@ -479,12 +479,17 @@ 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, AA->getTargetLibraryInfo())){
|
||||
const TargetLibraryInfo *TLI = AA->getTargetLibraryInfo();
|
||||
if (isa<AllocaInst>(Inst) || isNoAliasFn(Inst, TLI)) {
|
||||
const Value *AccessPtr = GetUnderlyingObject(MemLoc.Ptr, TD);
|
||||
|
||||
if (AccessPtr == Inst || AA->isMustAlias(Inst, AccessPtr))
|
||||
return MemDepResult::getDef(Inst);
|
||||
continue;
|
||||
// If the allocation is not aliased and does not read memory (like
|
||||
// strdup), it is safe to ignore.
|
||||
if (isa<AllocaInst>(Inst) ||
|
||||
isMallocLikeFn(Inst, TLI) || isCallocLikeFn(Inst, TLI))
|
||||
continue;
|
||||
}
|
||||
|
||||
// See if this instruction (e.g. a call or vaarg) mod/ref's the pointer.
|
||||
|
@ -310,3 +310,17 @@ define void @test24([2 x i32]* %a, i32 %b, i32 %c) nounwind {
|
||||
store i32 %c, i32* %4, align 4
|
||||
ret void
|
||||
}
|
||||
|
||||
; Check another case like PR13547 where strdup is not like malloc.
|
||||
; CHECK: @test25
|
||||
; CHECK: load i8
|
||||
; CHECK: store i8 0
|
||||
; CHECK: store i8 %tmp
|
||||
define i8* @test25(i8* %p) nounwind {
|
||||
%p.4 = getelementptr i8* %p, i64 4
|
||||
%tmp = load i8* %p.4, align 1
|
||||
store i8 0, i8* %p.4, align 1
|
||||
%q = call i8* @strdup(i8* %p) nounwind optsize
|
||||
store i8 %tmp, i8* %p.4, align 1
|
||||
ret i8* %q
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user