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: @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 25declare void @some_call(i64 addrspace(1)*) 26 27; Need to delete unreachable gc.statepoint call 28define void @test7() gc "statepoint-example" { 29; CHECK-LABEL: test7 30; CHECK-NOT: gc.statepoint 31 ret void 32 33unreached: 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 42define void @test8() gc "statepoint-example" { 43; CHECK-LABEL: test8 44; CHECK-NOT: gc.statepoint 45 ret void 46 47unreached: 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 51normal_return: ; preds = %entry 52 ret void 53 54exceptional_return: ; preds = %entry 55 %landing_pad4 = landingpad { i8*, i32 } personality i32 ()* undef 56 cleanup 57 ret void 58} 59 60declare void @foo() 61; Bound the last check-not 62; CHECK-LABEL: @foo 63 64declare i32 @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()*, i32, i32, ...) 65 66