summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorMichael Gottesman <mgottesman@apple.com>2013-04-21 02:59:44 +0000
committerMichael Gottesman <mgottesman@apple.com>2013-04-21 02:59:44 +0000
commitd5b701faf1976056cd625f84e2dc7e860dff1100 (patch)
treeb3e6cc478ca53b0020b8d7c60a544693ae6cb18a /llvm/test
parent77aa9463213554f0a8203920e85fa61ed3bf3dc4 (diff)
downloadbcm5719-llvm-d5b701faf1976056cd625f84e2dc7e860dff1100.tar.gz
bcm5719-llvm-d5b701faf1976056cd625f84e2dc7e860dff1100.zip
[objc-arc] Cleaned up tail-call-invariant-enforcement.ll.
Specifically: 1. Added checks that unwind is being properly added to various instructions. 2. Fixed the declaration/calling of objc_release to have a return type of void. 3. Moved all checks to precede the functions and added checks to ensure that the checks would only match inside the specific function that we are attempting to check. llvm-svn: 179973
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll65
1 files changed, 40 insertions, 25 deletions
diff --git a/llvm/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll b/llvm/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll
index 26cd67727e6..1ec61c84810 100644
--- a/llvm/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll
+++ b/llvm/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll
@@ -1,74 +1,89 @@
; RUN: opt -objc-arc -S < %s | FileCheck %s
-declare i8* @objc_release(i8* %x)
+declare void @objc_release(i8* %x)
declare i8* @objc_retain(i8* %x)
declare i8* @objc_autorelease(i8* %x)
declare i8* @objc_autoreleaseReturnValue(i8* %x)
declare i8* @objc_retainAutoreleasedReturnValue(i8* %x)
+declare i8* @tmp(i8*)
; Never tail call objc_autorelease.
-define i8* @test0(i8* %x) {
+
+; CHECK: define i8* @test0(i8* %x) [[NUW:#[0-9]+]] {
+; CHECK: %tmp0 = call i8* @objc_autorelease(i8* %x) [[NUW]]
+; CHECK: %tmp1 = call i8* @objc_autorelease(i8* %x) [[NUW]]
+; CHECK: }
+define i8* @test0(i8* %x) nounwind {
entry:
- ; CHECK: %tmp0 = call i8* @objc_autorelease(i8* %x)
%tmp0 = call i8* @objc_autorelease(i8* %x)
- ; CHECK: %tmp1 = call i8* @objc_autorelease(i8* %x)
%tmp1 = tail call i8* @objc_autorelease(i8* %x)
ret i8* %x
}
; Always tail call autoreleaseReturnValue.
-define i8* @test1(i8* %x) {
+
+; CHECK: define i8* @test1(i8* %x) [[NUW]] {
+; CHECK: %tmp0 = tail call i8* @objc_autoreleaseReturnValue(i8* %x) [[NUW]]
+; CHECK: %tmp1 = tail call i8* @objc_autoreleaseReturnValue(i8* %x) [[NUW]]
+; CHECK: }
+define i8* @test1(i8* %x) nounwind {
entry:
- ; CHECK: %tmp0 = tail call i8* @objc_autoreleaseReturnValue(i8* %x)
%tmp0 = call i8* @objc_autoreleaseReturnValue(i8* %x)
- ; CHECK: %tmp1 = tail call i8* @objc_autoreleaseReturnValue(i8* %x)
%tmp1 = tail call i8* @objc_autoreleaseReturnValue(i8* %x)
ret i8* %x
}
; Always tail call objc_retain.
-define i8* @test2(i8* %x) {
+
+; CHECK: define i8* @test2(i8* %x) [[NUW]] {
+; CHECK: %tmp0 = tail call i8* @objc_retain(i8* %x) [[NUW]]
+; CHECK: %tmp1 = tail call i8* @objc_retain(i8* %x) [[NUW]]
+; CHECK: }
+define i8* @test2(i8* %x) nounwind {
entry:
- ; CHECK: %tmp0 = tail call i8* @objc_retain(i8* %x)
%tmp0 = call i8* @objc_retain(i8* %x)
- ; CHECK: %tmp1 = tail call i8* @objc_retain(i8* %x)
%tmp1 = tail call i8* @objc_retain(i8* %x)
ret i8* %x
}
-define i8* @tmp(i8* %x) {
- ret i8* %x
-}
-
; Always tail call objc_retainAutoreleasedReturnValue.
-define i8* @test3(i8* %x) {
+; CHECK: define i8* @test3(i8* %x) [[NUW]] {
+; CHECK: %tmp0 = tail call i8* @objc_retainAutoreleasedReturnValue(i8* %y) [[NUW]]
+; CHECK: %tmp1 = tail call i8* @objc_retainAutoreleasedReturnValue(i8* %z) [[NUW]]
+; CHECK: }
+define i8* @test3(i8* %x) nounwind {
entry:
%y = call i8* @tmp(i8* %x)
- ; CHECK: %tmp0 = tail call i8* @objc_retainAutoreleasedReturnValue(i8* %y)
%tmp0 = call i8* @objc_retainAutoreleasedReturnValue(i8* %y)
%z = call i8* @tmp(i8* %x)
- ; CHECK: %tmp1 = tail call i8* @objc_retainAutoreleasedReturnValue(i8* %z)
%tmp1 = tail call i8* @objc_retainAutoreleasedReturnValue(i8* %z)
ret i8* %x
}
; By itself, we should never change whether or not objc_release is tail called.
-define i8* @test4(i8* %x) {
+
+; CHECK: define void @test4(i8* %x) [[NUW]] {
+; CHECK: call void @objc_release(i8* %x) [[NUW]]
+; CHECK: tail call void @objc_release(i8* %x) [[NUW]]
+; CHECK: }
+define void @test4(i8* %x) nounwind {
entry:
- ; CHECK: %tmp0 = call i8* @objc_release(i8* %x)
- %tmp0 = call i8* @objc_release(i8* %x)
- ; CHECK: %tmp1 = tail call i8* @objc_release(i8* %x)
- %tmp1 = tail call i8* @objc_release(i8* %x)
- ret i8* %x
+ call void @objc_release(i8* %x)
+ tail call void @objc_release(i8* %x)
+ ret void
}
; If we convert a tail called @objc_autoreleaseReturnValue to an
; @objc_autorelease, ensure that the tail call is removed.
-define i8* @test5(i8* %x) {
+; CHECK: define i8* @test5(i8* %x) [[NUW]] {
+; CHECK: %tmp0 = call i8* @objc_autorelease(i8* %x) [[NUW]]
+; CHECK: }
+define i8* @test5(i8* %x) nounwind {
entry:
- ; CHECK: %tmp0 = call i8* @objc_autorelease(i8* %x)
%tmp0 = tail call i8* @objc_autoreleaseReturnValue(i8* %x)
ret i8* %tmp0
}
+; CHECK: attributes [[NUW]] = { nounwind }
+
OpenPOWER on IntegriCloud