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