[gc.statepoint] Change gc.statepoint intrinsic's return type to token type instead...
[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: bitcast
17 ; CHECK-NEXT: @consume(i64 addrspace(1)* %obj.relocated.casted)
18 ; CHECK-NEXT: @consume(i64 addrspace(1)* %obj.relocated.casted)
19   %obj2 = phi i64 addrspace(1)* [ %obj, %entry ]
20   call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0)
21   call void (...) @consume(i64 addrspace(1)* %obj2)
22   call void (...) @consume(i64 addrspace(1)* %obj)
23   ret void
24 }
25
26 declare void @some_call(i64 addrspace(1)*)
27
28 ; Need to delete unreachable gc.statepoint call
29 define void @test7() gc "statepoint-example" {
30 ; CHECK-LABEL: test7
31 ; CHECK-NOT: gc.statepoint
32   ret void
33
34 unreached:
35   %obj = phi i64 addrspace(1)* [null, %unreached]
36   call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0)
37   call void (...) @consume(i64 addrspace(1)* %obj)
38   br label %unreached
39 }
40
41 ; Need to delete unreachable gc.statepoint invoke - tested seperately given
42 ; a correct implementation could only remove the instructions, not the block
43 define void @test8() gc "statepoint-example" personality i32 ()* undef {
44 ; CHECK-LABEL: test8
45 ; CHECK-NOT: gc.statepoint
46   ret void
47
48 unreached:
49   invoke token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0)
50           to label %normal_return unwind label %exceptional_return
51
52 normal_return:                                    ; preds = %entry
53   ret void
54
55 exceptional_return:                               ; preds = %entry
56   %landing_pad4 = landingpad { i8*, i32 }
57           cleanup
58   ret void
59 }
60
61 declare void @foo()
62 ; Bound the last check-not
63 ; CHECK-LABEL: @foo
64
65 declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...)