62 lines · plain
1; RUN: opt -passes=rewrite-statepoints-for-gc -S < %s | FileCheck %s2 3; Test to make sure we destroy LCSSA's single entry phi nodes before4; running liveness5 6declare void @consume(...) "gc-leaf-function"7 8define void @test6(ptr addrspace(1) %obj) gc "statepoint-example" {9; CHECK-LABEL: @test610entry:11 br label %next12 13next: ; preds = %entry14; CHECK-LABEL: next:15; CHECK-NEXT: gc.statepoint16; CHECK-NEXT: gc.relocate17; CHECK-NEXT: @consume(ptr addrspace(1) %obj.relocated)18; CHECK-NEXT: @consume(ptr addrspace(1) %obj.relocated)19; Need to delete unreachable gc.statepoint call20 %obj2 = phi ptr addrspace(1) [ %obj, %entry ]21 call void @foo() [ "deopt"() ]22 call void (...) @consume(ptr addrspace(1) %obj2)23 call void (...) @consume(ptr addrspace(1) %obj)24 ret void25}26 27define void @test7() gc "statepoint-example" {28; CHECK-LABEL: test729; CHECK-NOT: gc.statepoint30; Need to delete unreachable gc.statepoint invoke - tested separately given31; a correct implementation could only remove the instructions, not the block32 ret void33 34unreached: ; preds = %unreached35 %obj = phi ptr addrspace(1) [ null, %unreached ]36 call void @foo() [ "deopt"() ]37 call void (...) @consume(ptr addrspace(1) %obj)38 br label %unreached39}40 41define void @test8() gc "statepoint-example" personality ptr undef {42; CHECK-LABEL: test843; CHECK-NOT: gc.statepoint44; Bound the last check-not45 ret void46 47unreached: ; No predecessors!48 invoke void @foo() [ "deopt"() ]49; CHECK-LABEL: @foo50 to label %normal_return unwind label %exceptional_return51 52normal_return: ; preds = %unreached53 ret void54 55exceptional_return: ; preds = %unreached56 %landing_pad4 = landingpad { ptr, i32 }57 cleanup58 ret void59}60 61declare void @foo()62