1; RUN: opt -rewrite-statepoints-for-gc -rs4gc-use-deopt-bundles -S < %s | FileCheck %s 2 3; Test to make sure we destroy LCSSA's single entry phi nodes before 4; running liveness 5 6declare void @consume(...) "gc-leaf-function" 7 8define void @test6(i64 addrspace(1)* %obj) gc "statepoint-example" { 9; CHECK-LABEL: @test6 10entry: 11 br label %next 12 13next: ; preds = %entry 14; CHECK-LABEL: next: 15; CHECK-NEXT: gc.statepoint 16; CHECK-NEXT: gc.relocate 17; CHECK-NEXT: bitcast 18; CHECK-NEXT: @consume(i64 addrspace(1)* %obj.relocated.casted) 19; CHECK-NEXT: @consume(i64 addrspace(1)* %obj.relocated.casted) 20; Need to delete unreachable gc.statepoint call 21 %obj2 = phi i64 addrspace(1)* [ %obj, %entry ] 22 call void @foo() [ "deopt"() ] 23 call void (...) @consume(i64 addrspace(1)* %obj2) 24 call void (...) @consume(i64 addrspace(1)* %obj) 25 ret void 26} 27 28define void @test7() gc "statepoint-example" { 29; CHECK-LABEL: test7 30; CHECK-NOT: gc.statepoint 31; Need to delete unreachable gc.statepoint invoke - tested seperately given 32; a correct implementation could only remove the instructions, not the block 33 ret void 34 35unreached: ; preds = %unreached 36 %obj = phi i64 addrspace(1)* [ null, %unreached ] 37 call void @foo() [ "deopt"() ] 38 call void (...) @consume(i64 addrspace(1)* %obj) 39 br label %unreached 40} 41 42define void @test8() gc "statepoint-example" personality i32 ()* undef { 43; CHECK-LABEL: test8 44; CHECK-NOT: gc.statepoint 45; Bound the last check-not 46 ret void 47 48unreached: ; No predecessors! 49 invoke void @foo() [ "deopt"() ] 50; CHECK-LABEL: @foo 51 to label %normal_return unwind label %exceptional_return 52 53normal_return: ; preds = %unreached 54 ret void 55 56exceptional_return: ; preds = %unreached 57 %landing_pad4 = landingpad { i8*, i32 } 58 cleanup 59 ret void 60} 61 62declare void @foo() 63