Skip to content

Commit 3a16873

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

File tree

1 file changed

+110
-0
lines changed

1 file changed

+110
-0
lines changed

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

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,4 +256,114 @@ exit:
256256
ret i8 %bool
257257
}
258258

259+
define i8 @knownbits_phi_phi_test() {
260+
; CHECK-LABEL: @knownbits_phi_phi_test(
261+
; CHECK-NEXT: entry:
262+
; CHECK-NEXT: br label [[LOOP:%.*]]
263+
; CHECK: loop:
264+
; CHECK-NEXT: [[INDVAR:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[CONTAIN:%.*]], [[LOOP_BB1:%.*]] ]
265+
; CHECK-NEXT: [[COND0:%.*]] = call i1 @cond()
266+
; CHECK-NEXT: br i1 [[COND0]], label [[LOOP_BB0:%.*]], label [[LOOP_BB1]]
267+
; CHECK: loop.bb0:
268+
; CHECK-NEXT: call void @side.effect()
269+
; CHECK-NEXT: br label [[LOOP_BB1]]
270+
; CHECK: loop.bb1:
271+
; CHECK-NEXT: [[CONTAIN]] = phi i8 [ 1, [[LOOP_BB0]] ], [ [[INDVAR]], [[LOOP]] ]
272+
; CHECK-NEXT: [[COND1:%.*]] = call i1 @cond()
273+
; CHECK-NEXT: br i1 [[COND1]], label [[EXIT:%.*]], label [[LOOP]]
274+
; CHECK: exit:
275+
; CHECK-NEXT: [[BOOL:%.*]] = and i8 [[CONTAIN]], 1
276+
; CHECK-NEXT: ret i8 [[BOOL]]
277+
;
278+
entry:
279+
br label %loop
280+
281+
loop:
282+
%indvar = phi i8 [ 0, %entry ], [ %contain, %loop.bb1 ]
283+
%cond0 = call i1 @cond()
284+
br i1 %cond0, label %loop.bb0, label %loop.bb1
285+
loop.bb0:
286+
call void @side.effect()
287+
br label %loop.bb1
288+
loop.bb1:
289+
%contain = phi i8 [ 1, %loop.bb0 ], [ %indvar, %loop ]
290+
%cond1 = call i1 @cond()
291+
br i1 %cond1, label %exit, label %loop
292+
293+
exit:
294+
%bool = and i8 %contain, 1
295+
ret i8 %bool
296+
}
297+
298+
299+
define i1 @known_non_zero_phi_phi_test() {
300+
; CHECK-LABEL: @known_non_zero_phi_phi_test(
301+
; CHECK-NEXT: entry:
302+
; CHECK-NEXT: br label [[LOOP:%.*]]
303+
; CHECK: loop:
304+
; CHECK-NEXT: [[INDVAR:%.*]] = phi i8 [ 2, [[ENTRY:%.*]] ], [ [[CONTAIN:%.*]], [[LOOP_BB1:%.*]] ]
305+
; CHECK-NEXT: [[COND0:%.*]] = call i1 @cond()
306+
; CHECK-NEXT: br i1 [[COND0]], label [[LOOP_BB0:%.*]], label [[LOOP_BB1]]
307+
; CHECK: loop.bb0:
308+
; CHECK-NEXT: call void @side.effect()
309+
; CHECK-NEXT: br label [[LOOP_BB1]]
310+
; CHECK: loop.bb1:
311+
; CHECK-NEXT: [[CONTAIN]] = phi i8 [ 1, [[LOOP_BB0]] ], [ [[INDVAR]], [[LOOP]] ]
312+
; CHECK-NEXT: [[COND1:%.*]] = call i1 @cond()
313+
; CHECK-NEXT: br i1 [[COND1]], label [[EXIT:%.*]], label [[LOOP]]
314+
; CHECK: exit:
315+
; CHECK-NEXT: [[BOOL:%.*]] = icmp eq i8 [[CONTAIN]], 0
316+
; CHECK-NEXT: ret i1 [[BOOL]]
317+
;
318+
entry:
319+
br label %loop
320+
321+
loop:
322+
%indvar = phi i8 [ 2, %entry ], [ %contain, %loop.bb1 ]
323+
%cond0 = call i1 @cond()
324+
br i1 %cond0, label %loop.bb0, label %loop.bb1
325+
loop.bb0:
326+
call void @side.effect()
327+
br label %loop.bb1
328+
loop.bb1:
329+
%contain = phi i8 [ 1, %loop.bb0 ], [ %indvar, %loop ]
330+
%cond1 = call i1 @cond()
331+
br i1 %cond1, label %exit, label %loop
332+
333+
exit:
334+
%bool = icmp eq i8 %contain, 0
335+
ret i1 %bool
336+
}
337+
338+
define i1 @known_non_zero_phi_select_test() {
339+
; CHECK-LABEL: @known_non_zero_phi_select_test(
340+
; CHECK-NEXT: entry:
341+
; CHECK-NEXT: br label [[LOOP:%.*]]
342+
; CHECK: loop:
343+
; CHECK-NEXT: [[INDVAR:%.*]] = phi i8 [ 2, [[ENTRY:%.*]] ], [ [[CONTAIN:%.*]], [[LOOP]] ]
344+
; CHECK-NEXT: [[COND0:%.*]] = call i1 @cond()
345+
; CHECK-NEXT: [[CONTAIN]] = select i1 [[COND0]], i8 1, i8 [[INDVAR]]
346+
; CHECK-NEXT: [[COND1:%.*]] = call i1 @cond()
347+
; CHECK-NEXT: br i1 [[COND1]], label [[EXIT:%.*]], label [[LOOP]]
348+
; CHECK: exit:
349+
; CHECK-NEXT: [[BOOL:%.*]] = icmp eq i8 [[CONTAIN]], 0
350+
; CHECK-NEXT: ret i1 [[BOOL]]
351+
;
352+
entry:
353+
br label %loop
354+
355+
loop:
356+
%indvar = phi i8 [ 2, %entry ], [ %contain, %loop ]
357+
%cond0 = call i1 @cond()
358+
%contain = select i1 %cond0, i8 1, i8 %indvar
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+
259367
declare i1 @cond()
368+
declare void @side.effect()
369+

0 commit comments

Comments
 (0)