| ; RUN: opt -rewrite-statepoints-for-gc -S < %s | FileCheck %s | |
| ; RUN: opt -passes=rewrite-statepoints-for-gc -S < %s | FileCheck %s | |
| ; Test to make sure we destroy LCSSA's single entry phi nodes before | |
| ; running liveness | |
| declare void @consume(...) "gc-leaf-function" | |
| define void @test6(i64 addrspace(1)* %obj) gc "statepoint-example" { | |
| ; CHECK-LABEL: @test6 | |
| entry: | |
| br label %next | |
| next: ; preds = %entry | |
| ; CHECK-LABEL: next: | |
| ; CHECK-NEXT: gc.statepoint | |
| ; CHECK-NEXT: gc.relocate | |
| ; CHECK-NEXT: bitcast | |
| ; CHECK-NEXT: @consume(i64 addrspace(1)* %obj.relocated.casted) | |
| ; CHECK-NEXT: @consume(i64 addrspace(1)* %obj.relocated.casted) | |
| ; Need to delete unreachable gc.statepoint call | |
| %obj2 = phi i64 addrspace(1)* [ %obj, %entry ] | |
| call void @foo() [ "deopt"() ] | |
| call void (...) @consume(i64 addrspace(1)* %obj2) | |
| call void (...) @consume(i64 addrspace(1)* %obj) | |
| ret void | |
| } | |
| define void @test7() gc "statepoint-example" { | |
| ; CHECK-LABEL: test7 | |
| ; CHECK-NOT: gc.statepoint | |
| ; Need to delete unreachable gc.statepoint invoke - tested seperately given | |
| ; a correct implementation could only remove the instructions, not the block | |
| ret void | |
| unreached: ; preds = %unreached | |
| %obj = phi i64 addrspace(1)* [ null, %unreached ] | |
| call void @foo() [ "deopt"() ] | |
| call void (...) @consume(i64 addrspace(1)* %obj) | |
| br label %unreached | |
| } | |
| define void @test8() gc "statepoint-example" personality i32 ()* undef { | |
| ; CHECK-LABEL: test8 | |
| ; CHECK-NOT: gc.statepoint | |
| ; Bound the last check-not | |
| ret void | |
| unreached: ; No predecessors! | |
| invoke void @foo() [ "deopt"() ] | |
| ; CHECK-LABEL: @foo | |
| to label %normal_return unwind label %exceptional_return | |
| normal_return: ; preds = %unreached | |
| ret void | |
| exceptional_return: ; preds = %unreached | |
| %landing_pad4 = landingpad { i8*, i32 } | |
| cleanup | |
| ret void | |
| } | |
| declare void @foo() |