[opaque pointer type] Add textual IR support for explicit type parameter to the invok...
[oota-llvm.git] / test / Transforms / RewriteStatepointsForGC / preprocess.ll
1 ; RUN: opt -rewrite-statepoints-for-gc -S < %s | FileCheck %s
2
3 declare void @consume(...)
4
5 ; Test to make sure we destroy LCSSA's single entry phi nodes before
6 ; running liveness
7 define void @test6(i64 addrspace(1)* %obj) gc "statepoint-example" {
8 ; CHECK-LABEL: @test6
9 entry:
10   br label %next
11
12 next:
13 ; CHECK-LABEL: next:
14 ; CHECK-NEXT: gc.statepoint
15 ; CHECK-NEXT: gc.relocate
16 ; CHECK-NEXT: @consume(i64 addrspace(1)* %obj.relocated)
17 ; CHECK-NEXT: @consume(i64 addrspace(1)* %obj.relocated)
18   %obj2 = phi i64 addrspace(1)* [ %obj, %entry ]
19   call i32 (void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()* @foo, i32 0, i32 0, i32 0)
20   call void (...) @consume(i64 addrspace(1)* %obj2)
21   call void (...) @consume(i64 addrspace(1)* %obj)
22   ret void
23 }
24
25 declare void @some_call(i64 addrspace(1)*)
26
27 ; Need to delete unreachable gc.statepoint call
28 define void @test7() gc "statepoint-example" {
29 ; CHECK-LABEL: test7
30 ; CHECK-NOT: gc.statepoint
31   ret void
32
33 unreached:
34   %obj = phi i64 addrspace(1)* [null, %unreached]
35   call i32 (void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()* @foo, i32 0, i32 0, i32 0)
36   call void (...) @consume(i64 addrspace(1)* %obj)
37   br label %unreached
38 }
39
40 ; Need to delete unreachable gc.statepoint invoke - tested seperately given
41 ; a correct implementation could only remove the instructions, not the block
42 define void @test8() gc "statepoint-example" {
43 ; CHECK-LABEL: test8
44 ; CHECK-NOT: gc.statepoint
45   ret void
46
47 unreached:
48   invoke i32 (void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()* @foo, i32 0, i32 0, i32 0)
49           to label %normal_return unwind label %exceptional_return
50
51 normal_return:                                    ; preds = %entry
52   ret void
53
54 exceptional_return:                               ; preds = %entry
55   %landing_pad4 = landingpad { i8*, i32 } personality i32 ()* undef
56           cleanup
57   ret void
58 }
59
60 declare void @foo()
61 ; Bound the last check-not
62 ; CHECK-LABEL: @foo
63
64 declare i32 @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()*, i32, i32, ...)
65