@@ -256,4 +256,143 @@ exit:
256256 ret i8 %bool
257257}
258258
259+ define i8 @knownbits_umax_select_test () {
260+ ; CHECK-LABEL: @knownbits_umax_select_test(
261+ ; CHECK-NEXT: entry:
262+ ; CHECK-NEXT: br label [[LOOP:%.*]]
263+ ; CHECK: loop:
264+ ; CHECK-NEXT: [[INDVAR:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[CONTAIN:%.*]], [[LOOP]] ]
265+ ; CHECK-NEXT: [[COND0:%.*]] = call i1 @cond()
266+ ; CHECK-NEXT: [[CONTAIN]] = call i8 @llvm.umax.i8(i8 [[INDVAR]], i8 1)
267+ ; CHECK-NEXT: [[COND1:%.*]] = call i1 @cond()
268+ ; CHECK-NEXT: br i1 [[COND1]], label [[EXIT:%.*]], label [[LOOP]]
269+ ; CHECK: exit:
270+ ; CHECK-NEXT: [[BOOL:%.*]] = and i8 [[CONTAIN]], 1
271+ ; CHECK-NEXT: ret i8 [[BOOL]]
272+ ;
273+ entry:
274+ br label %loop
275+
276+ loop:
277+ %indvar = phi i8 [ 0 , %entry ], [ %contain , %loop ]
278+ %cond0 = call i1 @cond ()
279+ %contain = call i8 @llvm.umax.i8 (i8 1 , i8 %indvar )
280+ %cond1 = call i1 @cond ()
281+ br i1 %cond1 , label %exit , label %loop
282+
283+ exit:
284+ %bool = and i8 %contain , 1
285+ ret i8 %bool
286+ }
287+
288+ define i8 @knownbits_phi_phi_test () {
289+ ; CHECK-LABEL: @knownbits_phi_phi_test(
290+ ; CHECK-NEXT: entry:
291+ ; CHECK-NEXT: br label [[LOOP:%.*]]
292+ ; CHECK: loop:
293+ ; CHECK-NEXT: [[INDVAR:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[CONTAIN:%.*]], [[LOOP_BB1:%.*]] ]
294+ ; CHECK-NEXT: [[COND0:%.*]] = call i1 @cond()
295+ ; CHECK-NEXT: br i1 [[COND0]], label [[LOOP_BB0:%.*]], label [[LOOP_BB1]]
296+ ; CHECK: loop.bb0:
297+ ; CHECK-NEXT: call void @side.effect()
298+ ; CHECK-NEXT: br label [[LOOP_BB1]]
299+ ; CHECK: loop.bb1:
300+ ; CHECK-NEXT: [[CONTAIN]] = phi i8 [ 1, [[LOOP_BB0]] ], [ [[INDVAR]], [[LOOP]] ]
301+ ; CHECK-NEXT: [[COND1:%.*]] = call i1 @cond()
302+ ; CHECK-NEXT: br i1 [[COND1]], label [[EXIT:%.*]], label [[LOOP]]
303+ ; CHECK: exit:
304+ ; CHECK-NEXT: [[BOOL:%.*]] = and i8 [[CONTAIN]], 1
305+ ; CHECK-NEXT: ret i8 [[BOOL]]
306+ ;
307+ entry:
308+ br label %loop
309+
310+ loop:
311+ %indvar = phi i8 [ 0 , %entry ], [ %contain , %loop.bb1 ]
312+ %cond0 = call i1 @cond ()
313+ br i1 %cond0 , label %loop.bb0 , label %loop.bb1
314+ loop.bb0:
315+ call void @side.effect ()
316+ br label %loop.bb1
317+ loop.bb1:
318+ %contain = phi i8 [ 1 , %loop.bb0 ], [ %indvar , %loop ]
319+ %cond1 = call i1 @cond ()
320+ br i1 %cond1 , label %exit , label %loop
321+
322+ exit:
323+ %bool = and i8 %contain , 1
324+ ret i8 %bool
325+ }
326+
327+
328+ define i1 @known_non_zero_phi_phi_test () {
329+ ; CHECK-LABEL: @known_non_zero_phi_phi_test(
330+ ; CHECK-NEXT: entry:
331+ ; CHECK-NEXT: br label [[LOOP:%.*]]
332+ ; CHECK: loop:
333+ ; CHECK-NEXT: [[INDVAR:%.*]] = phi i8 [ 2, [[ENTRY:%.*]] ], [ [[CONTAIN:%.*]], [[LOOP_BB1:%.*]] ]
334+ ; CHECK-NEXT: [[COND0:%.*]] = call i1 @cond()
335+ ; CHECK-NEXT: br i1 [[COND0]], label [[LOOP_BB0:%.*]], label [[LOOP_BB1]]
336+ ; CHECK: loop.bb0:
337+ ; CHECK-NEXT: call void @side.effect()
338+ ; CHECK-NEXT: br label [[LOOP_BB1]]
339+ ; CHECK: loop.bb1:
340+ ; CHECK-NEXT: [[CONTAIN]] = phi i8 [ 1, [[LOOP_BB0]] ], [ [[INDVAR]], [[LOOP]] ]
341+ ; CHECK-NEXT: [[COND1:%.*]] = call i1 @cond()
342+ ; CHECK-NEXT: br i1 [[COND1]], label [[EXIT:%.*]], label [[LOOP]]
343+ ; CHECK: exit:
344+ ; CHECK-NEXT: [[BOOL:%.*]] = icmp eq i8 [[CONTAIN]], 0
345+ ; CHECK-NEXT: ret i1 [[BOOL]]
346+ ;
347+ entry:
348+ br label %loop
349+
350+ loop:
351+ %indvar = phi i8 [ 2 , %entry ], [ %contain , %loop.bb1 ]
352+ %cond0 = call i1 @cond ()
353+ br i1 %cond0 , label %loop.bb0 , label %loop.bb1
354+ loop.bb0:
355+ call void @side.effect ()
356+ br label %loop.bb1
357+ loop.bb1:
358+ %contain = phi i8 [ 1 , %loop.bb0 ], [ %indvar , %loop ]
359+ %cond1 = call i1 @cond ()
360+ br i1 %cond1 , label %exit , label %loop
361+
362+ exit:
363+ %bool = icmp eq i8 %contain , 0
364+ ret i1 %bool
365+ }
366+
367+ define i1 @known_non_zero_phi_select_test () {
368+ ; CHECK-LABEL: @known_non_zero_phi_select_test(
369+ ; CHECK-NEXT: entry:
370+ ; CHECK-NEXT: br label [[LOOP:%.*]]
371+ ; CHECK: loop:
372+ ; CHECK-NEXT: [[INDVAR:%.*]] = phi i8 [ 2, [[ENTRY:%.*]] ], [ [[CONTAIN:%.*]], [[LOOP]] ]
373+ ; CHECK-NEXT: [[COND0:%.*]] = call i1 @cond()
374+ ; CHECK-NEXT: [[CONTAIN]] = select i1 [[COND0]], i8 1, i8 [[INDVAR]]
375+ ; CHECK-NEXT: [[COND1:%.*]] = call i1 @cond()
376+ ; CHECK-NEXT: br i1 [[COND1]], label [[EXIT:%.*]], label [[LOOP]]
377+ ; CHECK: exit:
378+ ; CHECK-NEXT: [[BOOL:%.*]] = icmp eq i8 [[CONTAIN]], 0
379+ ; CHECK-NEXT: ret i1 [[BOOL]]
380+ ;
381+ entry:
382+ br label %loop
383+
384+ loop:
385+ %indvar = phi i8 [ 2 , %entry ], [ %contain , %loop ]
386+ %cond0 = call i1 @cond ()
387+ %contain = select i1 %cond0 , i8 1 , i8 %indvar
388+ %cond1 = call i1 @cond ()
389+ br i1 %cond1 , label %exit , label %loop
390+
391+ exit:
392+ %bool = icmp eq i8 %contain , 0
393+ ret i1 %bool
394+ }
395+
259396declare i1 @cond ()
397+ declare void @side.effect ()
398+
0 commit comments