@@ -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+
259367declare i1 @cond ()
368+ declare void @side.effect ()
369+
0 commit comments