Skip to content

Commit 0120e6c

Browse files
committed
[Test] Add more elaborate case of symbolic execution of 1-iteration loop
1 parent c0db8d5 commit 0120e6c

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

llvm/test/Transforms/LoopDeletion/eval_first_iteration.ll

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,3 +648,78 @@ done: ; preds = %backedge
648648
failure:
649649
unreachable
650650
}
651+
652+
; TODO: We can break the backedge here.
653+
define i32 @test_multiple_pred_2() {
654+
; CHECK-LABEL: @test_multiple_pred_2(
655+
; CHECK-NEXT: entry:
656+
; CHECK-NEXT: br label [[LOOP:%.*]]
657+
; CHECK: loop:
658+
; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]
659+
; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]]
660+
; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0
661+
; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
662+
; CHECK: if.true:
663+
; CHECK-NEXT: br i1 undef, label [[IF_TRUE_1:%.*]], label [[IF_TRUE_2:%.*]]
664+
; CHECK: if.true.1:
665+
; CHECK-NEXT: br label [[BACKEDGE]]
666+
; CHECK: if.true.2:
667+
; CHECK-NEXT: br label [[BACKEDGE]]
668+
; CHECK: if.false:
669+
; CHECK-NEXT: br i1 undef, label [[IF_FALSE_1:%.*]], label [[IF_FALSE_2:%.*]]
670+
; CHECK: if.false.1:
671+
; CHECK-NEXT: br label [[BACKEDGE]]
672+
; CHECK: if.false.2:
673+
; CHECK-NEXT: br label [[BACKEDGE]]
674+
; CHECK: backedge:
675+
; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE_1]] ], [ 0, [[IF_FALSE_2]] ], [ [[SUB]], [[IF_TRUE_1]] ], [ [[SUB]], [[IF_TRUE_2]] ]
676+
; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]
677+
; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4
678+
; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]
679+
; CHECK: done:
680+
; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]
681+
; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]
682+
; CHECK: failure:
683+
; CHECK-NEXT: unreachable
684+
;
685+
entry:
686+
687+
br label %loop
688+
689+
loop: ; preds = %backedge, %entry
690+
%sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]
691+
%sub = sub i32 4, %sum
692+
%is.positive = icmp sgt i32 %sub, 0
693+
br i1 %is.positive, label %if.true, label %if.false
694+
695+
if.true:
696+
br i1 undef, label %if.true.1, label %if.true.2
697+
698+
if.true.1:
699+
br label %backedge
700+
701+
if.true.2:
702+
br label %backedge
703+
704+
if.false: ; preds = %loop
705+
br i1 undef, label %if.false.1, label %if.false.2
706+
707+
if.false.1:
708+
br label %backedge
709+
710+
if.false.2:
711+
br label %backedge
712+
713+
backedge:
714+
%merge.phi = phi i32 [ 0, %if.false.1 ], [ 0, %if.false.2 ], [ %sub, %if.true.1 ], [ %sub, %if.true.2 ]
715+
%sum.next = add i32 %sum, %merge.phi
716+
%loop.cond = icmp ne i32 %sum.next, 4
717+
br i1 %loop.cond, label %loop, label %done
718+
719+
done: ; preds = %backedge
720+
%sum.next.lcssa = phi i32 [ %sum.next, %backedge ]
721+
ret i32 %sum.next.lcssa
722+
723+
failure:
724+
unreachable
725+
}

0 commit comments

Comments
 (0)