@@ -235,3 +235,64 @@ define i8 @test19(i8 %x) {
235
235
%r = call i8 @llvm.smax (i8 %x , i8 42 )
236
236
ret i8 %r
237
237
}
238
+
239
+ declare void @body (i32 )
240
+
241
+ define void @test_bidirectional () {
242
+ ; CHECK-LABEL: @test_bidirectional(
243
+ ; CHECK-NEXT: entry:
244
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
245
+ ; CHECK: for.body:
246
+ ; CHECK-NEXT: [[INDVAR:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
247
+ ; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[INDVAR]], i32 65535)
248
+ ; CHECK-NEXT: call void @body(i32 [[SMAX]])
249
+ ; CHECK-NEXT: [[INC]] = add nsw i32 [[INDVAR]], 1
250
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[INDVAR]], 65535
251
+ ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[EXIT:%.*]]
252
+ ; CHECK: exit:
253
+ ; CHECK-NEXT: ret void
254
+ ;
255
+ entry:
256
+ br label %for.body
257
+
258
+ for.body:
259
+ %indvar = phi i32 [ 0 , %entry ], [ %inc , %for.body ]
260
+ %smax = call i32 @llvm.smax.i32 (i32 %indvar , i32 65535 )
261
+ call void @body (i32 %smax )
262
+ %inc = add nsw i32 %indvar , 1
263
+ %cmp = icmp slt i32 %indvar , 65535
264
+ br i1 %cmp , label %for.body , label %exit
265
+
266
+ exit:
267
+ ret void
268
+ }
269
+
270
+ define i64 @test_at_use (i1 %cond , i64 %x ) {
271
+ ; CHECK-LABEL: @test_at_use(
272
+ ; CHECK-NEXT: entry:
273
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB1:%.*]], label [[IF_END:%.*]]
274
+ ; CHECK: bb1:
275
+ ; CHECK-NEXT: [[VAL:%.*]] = call i64 @llvm.smax.i64(i64 [[X:%.*]], i64 -1)
276
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[X]], 0
277
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END]]
278
+ ; CHECK: if.then:
279
+ ; CHECK-NEXT: ret i64 0
280
+ ; CHECK: if.end:
281
+ ; CHECK-NEXT: [[PHI:%.*]] = phi i64 [ [[VAL]], [[BB1]] ], [ 0, [[ENTRY:%.*]] ]
282
+ ; CHECK-NEXT: ret i64 [[PHI]]
283
+ ;
284
+ entry:
285
+ br i1 %cond , label %bb1 , label %if.end
286
+
287
+ bb1:
288
+ %val = call i64 @llvm.smax.i64 (i64 %x , i64 -1 )
289
+ %cmp = icmp slt i64 %x , 0
290
+ br i1 %cmp , label %if.then , label %if.end
291
+
292
+ if.then:
293
+ ret i64 0
294
+
295
+ if.end:
296
+ %phi = phi i64 [%val , %bb1 ], [0 , %entry ]
297
+ ret i64 %phi
298
+ }
0 commit comments