Skip to content

Commit 15e0b46

Browse files
committed
[ValueTracking] Add tests for handling recursive select/phi in computeKnownBits/isKnownNonZero; NFC
1 parent 79178ca commit 15e0b46

File tree

1 file changed

+139
-0
lines changed

1 file changed

+139
-0
lines changed

llvm/test/Transforms/InstCombine/known-phi-recurse.ll

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
259396
declare i1 @cond()
397+
declare void @side.effect()
398+

0 commit comments

Comments
 (0)