1; RUN: opt -rewrite-statepoints-for-gc -S < %s | FileCheck %s
2
3declare void @consume(...)
4
5; Test to make sure we destroy LCSSA's single entry phi nodes before
6; running liveness
7define void @test6(i64 addrspace(1)* %obj) gc "statepoint-example" {
8; CHECK-LABEL: @test6
9entry:
10  br label %next
11
12next:
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 i32 (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
26declare void @some_call(i64 addrspace(1)*)
27
28; Need to delete unreachable gc.statepoint call
29define void @test7() gc "statepoint-example" {
30; CHECK-LABEL: test7
31; CHECK-NOT: gc.statepoint
32  ret void
33
34unreached:
35  %obj = phi i64 addrspace(1)* [null, %unreached]
36  call i32 (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
43define void @test8() gc "statepoint-example" personality i32 ()* undef {
44; CHECK-LABEL: test8
45; CHECK-NOT: gc.statepoint
46  ret void
47
48unreached:
49  invoke i32 (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
52normal_return:                                    ; preds = %entry
53  ret void
54
55exceptional_return:                               ; preds = %entry
56  %landing_pad4 = landingpad { i8*, i32 }
57          cleanup
58  ret void
59}
60
61declare void @foo()
62; Bound the last check-not
63; CHECK-LABEL: @foo
64
65declare i32 @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...)
66