mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-05 10:17:36 +00:00
If we are checking to see if the result of a call aliases a
pointer derived from a local allocation, if the local allocation never escapes, the pointers can't alias. This implements PR2436 llvm-svn: 52301
This commit is contained in:
parent
1077c28bb1
commit
e987a3bdd1
@ -317,6 +317,18 @@ static bool isKnownNonNull(const Value *V) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/// isNonEscapingLocalObject - Return true if the pointer is to a function-local
|
||||
/// object that never escapes from the function.
|
||||
static bool isNonEscapingLocalObject(const Value *V) {
|
||||
// If this is a local allocation or byval argument, check to see if it
|
||||
// escapes.
|
||||
if (isa<AllocationInst>(V) ||
|
||||
(isa<Argument>(V) && cast<Argument>(V)->hasByValAttr()))
|
||||
return !AddressMightEscape(V);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/// isObjectSmallerThan - Return true if we can prove that the object specified
|
||||
/// by V is smaller than Size.
|
||||
static bool isObjectSmallerThan(const Value *V, unsigned Size,
|
||||
@ -393,7 +405,15 @@ BasicAliasAnalysis::alias(const Value *V1, unsigned V1Size,
|
||||
(V2Size != ~0U && isObjectSmallerThan(O1, V2Size, TD)))
|
||||
return NoAlias;
|
||||
|
||||
|
||||
// If one pointer is the result of a call/invoke and the other is a
|
||||
// non-escaping local object, then we know the object couldn't escape to a
|
||||
// point where the call could return it.
|
||||
if ((isa<CallInst>(O1) || isa<InvokeInst>(O1)) &&
|
||||
isNonEscapingLocalObject(O2))
|
||||
return NoAlias;
|
||||
if ((isa<CallInst>(O2) || isa<InvokeInst>(O2)) &&
|
||||
isNonEscapingLocalObject(O1))
|
||||
return NoAlias;
|
||||
|
||||
// If we have two gep instructions with must-alias'ing base pointers, figure
|
||||
// out if the indexes to the GEP tell us anything about the derived pointer.
|
||||
|
23
test/Analysis/BasicAA/no-escape-call.ll
Normal file
23
test/Analysis/BasicAA/no-escape-call.ll
Normal file
@ -0,0 +1,23 @@
|
||||
; RUN: llvm-as < %s | opt -basicaa -gvn -instcombine | llvm-dis | grep {ret i1 true}
|
||||
; PR2436
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
|
||||
target triple = "i386-apple-darwin8"
|
||||
|
||||
define i1 @foo(i32 %i) nounwind {
|
||||
entry:
|
||||
%arr = alloca [10 x i8*] ; <[10 x i8*]*> [#uses=1]
|
||||
%tmp2 = call i8* @getPtr( ) nounwind ; <i8*> [#uses=2]
|
||||
%tmp4 = getelementptr [10 x i8*]* %arr, i32 0, i32 %i ; <i8**> [#uses=2]
|
||||
store i8* %tmp2, i8** %tmp4, align 4
|
||||
%tmp10 = getelementptr i8* %tmp2, i32 10 ; <i8*> [#uses=1]
|
||||
store i8 42, i8* %tmp10, align 1
|
||||
%tmp14 = load i8** %tmp4, align 4 ; <i8*> [#uses=1]
|
||||
%tmp16 = getelementptr i8* %tmp14, i32 10 ; <i8*> [#uses=1]
|
||||
%tmp17 = load i8* %tmp16, align 1 ; <i8> [#uses=1]
|
||||
%tmp19 = icmp eq i8 %tmp17, 42 ; <i1> [#uses=1]
|
||||
ret i1 %tmp19
|
||||
}
|
||||
|
||||
declare i8* @getPtr()
|
||||
|
||||
declare void @abort() noreturn nounwind
|
Loading…
Reference in New Issue
Block a user