| ; RUN: opt -rewrite-statepoints-for-gc -S < %s | FileCheck %s | |
| ; RUN: opt -passes=rewrite-statepoints-for-gc -S < %s | FileCheck %s | |
| ; A null test of a single value | |
| define i1 @test(i8 addrspace(1)* %p, i1 %rare) gc "statepoint-example" { | |
| ; CHECK-LABEL: @test | |
| entry: | |
| %cond = icmp eq i8 addrspace(1)* %p, null | |
| br i1 %rare, label %safepoint, label %continue, !prof !0 | |
| safepoint: ; preds = %entry | |
| call void @safepoint() [ "deopt"() ] | |
| br label %continue | |
| continue: ; preds = %safepoint, %entry | |
| ; CHECK-LABEL: continue: | |
| ; CHECK: phi | |
| ; CHECK-DAG: [ %p.relocated, %safepoint ] | |
| ; CHECK-DAG: [ %p, %entry ] | |
| ; CHECK: %cond = icmp | |
| ; CHECK: br i1 %cond | |
| ; Comparing two pointers | |
| br i1 %cond, label %taken, label %untaken | |
| taken: ; preds = %continue | |
| ret i1 true | |
| untaken: ; preds = %continue | |
| ret i1 false | |
| } | |
| define i1 @test2(i8 addrspace(1)* %p, i8 addrspace(1)* %q, i1 %rare) gc "statepoint-example" { | |
| ; CHECK-LABEL: @test2 | |
| entry: | |
| %cond = icmp eq i8 addrspace(1)* %p, %q | |
| br i1 %rare, label %safepoint, label %continue, !prof !0 | |
| safepoint: ; preds = %entry | |
| call void @safepoint() [ "deopt"() ] | |
| br label %continue | |
| continue: ; preds = %safepoint, %entry | |
| ; CHECK-LABEL: continue: | |
| ; CHECK: phi | |
| ; CHECK-DAG: [ %q.relocated, %safepoint ] | |
| ; CHECK-DAG: [ %q, %entry ] | |
| ; CHECK: phi | |
| ; CHECK-DAG: [ %p.relocated, %safepoint ] | |
| ; CHECK-DAG: [ %p, %entry ] | |
| ; CHECK: %cond = icmp | |
| ; CHECK: br i1 %cond | |
| ; Sanity check that nothing bad happens if already last instruction | |
| ; before terminator | |
| br i1 %cond, label %taken, label %untaken | |
| taken: ; preds = %continue | |
| ret i1 true | |
| untaken: ; preds = %continue | |
| ret i1 false | |
| } | |
| define i1 @test3(i8 addrspace(1)* %p, i8 addrspace(1)* %q, i1 %rare) gc "statepoint-example" { | |
| ; CHECK-LABEL: @test3 | |
| ; CHECK: gc.statepoint | |
| ; CHECK: %cond = icmp | |
| ; CHECK: br i1 %cond | |
| entry: | |
| call void @safepoint() [ "deopt"() ] | |
| %cond = icmp eq i8 addrspace(1)* %p, %q | |
| br i1 %cond, label %taken, label %untaken | |
| taken: ; preds = %entry | |
| ret i1 true | |
| untaken: ; preds = %entry | |
| ret i1 false | |
| } | |
| declare void @safepoint() | |
| !0 = !{!"branch_weights", i32 1, i32 10000} |