@@ -143,9 +143,121 @@ merge2:
143
143
ret i8 addrspace (1 )* %b6
144
144
}
145
145
146
- define i8 addrspace (1 )* @test5 (i1 %c , i32 %n , i8 addrspace (1 )* %b1 , i8 addrspace (1 )* %b2 ) gc "statepoint-example" {
146
+ define i8 addrspace (1 )* @test5 (i1 %c1 , i1 %c2 , i8 addrspace (1 )* %b1 , i8 addrspace (1 )* %b2 ) gc "statepoint-example" {
147
147
; CHECK-LABEL: @test5(
148
148
; CHECK-NEXT: entry:
149
+ ; CHECK-NEXT: br i1 [[C1:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
150
+ ; CHECK: loop:
151
+ ; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[ENTRY:%.*]] ], [ [[B5:%.*]], [[LEFT:%.*]] ]
152
+ ; CHECK-NEXT: [[B4:%.*]] = addrspacecast i8 addrspace(1)* [[B3]] to i8*
153
+ ; CHECK-NEXT: br i1 [[C1]], label [[LEFT]], label [[MERGE2]]
154
+ ; CHECK: left:
155
+ ; CHECK-NEXT: [[B5]] = addrspacecast i8* [[B4]] to i8 addrspace(1)*
156
+ ; CHECK-NEXT: br i1 [[C2:%.*]], label [[LOOP]], label [[MERGE2]]
157
+ ; CHECK: merge2:
158
+ ; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[ENTRY]] ], [ [[B2]], [[LOOP]] ], [ [[B2]], [[LEFT]] ], !is_base_value !0
159
+ ; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[ENTRY]] ], [ [[B3]], [[LOOP]] ], [ [[B5]], [[LEFT]] ]
160
+ ; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i8 addrspace(1)* [[B6]], i8 addrspace(1)* [[B6_BASE]]) ]
161
+ ; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0)
162
+ ; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1)
163
+ ; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]]
164
+ ;
165
+ entry:
166
+ br i1 %c1 , label %loop , label %merge2
167
+
168
+ loop:
169
+ %b3 = phi i8 addrspace (1 )* [ %b2 , %entry ], [ %b5 , %left ]
170
+ %b4 = addrspacecast i8 addrspace (1 )* %b3 to i8*
171
+ br i1 %c1 , label %left , label %merge2
172
+
173
+ left:
174
+ %b5 = addrspacecast i8* %b4 to i8 addrspace (1 )*
175
+ br i1 %c2 , label %loop , label %merge2
176
+
177
+ merge2:
178
+ %b6 = phi i8 addrspace (1 )* [ %b1 , %entry ], [ %b3 , %loop ], [ %b5 , %left ]
179
+ call void @foo () [ "deopt" () ]
180
+ ret i8 addrspace (1 )* %b6
181
+ }
182
+
183
+ define i8 addrspace (1 )* @test6 (i1 %c1 , i1 %c2 , i8 addrspace (1 )* %b1 , i8 addrspace (1 )* %b2 ) gc "statepoint-example" {
184
+ ; CHECK-LABEL: @test6(
185
+ ; CHECK-NEXT: entry:
186
+ ; CHECK-NEXT: br i1 [[C1:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
187
+ ; CHECK: loop:
188
+ ; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[ENTRY:%.*]] ], [ [[B3]], [[LEFT:%.*]] ]
189
+ ; CHECK-NEXT: br i1 [[C1]], label [[LEFT]], label [[MERGE2]]
190
+ ; CHECK: left:
191
+ ; CHECK-NEXT: br i1 [[C2:%.*]], label [[LOOP]], label [[MERGE2]]
192
+ ; CHECK: merge2:
193
+ ; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[ENTRY]] ], [ [[B2]], [[LOOP]] ], [ [[B2]], [[LEFT]] ], !is_base_value !0
194
+ ; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[ENTRY]] ], [ [[B3]], [[LOOP]] ], [ [[B3]], [[LEFT]] ]
195
+ ; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i8 addrspace(1)* [[B6]], i8 addrspace(1)* [[B6_BASE]]) ]
196
+ ; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0)
197
+ ; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1)
198
+ ; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]]
199
+ ;
200
+ entry:
201
+ br i1 %c1 , label %loop , label %merge2
202
+
203
+ loop:
204
+ %b3 = phi i8 addrspace (1 )* [ %b2 , %entry ], [ %b4 , %left ]
205
+ br i1 %c1 , label %left , label %merge2
206
+
207
+ left:
208
+ %b4 = phi i8 addrspace (1 )* [ %b3 , %loop ]
209
+ br i1 %c2 , label %loop , label %merge2
210
+
211
+ merge2:
212
+ %b6 = phi i8 addrspace (1 )* [ %b1 , %entry ], [ %b3 , %loop ], [ %b4 , %left ]
213
+ call void @foo () [ "deopt" () ]
214
+ ret i8 addrspace (1 )* %b6
215
+ }
216
+
217
+ declare i8 addrspace (1 )* @returned_arg (i8 addrspace (1 )* returned %p )
218
+
219
+ define i8 addrspace (1 )* @test7 (i1 %c1 , i1 %c2 , i8 addrspace (1 )* %b1 , i8 addrspace (1 )* %b2 ) gc "statepoint-example" {
220
+ ; CHECK-LABEL: @test7(
221
+ ; CHECK-NEXT: entry:
222
+ ; CHECK-NEXT: br i1 [[C1:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
223
+ ; CHECK: loop:
224
+ ; CHECK-NEXT: [[B3_BASE:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[ENTRY:%.*]] ], [ [[B41:%.*]], [[LEFT:%.*]] ], !is_base_value !0
225
+ ; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2]], [[ENTRY]] ], [ [[B41]], [[LEFT]] ]
226
+ ; CHECK-NEXT: br i1 [[C1]], label [[LEFT]], label [[MERGE2]]
227
+ ; CHECK: left:
228
+ ; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, i8 addrspace(1)* (i8 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_p1i8p1i8f(i64 2882400000, i32 0, i8 addrspace(1)* (i8 addrspace(1)*)* elementtype(i8 addrspace(1)* (i8 addrspace(1)*)) @returned_arg, i32 1, i32 0, i8 addrspace(1)* [[B3]], i32 0, i32 0) [ "gc-live"(i8 addrspace(1)* [[B3_BASE]], i8 addrspace(1)* [[B3]]) ]
229
+ ; CHECK-NEXT: [[B41]] = call i8 addrspace(1)* @llvm.experimental.gc.result.p1i8(token [[STATEPOINT_TOKEN]])
230
+ ; CHECK-NEXT: [[B3_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
231
+ ; CHECK-NEXT: [[B3_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 1)
232
+ ; CHECK-NEXT: br i1 [[C2:%.*]], label [[LOOP]], label [[MERGE2]]
233
+ ; CHECK: merge2:
234
+ ; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[ENTRY]] ], [ [[B3_BASE]], [[LOOP]] ], [ [[B41]], [[LEFT]] ], !is_base_value !0
235
+ ; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[ENTRY]] ], [ [[B3]], [[LOOP]] ], [ [[B41]], [[LEFT]] ]
236
+ ; CHECK-NEXT: [[STATEPOINT_TOKEN2:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i8 addrspace(1)* [[B6]], i8 addrspace(1)* [[B6_BASE]]) ]
237
+ ; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN2]], i32 1, i32 0)
238
+ ; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN2]], i32 1, i32 1)
239
+ ; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]]
240
+ ;
241
+ entry:
242
+ br i1 %c1 , label %loop , label %merge2
243
+
244
+ loop:
245
+ %b3 = phi i8 addrspace (1 )* [ %b2 , %entry ], [ %b4 , %left ]
246
+ br i1 %c1 , label %left , label %merge2
247
+
248
+ left:
249
+ %b4 = call i8 addrspace (1 )* @returned_arg (i8 addrspace (1 )* %b3 )
250
+ br i1 %c2 , label %loop , label %merge2
251
+
252
+ merge2:
253
+ %b6 = phi i8 addrspace (1 )* [ %b1 , %entry ], [ %b3 , %loop ], [ %b4 , %left ]
254
+ call void @foo () [ "deopt" () ]
255
+ ret i8 addrspace (1 )* %b6
256
+ }
257
+
258
+ define i8 addrspace (1 )* @test8 (i1 %c , i32 %n , i8 addrspace (1 )* %b1 , i8 addrspace (1 )* %b2 ) gc "statepoint-example" {
259
+ ; CHECK-LABEL: @test8(
260
+ ; CHECK-NEXT: entry:
149
261
; CHECK-NEXT: br label [[LEFT:%.*]]
150
262
; CHECK: left:
151
263
; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
0 commit comments