1; RUN: opt -rewrite-statepoints-for-gc -S < %s | FileCheck %s
2
3; A null test of a single value
4
5define i1 @test(i8 addrspace(1)* %p, i1 %rare) gc "statepoint-example" {
6; CHECK-LABEL: @test
7entry:
8  %cond = icmp eq i8 addrspace(1)* %p, null
9  br i1 %rare, label %safepoint, label %continue, !prof !0
10
11safepoint:                                        ; preds = %entry
12  call void @safepoint() [ "deopt"() ]
13  br label %continue
14
15continue:                                         ; preds = %safepoint, %entry
16; CHECK-LABEL: continue:
17; CHECK: phi
18; CHECK-DAG: [ %p.relocated, %safepoint ]
19; CHECK-DAG: [ %p, %entry ]
20; CHECK: %cond = icmp
21; CHECK: br i1 %cond
22; Comparing two pointers
23  br i1 %cond, label %taken, label %untaken
24
25taken:                                            ; preds = %continue
26  ret i1 true
27
28untaken:                                          ; preds = %continue
29  ret i1 false
30}
31
32define i1 @test2(i8 addrspace(1)* %p, i8 addrspace(1)* %q, i1 %rare) gc "statepoint-example" {
33; CHECK-LABEL: @test2
34entry:
35  %cond = icmp eq i8 addrspace(1)* %p, %q
36  br i1 %rare, label %safepoint, label %continue, !prof !0
37
38safepoint:                                        ; preds = %entry
39  call void @safepoint() [ "deopt"() ]
40  br label %continue
41
42continue:                                         ; preds = %safepoint, %entry
43; CHECK-LABEL: continue:
44; CHECK: phi
45; CHECK-DAG: [ %q.relocated, %safepoint ]
46; CHECK-DAG: [ %q, %entry ]
47; CHECK: phi
48; CHECK-DAG: [ %p.relocated, %safepoint ]
49; CHECK-DAG: [ %p, %entry ]
50; CHECK: %cond = icmp
51; CHECK: br i1 %cond
52; Sanity check that nothing bad happens if already last instruction
53; before terminator
54  br i1 %cond, label %taken, label %untaken
55
56taken:                                            ; preds = %continue
57  ret i1 true
58
59untaken:                                          ; preds = %continue
60  ret i1 false
61}
62
63define i1 @test3(i8 addrspace(1)* %p, i8 addrspace(1)* %q, i1 %rare) gc "statepoint-example" {
64; CHECK-LABEL: @test3
65; CHECK: gc.statepoint
66; CHECK: %cond = icmp
67; CHECK: br i1 %cond
68entry:
69  call void @safepoint() [ "deopt"() ]
70  %cond = icmp eq i8 addrspace(1)* %p, %q
71  br i1 %cond, label %taken, label %untaken
72
73taken:                                            ; preds = %entry
74  ret i1 true
75
76untaken:                                          ; preds = %entry
77  ret i1 false
78}
79
80declare void @safepoint()
81!0 = !{!"branch_weights", i32 1, i32 10000}
82