summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorRichard Osborne <richard@xmos.com>2012-11-05 10:48:24 +0000
committerRichard Osborne <richard@xmos.com>2012-11-05 10:48:24 +0000
commit544533301e51e697abf7cc05979208d0ffc30973 (patch)
treee0e4e5710a400a766d785cb237d2cb63571d5b9e /test
parente507fc6eeaddbb12fc6fabf43f6a6ce19651d689 (diff)
downloadllvm-544533301e51e697abf7cc05979208d0ffc30973.tar.gz
llvm-544533301e51e697abf7cc05979208d0ffc30973.tar.bz2
llvm-544533301e51e697abf7cc05979208d0ffc30973.tar.xz
Don't infer whether a value is captured in the current function from the
'nocapture' attribute. The nocapture attribute only specifies that no copies are made that outlive the function. This isn't the same as there being no copies at all. This fixes PR14045. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167381 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r--test/Analysis/BasicAA/nocapture.ll21
1 files changed, 21 insertions, 0 deletions
diff --git a/test/Analysis/BasicAA/nocapture.ll b/test/Analysis/BasicAA/nocapture.ll
index a8658ec801..ffc0a09a07 100644
--- a/test/Analysis/BasicAA/nocapture.ll
+++ b/test/Analysis/BasicAA/nocapture.ll
@@ -13,3 +13,24 @@ define i32 @test2() {
ret i32 %c
}
+declare void @test3(i32** %p, i32* %q) nounwind
+
+define i32 @test4(i32* noalias nocapture %p) nounwind {
+; CHECK: call void @test3
+; CHECK: store i32 0, i32* %p
+; CHECK: store i32 1, i32* %x
+; CHECK: %y = load i32* %p
+; CHECK: ret i32 %y
+entry:
+ %q = alloca i32*
+ ; Here test3 might store %p to %q. This doesn't violate %p's nocapture
+ ; attribute since the copy doesn't outlive the function.
+ call void @test3(i32** %q, i32* %p) nounwind
+ store i32 0, i32* %p
+ %x = load i32** %q
+ ; This store might write to %p and so we can't eliminate the subsequent
+ ; load
+ store i32 1, i32* %x
+ %y = load i32* %p
+ ret i32 %y
+}