summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/ObjCARC/allocas.ll
diff options
context:
space:
mode:
authorEric Christopher <echristo@gmail.com>2019-04-17 02:12:23 +0000
committerEric Christopher <echristo@gmail.com>2019-04-17 02:12:23 +0000
commita86343512845c9c1fdbac865fea88aa5fce7142a (patch)
tree666fc6353de19ad8b00e56b67edd33f24104e4a7 /llvm/test/Transforms/ObjCARC/allocas.ll
parent7f8ca6e3679b3af951cb7a4b1377edfaa3244b93 (diff)
downloadbcm5719-llvm-a86343512845c9c1fdbac865fea88aa5fce7142a.tar.gz
bcm5719-llvm-a86343512845c9c1fdbac865fea88aa5fce7142a.zip
Temporarily Revert "Add basic loop fusion pass."
As it's causing some bot failures (and per request from kbarton). This reverts commit r358543/ab70da07286e618016e78247e4a24fcb84077fda. llvm-svn: 358546
Diffstat (limited to 'llvm/test/Transforms/ObjCARC/allocas.ll')
-rw-r--r--llvm/test/Transforms/ObjCARC/allocas.ll500
1 files changed, 0 insertions, 500 deletions
diff --git a/llvm/test/Transforms/ObjCARC/allocas.ll b/llvm/test/Transforms/ObjCARC/allocas.ll
deleted file mode 100644
index bf2039d68d6..00000000000
--- a/llvm/test/Transforms/ObjCARC/allocas.ll
+++ /dev/null
@@ -1,500 +0,0 @@
-; RUN: opt -objc-arc -S < %s | FileCheck %s
-
-declare i8* @llvm.objc.retain(i8*)
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
-declare void @llvm.objc.release(i8*)
-declare i8* @llvm.objc.autorelease(i8*)
-declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
-declare void @llvm.objc.autoreleasePoolPop(i8*)
-declare i8* @llvm.objc.autoreleasePoolPush()
-declare i8* @llvm.objc.retainBlock(i8*)
-
-declare i8* @objc_retainedObject(i8*)
-declare i8* @objc_unretainedObject(i8*)
-declare i8* @objc_unretainedPointer(i8*)
-
-declare void @use_pointer(i8*)
-declare void @callee()
-declare void @callee_fnptr(void ()*)
-declare void @invokee()
-declare i8* @returner()
-declare i8* @returner1()
-declare i8* @returner2()
-declare void @bar(i32 ()*)
-declare void @use_alloca(i8**)
-
-declare void @llvm.dbg.value(metadata, metadata, metadata)
-
-declare i8* @llvm.objc.msgSend(i8*, i8*, ...)
-
-
-; In the presence of allocas, unconditionally remove retain/release pairs only
-; if they are known safe in both directions. This prevents matching up an inner
-; retain with the boundary guarding release in the following situation:
-;
-; %A = alloca
-; retain(%x)
-; retain(%x) <--- Inner Retain
-; store %x, %A
-; %y = load %A
-; ... DO STUFF ...
-; release(%y)
-; release(%x) <--- Guarding Release
-;
-; rdar://13750319
-
-; CHECK: define void @test1a(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
-; CHECK: ret void
-; CHECK: }
-define void @test1a(i8* %x) {
-entry:
- %A = alloca i8*
- tail call i8* @llvm.objc.retain(i8* %x)
- tail call i8* @llvm.objc.retain(i8* %x)
- store i8* %x, i8** %A, align 8
- %y = load i8*, i8** %A
- call void @use_alloca(i8** %A)
- call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
- call void @use_pointer(i8* %x)
- call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
- ret void
-}
-
-; CHECK: define void @test1b(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
-; CHECK: ret void
-; CHECK: }
-define void @test1b(i8* %x) {
-entry:
- %A = alloca i8*
- %gep = getelementptr i8*, i8** %A, i32 0
- tail call i8* @llvm.objc.retain(i8* %x)
- tail call i8* @llvm.objc.retain(i8* %x)
- store i8* %x, i8** %gep, align 8
- %y = load i8*, i8** %A
- call void @use_alloca(i8** %A)
- call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
- call void @use_pointer(i8* %x)
- call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
- ret void
-}
-
-
-; CHECK: define void @test1c(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
-; CHECK: ret void
-; CHECK: }
-define void @test1c(i8* %x) {
-entry:
- %A = alloca i8*, i32 3
- %gep = getelementptr i8*, i8** %A, i32 2
- tail call i8* @llvm.objc.retain(i8* %x)
- tail call i8* @llvm.objc.retain(i8* %x)
- store i8* %x, i8** %gep, align 8
- %y = load i8*, i8** %gep
- call void @use_alloca(i8** %A)
- call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
- call void @use_pointer(i8* %x)
- call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
- ret void
-}
-
-
-; CHECK: define void @test1d(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
-; CHECK: ret void
-; CHECK: }
-define void @test1d(i8* %x) {
-entry:
- br i1 undef, label %use_allocaA, label %use_allocaB
-
-use_allocaA:
- %allocaA = alloca i8*
- br label %exit
-
-use_allocaB:
- %allocaB = alloca i8*
- br label %exit
-
-exit:
- %A = phi i8** [ %allocaA, %use_allocaA ], [ %allocaB, %use_allocaB ]
- %gep = getelementptr i8*, i8** %A, i32 0
- tail call i8* @llvm.objc.retain(i8* %x)
- tail call i8* @llvm.objc.retain(i8* %x)
- store i8* %x, i8** %gep, align 8
- %y = load i8*, i8** %gep
- call void @use_alloca(i8** %A)
- call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
- call void @use_pointer(i8* %x)
- call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
- ret void
-}
-
-; CHECK: define void @test1e(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
-; CHECK: ret void
-; CHECK: }
-define void @test1e(i8* %x) {
-entry:
- br i1 undef, label %use_allocaA, label %use_allocaB
-
-use_allocaA:
- %allocaA = alloca i8*, i32 4
- br label %exit
-
-use_allocaB:
- %allocaB = alloca i8*, i32 4
- br label %exit
-
-exit:
- %A = phi i8** [ %allocaA, %use_allocaA ], [ %allocaB, %use_allocaB ]
- %gep = getelementptr i8*, i8** %A, i32 2
- tail call i8* @llvm.objc.retain(i8* %x)
- tail call i8* @llvm.objc.retain(i8* %x)
- store i8* %x, i8** %gep, align 8
- %y = load i8*, i8** %gep
- call void @use_alloca(i8** %A)
- call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
- call void @use_pointer(i8* %x)
- call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
- ret void
-}
-
-; CHECK: define void @test1f(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
-; CHECK: ret void
-; CHECK: }
-define void @test1f(i8* %x) {
-entry:
- %allocaOne = alloca i8*
- %allocaTwo = alloca i8*
- %A = select i1 undef, i8** %allocaOne, i8** %allocaTwo
- tail call i8* @llvm.objc.retain(i8* %x)
- tail call i8* @llvm.objc.retain(i8* %x)
- store i8* %x, i8** %A, align 8
- %y = load i8*, i8** %A
- call void @use_alloca(i8** %A)
- call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
- call void @use_pointer(i8* %x)
- call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
- ret void
-}
-
-; Make sure that if a store is in a different basic block we handle known safe
-; conservatively.
-
-
-; CHECK: define void @test2a(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
-; CHECK: ret void
-; CHECK: }
-define void @test2a(i8* %x) {
-entry:
- %A = alloca i8*
- store i8* %x, i8** %A, align 8
- %y = load i8*, i8** %A
- br label %bb1
-
-bb1:
- br label %bb2
-
-bb2:
- br label %bb3
-
-bb3:
- tail call i8* @llvm.objc.retain(i8* %x)
- tail call i8* @llvm.objc.retain(i8* %x)
- call void @use_alloca(i8** %A)
- call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
- call void @use_pointer(i8* %x)
- call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
- ret void
-}
-
-; CHECK: define void @test2b(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
-; CHECK: ret void
-; CHECK: }
-define void @test2b(i8* %x) {
-entry:
- %A = alloca i8*
- %gep1 = getelementptr i8*, i8** %A, i32 0
- store i8* %x, i8** %gep1, align 8
- %gep2 = getelementptr i8*, i8** %A, i32 0
- %y = load i8*, i8** %gep2
- br label %bb1
-
-bb1:
- br label %bb2
-
-bb2:
- br label %bb3
-
-bb3:
- tail call i8* @llvm.objc.retain(i8* %x)
- tail call i8* @llvm.objc.retain(i8* %x)
- call void @use_alloca(i8** %A)
- call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
- call void @use_pointer(i8* %x)
- call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
- ret void
-}
-
-; CHECK: define void @test2c(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
-; CHECK: ret void
-; CHECK: }
-define void @test2c(i8* %x) {
-entry:
- %A = alloca i8*, i32 3
- %gep1 = getelementptr i8*, i8** %A, i32 2
- store i8* %x, i8** %gep1, align 8
- %gep2 = getelementptr i8*, i8** %A, i32 2
- %y = load i8*, i8** %gep2
- tail call i8* @llvm.objc.retain(i8* %x)
- br label %bb1
-
-bb1:
- br label %bb2
-
-bb2:
- br label %bb3
-
-bb3:
- tail call i8* @llvm.objc.retain(i8* %x)
- call void @use_alloca(i8** %A)
- call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
- call void @use_pointer(i8* %x)
- call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
- ret void
-}
-
-; CHECK: define void @test2d(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
-; CHECK: ret void
-; CHECK: }
-define void @test2d(i8* %x) {
-entry:
- tail call i8* @llvm.objc.retain(i8* %x)
- br label %bb1
-
-bb1:
- %Abb1 = alloca i8*, i32 3
- %gepbb11 = getelementptr i8*, i8** %Abb1, i32 2
- store i8* %x, i8** %gepbb11, align 8
- %gepbb12 = getelementptr i8*, i8** %Abb1, i32 2
- %ybb1 = load i8*, i8** %gepbb12
- br label %bb3
-
-bb2:
- %Abb2 = alloca i8*, i32 4
- %gepbb21 = getelementptr i8*, i8** %Abb2, i32 2
- store i8* %x, i8** %gepbb21, align 8
- %gepbb22 = getelementptr i8*, i8** %Abb2, i32 2
- %ybb2 = load i8*, i8** %gepbb22
- br label %bb3
-
-bb3:
- %A = phi i8** [ %Abb1, %bb1 ], [ %Abb2, %bb2 ]
- %y = phi i8* [ %ybb1, %bb1 ], [ %ybb2, %bb2 ]
- tail call i8* @llvm.objc.retain(i8* %x)
- call void @use_alloca(i8** %A)
- call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
- call void @use_pointer(i8* %x)
- call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
- ret void
-}
-
-; Make sure in the presence of allocas, if we find a cfghazard we do not perform
-; code motion even if we are known safe. These two concepts are separate and
-; should be treated as such.
-;
-; rdar://13949644
-
-; CHECK: define void @test3a() {
-; CHECK: entry:
-; CHECK: @llvm.objc.retainAutoreleasedReturnValue
-; CHECK: @llvm.objc.retain
-; CHECK: @llvm.objc.retain
-; CHECK: @llvm.objc.retain
-; CHECK: @llvm.objc.retain
-; CHECK: arraydestroy.body:
-; CHECK: @llvm.objc.release
-; CHECK-NOT: @llvm.objc.release
-; CHECK: arraydestroy.done:
-; CHECK-NOT: @llvm.objc.release
-; CHECK: arraydestroy.body1:
-; CHECK: @llvm.objc.release
-; CHECK-NOT: @llvm.objc.release
-; CHECK: arraydestroy.done1:
-; CHECK: @llvm.objc.release
-; CHECK: ret void
-; CHECK: }
-define void @test3a() {
-entry:
- %keys = alloca [2 x i8*], align 16
- %objs = alloca [2 x i8*], align 16
-
- %call1 = call i8* @returner()
- %tmp0 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call1)
-
- %objs.begin = getelementptr inbounds [2 x i8*], [2 x i8*]* %objs, i64 0, i64 0
- tail call i8* @llvm.objc.retain(i8* %call1)
- store i8* %call1, i8** %objs.begin, align 8
- %objs.elt = getelementptr inbounds [2 x i8*], [2 x i8*]* %objs, i64 0, i64 1
- tail call i8* @llvm.objc.retain(i8* %call1)
- store i8* %call1, i8** %objs.elt
-
- %call2 = call i8* @returner1()
- %call3 = call i8* @returner2()
- %keys.begin = getelementptr inbounds [2 x i8*], [2 x i8*]* %keys, i64 0, i64 0
- tail call i8* @llvm.objc.retain(i8* %call2)
- store i8* %call2, i8** %keys.begin, align 8
- %keys.elt = getelementptr inbounds [2 x i8*], [2 x i8*]* %keys, i64 0, i64 1
- tail call i8* @llvm.objc.retain(i8* %call3)
- store i8* %call3, i8** %keys.elt
-
- %gep = getelementptr inbounds [2 x i8*], [2 x i8*]* %objs, i64 0, i64 2
- br label %arraydestroy.body
-
-arraydestroy.body:
- %arraydestroy.elementPast = phi i8** [ %gep, %entry ], [ %arraydestroy.element, %arraydestroy.body ]
- %arraydestroy.element = getelementptr inbounds i8*, i8** %arraydestroy.elementPast, i64 -1
- %destroy_tmp = load i8*, i8** %arraydestroy.element, align 8
- call void @llvm.objc.release(i8* %destroy_tmp), !clang.imprecise_release !0
- %objs_ptr = getelementptr inbounds [2 x i8*], [2 x i8*]* %objs, i64 0, i64 0
- %arraydestroy.cmp = icmp eq i8** %arraydestroy.element, %objs_ptr
- br i1 %arraydestroy.cmp, label %arraydestroy.done, label %arraydestroy.body
-
-arraydestroy.done:
- %gep1 = getelementptr inbounds [2 x i8*], [2 x i8*]* %keys, i64 0, i64 2
- br label %arraydestroy.body1
-
-arraydestroy.body1:
- %arraydestroy.elementPast1 = phi i8** [ %gep1, %arraydestroy.done ], [ %arraydestroy.element1, %arraydestroy.body1 ]
- %arraydestroy.element1 = getelementptr inbounds i8*, i8** %arraydestroy.elementPast1, i64 -1
- %destroy_tmp1 = load i8*, i8** %arraydestroy.element1, align 8
- call void @llvm.objc.release(i8* %destroy_tmp1), !clang.imprecise_release !0
- %keys_ptr = getelementptr inbounds [2 x i8*], [2 x i8*]* %keys, i64 0, i64 0
- %arraydestroy.cmp1 = icmp eq i8** %arraydestroy.element1, %keys_ptr
- br i1 %arraydestroy.cmp1, label %arraydestroy.done1, label %arraydestroy.body1
-
-arraydestroy.done1:
- call void @llvm.objc.release(i8* %call1), !clang.imprecise_release !0
- ret void
-}
-
-; Make sure that even though we stop said code motion we still allow for
-; pointers to be removed if we are known safe in both directions.
-;
-; rdar://13949644
-
-; CHECK: define void @test3b() {
-; CHECK: entry:
-; CHECK: @llvm.objc.retainAutoreleasedReturnValue
-; CHECK: @llvm.objc.retain
-; CHECK: @llvm.objc.retain
-; CHECK: @llvm.objc.retain
-; CHECK: @llvm.objc.retain
-; CHECK: arraydestroy.body:
-; CHECK: @llvm.objc.release
-; CHECK-NOT: @llvm.objc.release
-; CHECK: arraydestroy.done:
-; CHECK-NOT: @llvm.objc.release
-; CHECK: arraydestroy.body1:
-; CHECK: @llvm.objc.release
-; CHECK-NOT: @llvm.objc.release
-; CHECK: arraydestroy.done1:
-; CHECK: @llvm.objc.release
-; CHECK: ret void
-; CHECK: }
-define void @test3b() {
-entry:
- %keys = alloca [2 x i8*], align 16
- %objs = alloca [2 x i8*], align 16
-
- %call1 = call i8* @returner()
- %tmp0 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call1)
- %tmp1 = tail call i8* @llvm.objc.retain(i8* %call1)
-
- %objs.begin = getelementptr inbounds [2 x i8*], [2 x i8*]* %objs, i64 0, i64 0
- tail call i8* @llvm.objc.retain(i8* %call1)
- store i8* %call1, i8** %objs.begin, align 8
- %objs.elt = getelementptr inbounds [2 x i8*], [2 x i8*]* %objs, i64 0, i64 1
- tail call i8* @llvm.objc.retain(i8* %call1)
- store i8* %call1, i8** %objs.elt
-
- %call2 = call i8* @returner1()
- %call3 = call i8* @returner2()
- %keys.begin = getelementptr inbounds [2 x i8*], [2 x i8*]* %keys, i64 0, i64 0
- tail call i8* @llvm.objc.retain(i8* %call2)
- store i8* %call2, i8** %keys.begin, align 8
- %keys.elt = getelementptr inbounds [2 x i8*], [2 x i8*]* %keys, i64 0, i64 1
- tail call i8* @llvm.objc.retain(i8* %call3)
- store i8* %call3, i8** %keys.elt
-
- %gep = getelementptr inbounds [2 x i8*], [2 x i8*]* %objs, i64 0, i64 2
- br label %arraydestroy.body
-
-arraydestroy.body:
- %arraydestroy.elementPast = phi i8** [ %gep, %entry ], [ %arraydestroy.element, %arraydestroy.body ]
- %arraydestroy.element = getelementptr inbounds i8*, i8** %arraydestroy.elementPast, i64 -1
- %destroy_tmp = load i8*, i8** %arraydestroy.element, align 8
- call void @llvm.objc.release(i8* %destroy_tmp), !clang.imprecise_release !0
- %objs_ptr = getelementptr inbounds [2 x i8*], [2 x i8*]* %objs, i64 0, i64 0
- %arraydestroy.cmp = icmp eq i8** %arraydestroy.element, %objs_ptr
- br i1 %arraydestroy.cmp, label %arraydestroy.done, label %arraydestroy.body
-
-arraydestroy.done:
- %gep1 = getelementptr inbounds [2 x i8*], [2 x i8*]* %keys, i64 0, i64 2
- br label %arraydestroy.body1
-
-arraydestroy.body1:
- %arraydestroy.elementPast1 = phi i8** [ %gep1, %arraydestroy.done ], [ %arraydestroy.element1, %arraydestroy.body1 ]
- %arraydestroy.element1 = getelementptr inbounds i8*, i8** %arraydestroy.elementPast1, i64 -1
- %destroy_tmp1 = load i8*, i8** %arraydestroy.element1, align 8
- call void @llvm.objc.release(i8* %destroy_tmp1), !clang.imprecise_release !0
- %keys_ptr = getelementptr inbounds [2 x i8*], [2 x i8*]* %keys, i64 0, i64 0
- %arraydestroy.cmp1 = icmp eq i8** %arraydestroy.element1, %keys_ptr
- br i1 %arraydestroy.cmp1, label %arraydestroy.done1, label %arraydestroy.body1
-
-arraydestroy.done1:
- call void @llvm.objc.release(i8* %call1), !clang.imprecise_release !0
- call void @llvm.objc.release(i8* %call1), !clang.imprecise_release !0
- ret void
-}
-
-!0 = !{}
-
-declare i32 @__gxx_personality_v0(...)
OpenPOWER on IntegriCloud