blob: e1657497485b46cc922edce8f2e70ce7d849b26c [file] [log] [blame]
Philip Reames85b36a82015-04-10 22:07:04 +00001; 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
Sanjoy Das89c54912015-05-11 18:49:34 +000016; CHECK-NEXT: bitcast
17; CHECK-NEXT: @consume(i64 addrspace(1)* %obj.relocated.casted)
18; CHECK-NEXT: @consume(i64 addrspace(1)* %obj.relocated.casted)
Philip Reames85b36a82015-04-10 22:07:04 +000019 %obj2 = phi i64 addrspace(1)* [ %obj, %entry ]
Chen Lid71999e2015-12-26 07:54:32 +000020 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)
David Blaikie23af6482015-04-16 23:24:18 +000021 call void (...) @consume(i64 addrspace(1)* %obj2)
22 call void (...) @consume(i64 addrspace(1)* %obj)
Philip Reames85b36a82015-04-10 22:07:04 +000023 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]
Chen Lid71999e2015-12-26 07:54:32 +000036 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)
David Blaikie23af6482015-04-16 23:24:18 +000037 call void (...) @consume(i64 addrspace(1)* %obj)
Philip Reames85b36a82015-04-10 22:07:04 +000038 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
David Majnemer7fddecc2015-06-17 20:52:32 +000043define void @test8() gc "statepoint-example" personality i32 ()* undef {
Philip Reames85b36a82015-04-10 22:07:04 +000044; CHECK-LABEL: test8
45; CHECK-NOT: gc.statepoint
46 ret void
47
48unreached:
Chen Lid71999e2015-12-26 07:54:32 +000049 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)
Philip Reames85b36a82015-04-10 22:07:04 +000050 to label %normal_return unwind label %exceptional_return
51
52normal_return: ; preds = %entry
53 ret void
54
55exceptional_return: ; preds = %entry
David Majnemer7fddecc2015-06-17 20:52:32 +000056 %landing_pad4 = landingpad { i8*, i32 }
Philip Reames85b36a82015-04-10 22:07:04 +000057 cleanup
58 ret void
59}
60
61declare void @foo()
62; Bound the last check-not
63; CHECK-LABEL: @foo
64
Chen Lid71999e2015-12-26 07:54:32 +000065declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...)