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