Skip to content

Commit c6ec563

Browse files
committed
[rs4gc] autogen a bunch of tests for ease of update
1 parent 8fe59ba commit c6ec563

File tree

5 files changed

+698
-362
lines changed

5 files changed

+698
-362
lines changed

llvm/test/Transforms/RewriteStatepointsForGC/base-pointers.ll

Lines changed: 142 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,31 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
12
; RUN: opt < %s -rewrite-statepoints-for-gc -S 2>&1 | FileCheck %s
23
; RUN: opt < %s -passes=rewrite-statepoints-for-gc -S 2>&1 | FileCheck %s
34

4-
; The rewriting needs to make %obj loop variant by inserting a phi
5-
; of the original value and it's relocation.
6-
75
declare i64 addrspace(1)* @generate_obj() "gc-leaf-function"
86

97
declare void @use_obj(i64 addrspace(1)*) "gc-leaf-function"
108

11-
define void @def_use_safepoint() gc "statepoint-example" {
12-
; CHECK-LABEL: def_use_safepoint
13-
; CHECK: phi i64 addrspace(1)*
14-
; CHECK-DAG: [ %obj.relocated.casted, %loop ]
15-
; CHECK-DAG: [ %obj, %entry ]
9+
; The rewriting needs to make %obj loop variant by inserting a phi
10+
; of the original value and it's relocation.
11+
define void @test() gc "statepoint-example" {
12+
; CHECK-LABEL: @test(
13+
; CHECK-NEXT: entry:
14+
; CHECK-NEXT: [[OBJ:%.*]] = call i64 addrspace(1)* @generate_obj()
15+
; CHECK-NEXT: br label [[LOOP:%.*]]
16+
; CHECK: loop:
17+
; CHECK-NEXT: [[DOT0:%.*]] = phi i64 addrspace(1)* [ [[OBJ]], [[ENTRY:%.*]] ], [ [[OBJ_RELOCATED_CASTED:%.*]], [[LOOP]] ]
18+
; CHECK-NEXT: call void @use_obj(i64 addrspace(1)* [[DOT0]])
19+
; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) [ "deopt"(i32 0, i32 -1, i32 0, i32 0, i32 0), "gc-live"(i64 addrspace(1)* [[DOT0]]) ]
20+
; CHECK-NEXT: [[OBJ_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
21+
; CHECK-NEXT: [[OBJ_RELOCATED_CASTED]] = bitcast i8 addrspace(1)* [[OBJ_RELOCATED]] to i64 addrspace(1)*
22+
; CHECK-NEXT: br label [[LOOP]]
23+
;
1624
entry:
1725
%obj = call i64 addrspace(1)* @generate_obj()
1826
br label %loop
1927

20-
loop: ; preds = %loop, %entry
28+
loop:
2129
call void @use_obj(i64 addrspace(1)* %obj)
2230
call void @do_safepoint() [ "deopt"(i32 0, i32 -1, i32 0, i32 0, i32 0) ]
2331
br label %loop
@@ -28,38 +36,54 @@ declare void @do_safepoint()
2836
declare void @parse_point(i64 addrspace(1)*)
2937

3038
define i64 addrspace(1)* @test1(i32 %caller, i8 addrspace(1)* %a, i8 addrspace(1)* %b, i32 %unknown) gc "statepoint-example" {
31-
; CHECK-LABEL: test1
39+
; CHECK-LABEL: @test1(
40+
; CHECK-NEXT: entry:
41+
; CHECK-NEXT: br i1 undef, label [[LEFT:%.*]], label [[RIGHT:%.*]]
42+
; CHECK: left:
43+
; CHECK-NEXT: [[A_CAST:%.*]] = bitcast i8 addrspace(1)* [[A:%.*]] to i64 addrspace(1)*
44+
; CHECK-NEXT: [[CAST:%.*]] = bitcast i8 addrspace(1)* [[A]] to i64 addrspace(1)*
45+
; CHECK-NEXT: switch i32 [[UNKNOWN:%.*]], label [[RIGHT]] [
46+
; CHECK-NEXT: i32 0, label [[MERGE:%.*]]
47+
; CHECK-NEXT: i32 1, label [[MERGE]]
48+
; CHECK-NEXT: i32 5, label [[MERGE]]
49+
; CHECK-NEXT: ]
50+
; CHECK: right:
51+
; CHECK-NEXT: [[B_CAST:%.*]] = bitcast i8 addrspace(1)* [[B:%.*]] to i64 addrspace(1)*
52+
; CHECK-NEXT: [[CAST1:%.*]] = bitcast i8 addrspace(1)* [[B]] to i64 addrspace(1)*
53+
; CHECK-NEXT: br label [[MERGE]]
54+
; CHECK: merge:
55+
; CHECK-NEXT: [[VALUE_BASE:%.*]] = phi i64 addrspace(1)* [ [[CAST]], [[LEFT]] ], [ [[CAST]], [[LEFT]] ], [ [[CAST]], [[LEFT]] ], [ [[CAST1]], [[RIGHT]] ], !is_base_value !0
56+
; CHECK-NEXT: [[VALUE:%.*]] = phi i64 addrspace(1)* [ [[A_CAST]], [[LEFT]] ], [ [[A_CAST]], [[LEFT]] ], [ [[A_CAST]], [[LEFT]] ], [ [[B_CAST]], [[RIGHT]] ]
57+
; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void (i64 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidp1i64f(i64 2882400000, i32 0, void (i64 addrspace(1)*)* @parse_point, i32 1, i32 0, i64 addrspace(1)* [[VALUE]], i32 0, i32 0) [ "deopt"(i32 0, i32 0, i32 0, i32 0, i32 0), "gc-live"(i64 addrspace(1)* [[VALUE]], i64 addrspace(1)* [[VALUE_BASE]]) ]
58+
; CHECK-NEXT: [[VALUE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0)
59+
; CHECK-NEXT: [[VALUE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[VALUE_RELOCATED]] to i64 addrspace(1)*
60+
; CHECK-NEXT: [[VALUE_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1)
61+
; CHECK-NEXT: [[VALUE_BASE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[VALUE_BASE_RELOCATED]] to i64 addrspace(1)*
62+
; CHECK-NEXT: ret i64 addrspace(1)* [[VALUE_RELOCATED_CASTED]]
63+
;
3264
entry:
3365
br i1 undef, label %left, label %right
3466

35-
left: ; preds = %entry
36-
; CHECK: left:
37-
; CHECK-NEXT: %a.cast = bitcast i8 addrspace(1)* %a to i64 addrspace(1)*
38-
; CHECK-NEXT: [[CAST_L:%.*]] = bitcast i8 addrspace(1)* %a to i64 addrspace(1)*
67+
left:
3968
; Our safepoint placement pass calls removeUnreachableBlocks, which does a bunch
4069
; of simplifications to branch instructions. This bug is visible only when
4170
; there are multiple branches into the same block from the same predecessor, and
42-
; the following ceremony is to make that artefact survive a call to
71+
; the following ceremony is to make that artefact survive a call to
4372
; removeUnreachableBlocks. As an example, "br i1 undef, label %merge, label %merge"
4473
; will get simplified to "br label %merge" by removeUnreachableBlocks.
4574
%a.cast = bitcast i8 addrspace(1)* %a to i64 addrspace(1)*
4675
switch i32 %unknown, label %right [
47-
i32 0, label %merge
48-
i32 1, label %merge
49-
i32 5, label %merge
50-
i32 3, label %right
76+
i32 0, label %merge
77+
i32 1, label %merge
78+
i32 5, label %merge
79+
i32 3, label %right
5180
]
5281

53-
right: ; preds = %left, %left, %entry
54-
; CHECK: right:
55-
; CHECK-NEXT: %b.cast = bitcast i8 addrspace(1)* %b to i64 addrspace(1)*
56-
; CHECK-NEXT: [[CAST_R:%.*]] = bitcast i8 addrspace(1)* %b to i64 addrspace(1)*
82+
right:
5783
%b.cast = bitcast i8 addrspace(1)* %b to i64 addrspace(1)*
5884
br label %merge
5985

60-
merge: ; preds = %right, %left, %left, %left
61-
; CHECK: merge:
62-
; CHECK-NEXT: %value.base = phi i64 addrspace(1)* [ [[CAST_L]], %left ], [ [[CAST_L]], %left ], [ [[CAST_L]], %left ], [ [[CAST_R]], %right ], !is_base_value !0
86+
merge:
6387
%value = phi i64 addrspace(1)* [ %a.cast, %left ], [ %a.cast, %left ], [ %a.cast, %left ], [ %b.cast, %right ]
6488
call void @parse_point(i64 addrspace(1)* %value) [ "deopt"(i32 0, i32 0, i32 0, i32 0, i32 0) ]
6589
ret i64 addrspace(1)* %value
@@ -70,26 +94,42 @@ merge: ; preds = %right, %left, %left
7094
;; base phi/select per such node. This is testing an optimization, not a
7195
;; fundemental correctness criteria
7296
define void @test2(i1 %cnd, i64 addrspace(1)* %base_obj, i64 addrspace(1)* %base_arg2) gc "statepoint-example" {
73-
; CHECK-LABEL: @test2
97+
; CHECK-LABEL: @test2(
98+
; CHECK-NEXT: entry:
99+
; CHECK-NEXT: [[OBJ:%.*]] = getelementptr i64, i64 addrspace(1)* [[BASE_OBJ:%.*]], i32 1
100+
; CHECK-NEXT: br label [[LOOP:%.*]]
101+
; CHECK: loop:
102+
; CHECK-NEXT: [[DOT0:%.*]] = phi i64 addrspace(1)* [ [[BASE_ARG2:%.*]], [[ENTRY:%.*]] ], [ [[BASE_ARG2_RELOCATED_CASTED:%.*]], [[LOOP]] ]
103+
; CHECK-NEXT: [[CURRENT_BASE:%.*]] = phi i64 addrspace(1)* [ [[BASE_OBJ]], [[ENTRY]] ], [ [[NEXT_BASE_RELOCATED_CASTED:%.*]], [[LOOP]] ], !is_base_value !0
104+
; CHECK-NEXT: [[CURRENT:%.*]] = phi i64 addrspace(1)* [ [[OBJ]], [[ENTRY]] ], [ [[NEXT_RELOCATED_CASTED:%.*]], [[LOOP]] ]
105+
; CHECK-NEXT: [[EXTRA:%.*]] = phi i64 addrspace(1)* [ [[OBJ]], [[ENTRY]] ], [ [[EXTRA2_RELOCATED_CASTED:%.*]], [[LOOP]] ]
106+
; CHECK-NEXT: [[NEXTA:%.*]] = getelementptr i64, i64 addrspace(1)* [[CURRENT]], i32 1
107+
; CHECK-NEXT: [[NEXT_BASE:%.*]] = select i1 [[CND:%.*]], i64 addrspace(1)* [[CURRENT_BASE]], i64 addrspace(1)* [[DOT0]], !is_base_value !0
108+
; CHECK-NEXT: [[NEXT:%.*]] = select i1 [[CND]], i64 addrspace(1)* [[NEXTA]], i64 addrspace(1)* [[DOT0]]
109+
; CHECK-NEXT: [[EXTRA2_BASE:%.*]] = select i1 [[CND]], i64 addrspace(1)* [[CURRENT_BASE]], i64 addrspace(1)* [[DOT0]], !is_base_value !0
110+
; CHECK-NEXT: [[EXTRA2:%.*]] = select i1 [[CND]], i64 addrspace(1)* [[NEXTA]], i64 addrspace(1)* [[DOT0]]
111+
; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(i32 0, i32 -1, i32 0, i32 0, i32 0), "gc-live"(i64 addrspace(1)* [[NEXT_BASE]], i64 addrspace(1)* [[NEXT]], i64 addrspace(1)* [[EXTRA2]], i64 addrspace(1)* [[DOT0]], i64 addrspace(1)* [[EXTRA2_BASE]]) ]
112+
; CHECK-NEXT: [[NEXT_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
113+
; CHECK-NEXT: [[NEXT_BASE_RELOCATED_CASTED]] = bitcast i8 addrspace(1)* [[NEXT_BASE_RELOCATED]] to i64 addrspace(1)*
114+
; CHECK-NEXT: [[NEXT_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 1)
115+
; CHECK-NEXT: [[NEXT_RELOCATED_CASTED]] = bitcast i8 addrspace(1)* [[NEXT_RELOCATED]] to i64 addrspace(1)*
116+
; CHECK-NEXT: [[EXTRA2_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 4, i32 2)
117+
; CHECK-NEXT: [[EXTRA2_RELOCATED_CASTED]] = bitcast i8 addrspace(1)* [[EXTRA2_RELOCATED]] to i64 addrspace(1)*
118+
; CHECK-NEXT: [[BASE_ARG2_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 3, i32 3)
119+
; CHECK-NEXT: [[BASE_ARG2_RELOCATED_CASTED]] = bitcast i8 addrspace(1)* [[BASE_ARG2_RELOCATED]] to i64 addrspace(1)*
120+
; CHECK-NEXT: [[EXTRA2_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 4, i32 4)
121+
; CHECK-NEXT: [[EXTRA2_BASE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[EXTRA2_BASE_RELOCATED]] to i64 addrspace(1)*
122+
; CHECK-NEXT: br label [[LOOP]]
123+
;
74124
entry:
75125
%obj = getelementptr i64, i64 addrspace(1)* %base_obj, i32 1
76126
br label %loop
77-
; CHECK-LABEL: loop
78-
; CHECK: %current.base = phi i64 addrspace(1)*
79-
; CHECK-DAG: [ %base_obj, %entry ]
80127

81128
; Given the two selects are equivelent, so are their base phis - ideally,
82129
; we'd have commoned these, but that's a missed optimization, not correctness.
83-
; CHECK-DAG: [ [[DISCARD:%.*.base.relocated.casted]], %loop ]
84-
; CHECK-NOT: extra.base
85-
; CHECK: next.base = select
86-
; CHECK: next = select
87-
; CHECK: extra2.base = select
88-
; CHECK: extra2 = select
89-
; CHECK: statepoint
90130
;; Both 'next' and 'extra2' are live across the backedge safepoint...
91131

92-
loop: ; preds = %loop, %entry
132+
loop:
93133
%current = phi i64 addrspace(1)* [ %obj, %entry ], [ %next, %loop ]
94134
%extra = phi i64 addrspace(1)* [ %obj, %entry ], [ %extra2, %loop ]
95135
%nexta = getelementptr i64, i64 addrspace(1)* %current, i32 1
@@ -100,54 +140,84 @@ loop: ; preds = %loop, %entry
100140
}
101141

102142
define i64 addrspace(1)* @test3(i1 %cnd, i64 addrspace(1)* %obj, i64 addrspace(1)* %obj2) gc "statepoint-example" {
103-
; CHECK-LABEL: @test3
143+
; CHECK-LABEL: @test3(
144+
; CHECK-NEXT: entry:
145+
; CHECK-NEXT: br i1 [[CND:%.*]], label [[MERGE:%.*]], label [[TAKEN:%.*]]
146+
; CHECK: taken:
147+
; CHECK-NEXT: br label [[MERGE]]
148+
; CHECK: merge:
149+
; CHECK-NEXT: [[BDV_BASE:%.*]] = phi i64 addrspace(1)* [ [[OBJ:%.*]], [[ENTRY:%.*]] ], [ [[OBJ2:%.*]], [[TAKEN]] ], !is_base_value !0
150+
; CHECK-NEXT: [[BDV:%.*]] = phi i64 addrspace(1)* [ [[OBJ]], [[ENTRY]] ], [ [[OBJ2]], [[TAKEN]] ]
151+
; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(i32 0, i32 -1, i32 0, i32 0, i32 0), "gc-live"(i64 addrspace(1)* [[BDV]], i64 addrspace(1)* [[BDV_BASE]]) ]
152+
; CHECK-NEXT: [[BDV_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0)
153+
; CHECK-NEXT: [[BDV_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BDV_RELOCATED]] to i64 addrspace(1)*
154+
; CHECK-NEXT: [[BDV_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1)
155+
; CHECK-NEXT: [[BDV_BASE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BDV_BASE_RELOCATED]] to i64 addrspace(1)*
156+
; CHECK-NEXT: ret i64 addrspace(1)* [[BDV_RELOCATED_CASTED]]
157+
;
104158
entry:
105159
br i1 %cnd, label %merge, label %taken
106160

107-
taken: ; preds = %entry
161+
taken:
108162
br label %merge
109163

110-
merge: ; preds = %taken, %entry
111-
; CHECK-LABEL: merge:
112-
; CHECK-NEXT: phi
113-
; CHECK-NEXT: phi
114-
; CHECK-NEXT: gc.statepoint
164+
merge:
115165
%bdv = phi i64 addrspace(1)* [ %obj, %entry ], [ %obj2, %taken ]
116166
call void @foo() [ "deopt"(i32 0, i32 -1, i32 0, i32 0, i32 0) ]
117167
ret i64 addrspace(1)* %bdv
118168
}
119169

120170
define i64 addrspace(1)* @test4(i1 %cnd, i64 addrspace(1)* %obj, i64 addrspace(1)* %obj2) gc "statepoint-example" {
121-
; CHECK-LABEL: @test4
171+
; CHECK-LABEL: @test4(
172+
; CHECK-NEXT: entry:
173+
; CHECK-NEXT: br i1 [[CND:%.*]], label [[MERGE:%.*]], label [[TAKEN:%.*]]
174+
; CHECK: taken:
175+
; CHECK-NEXT: br label [[MERGE]]
176+
; CHECK: merge:
177+
; CHECK-NEXT: [[BDV:%.*]] = phi i64 addrspace(1)* [ [[OBJ:%.*]], [[ENTRY:%.*]] ], [ [[OBJ]], [[TAKEN]] ]
178+
; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(i32 0, i32 -1, i32 0, i32 0, i32 0), "gc-live"(i64 addrspace(1)* [[BDV]], i64 addrspace(1)* [[OBJ]]) ]
179+
; CHECK-NEXT: [[BDV_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0)
180+
; CHECK-NEXT: [[BDV_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BDV_RELOCATED]] to i64 addrspace(1)*
181+
; CHECK-NEXT: [[OBJ_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1)
182+
; CHECK-NEXT: [[OBJ_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[OBJ_RELOCATED]] to i64 addrspace(1)*
183+
; CHECK-NEXT: ret i64 addrspace(1)* [[BDV_RELOCATED_CASTED]]
184+
;
122185
entry:
123186
br i1 %cnd, label %merge, label %taken
124187

125-
taken: ; preds = %entry
188+
taken:
126189
br label %merge
127190

128-
merge: ; preds = %taken, %entry
129-
; CHECK-LABEL: merge:
130-
; CHECK-NEXT: phi
131-
; CHECK-NEXT: gc.statepoint
191+
merge:
132192
%bdv = phi i64 addrspace(1)* [ %obj, %entry ], [ %obj, %taken ]
133193
call void @foo() [ "deopt"(i32 0, i32 -1, i32 0, i32 0, i32 0) ]
134194
ret i64 addrspace(1)* %bdv
135195
}
136196

137197
define i64 addrspace(1)* @test5(i1 %cnd, i64 addrspace(1)* %obj, i64 addrspace(1)* %obj2) gc "statepoint-example" {
138-
; CHECK-LABEL: @test5
198+
; CHECK-LABEL: @test5(
199+
; CHECK-NEXT: entry:
200+
; CHECK-NEXT: br label [[MERGE:%.*]]
201+
; CHECK: merge:
202+
; CHECK-NEXT: [[BDV_BASE:%.*]] = phi i64 addrspace(1)* [ [[OBJ:%.*]], [[ENTRY:%.*]] ], [ [[OBJ2:%.*]], [[MERGE]] ], !is_base_value !0
203+
; CHECK-NEXT: [[BDV:%.*]] = phi i64 addrspace(1)* [ [[OBJ]], [[ENTRY]] ], [ [[OBJ2]], [[MERGE]] ]
204+
; CHECK-NEXT: br i1 [[CND:%.*]], label [[MERGE]], label [[NEXT:%.*]]
205+
; CHECK: next:
206+
; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(i32 0, i32 -1, i32 0, i32 0, i32 0), "gc-live"(i64 addrspace(1)* [[BDV]], i64 addrspace(1)* [[BDV_BASE]]) ]
207+
; CHECK-NEXT: [[BDV_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0)
208+
; CHECK-NEXT: [[BDV_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BDV_RELOCATED]] to i64 addrspace(1)*
209+
; CHECK-NEXT: [[BDV_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1)
210+
; CHECK-NEXT: [[BDV_BASE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BDV_BASE_RELOCATED]] to i64 addrspace(1)*
211+
; CHECK-NEXT: ret i64 addrspace(1)* [[BDV_RELOCATED_CASTED]]
212+
;
139213
entry:
140214
br label %merge
141215

142-
merge: ; preds = %merge, %entry
143-
; CHECK-LABEL: merge:
144-
; CHECK-NEXT: phi
145-
; CHECK-NEXT: phi
146-
; CHECK-NEXT: br i1
216+
merge:
147217
%bdv = phi i64 addrspace(1)* [ %obj, %entry ], [ %obj2, %merge ]
148218
br i1 %cnd, label %merge, label %next
149219

150-
next: ; preds = %merge
220+
next:
151221
call void @foo() [ "deopt"(i32 0, i32 -1, i32 0, i32 0, i32 0) ]
152222
ret i64 addrspace(1)* %bdv
153223
}
@@ -156,18 +226,26 @@ next: ; preds = %merge
156226
; result can avoid materializing the extra copy of the BDV phi node.
157227
; (Even without a general forward analysis)
158228
define i64 addrspace(1)* @test6(i1 %cnd, i64 addrspace(1)* %obj, i64 addrspace(1)* %obj2) gc "statepoint-example" {
159-
; CHECK-LABEL: @test6
229+
; CHECK-LABEL: @test6(
230+
; CHECK-NEXT: entry:
231+
; CHECK-NEXT: br label [[MERGE:%.*]]
232+
; CHECK: merge:
233+
; CHECK-NEXT: [[BDV:%.*]] = phi i64 addrspace(1)* [ [[OBJ:%.*]], [[ENTRY:%.*]] ], [ [[OBJ2:%.*]], [[MERGE]] ]
234+
; CHECK-NEXT: br i1 [[CND:%.*]], label [[MERGE]], label [[NEXT:%.*]]
235+
; CHECK: next:
236+
; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(i64 addrspace(1)* [[BDV]]), "gc-live"(i64 addrspace(1)* [[BDV]]) ]
237+
; CHECK-NEXT: [[BDV_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
238+
; CHECK-NEXT: [[BDV_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BDV_RELOCATED]] to i64 addrspace(1)*
239+
; CHECK-NEXT: ret i64 addrspace(1)* [[BDV_RELOCATED_CASTED]]
240+
;
160241
entry:
161242
br label %merge
162243

163-
merge: ; preds = %merge, %entry
164-
; CHECK-LABEL: merge:
165-
; CHECK-NEXT: phi
166-
; CHECK-NEXT: br i1
244+
merge:
167245
%bdv = phi i64 addrspace(1)* [ %obj, %entry ], [ %obj2, %merge ]
168246
br i1 %cnd, label %merge, label %next
169247

170-
next: ; preds = %merge
248+
next:
171249
call void @foo() [ "deopt"(i64 addrspace(1)* %bdv) ]
172250
ret i64 addrspace(1)* %bdv
173251
}

0 commit comments

Comments
 (0)