1 ; RUN: opt -rewrite-statepoints-for-gc -S < %s | FileCheck %s
3 declare void @consume(...)
5 ; Test to make sure we destroy LCSSA's single entry phi nodes before
7 define void @test6(i64 addrspace(1)* %obj) gc "statepoint-example" {
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)
25 declare void @some_call(i64 addrspace(1)*)
27 ; Need to delete unreachable gc.statepoint call
28 define void @test7() gc "statepoint-example" {
30 ; CHECK-NOT: gc.statepoint
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)
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" {
44 ; CHECK-NOT: gc.statepoint
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
51 normal_return: ; preds = %entry
54 exceptional_return: ; preds = %entry
55 %landing_pad4 = landingpad { i8*, i32 } personality i32 ()* undef
61 ; Bound the last check-not
64 declare i32 @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()*, i32, i32, ...)