xref: /llvm-project/llvm/test/Transforms/IndVarSimplify/exit-count-select.ll (revision f15ed06a65de2715130ffeba5ed3698a08047d27)
16a563e25SRoman Lebedev; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*f15ed06aSBjorn Pettersson; RUN: opt < %s -passes=indvars -S | FileCheck %s
36a563e25SRoman Lebedev
46a563e25SRoman Lebedevdefine i32 @logical_and_2ops(i32 %n, i32 %m) {
56a563e25SRoman Lebedev; CHECK-LABEL: @logical_and_2ops(
66a563e25SRoman Lebedev; CHECK-NEXT:  entry:
7e9a1c82dSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = freeze i32 [[M:%.*]]
86a563e25SRoman Lebedev; CHECK-NEXT:    br label [[LOOP:%.*]]
96a563e25SRoman Lebedev; CHECK:       loop:
1082fb4f4bSRoman Lebedev; CHECK-NEXT:    br i1 false, label [[LOOP]], label [[EXIT:%.*]]
116a563e25SRoman Lebedev; CHECK:       exit:
12e9a1c82dSNikita Popov; CHECK-NEXT:    [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[TMP0]], i32 [[N:%.*]])
13e9a1c82dSNikita Popov; CHECK-NEXT:    ret i32 [[UMIN]]
146a563e25SRoman Lebedev;
156a563e25SRoman Lebedeventry:
166a563e25SRoman Lebedev  br label %loop
176a563e25SRoman Lebedevloop:
186a563e25SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
196a563e25SRoman Lebedev  %i.next = add i32 %i, 1
206a563e25SRoman Lebedev  %cond_p0 = icmp ult i32 %i, %n
216a563e25SRoman Lebedev  %cond_p1 = icmp ult i32 %i, %m
226a563e25SRoman Lebedev  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
236a563e25SRoman Lebedev  br i1 %cond, label %loop, label %exit
246a563e25SRoman Lebedevexit:
256a563e25SRoman Lebedev  ret i32 %i
266a563e25SRoman Lebedev}
276a563e25SRoman Lebedev
286a563e25SRoman Lebedevdefine i32 @logical_or_2ops(i32 %n, i32 %m) {
296a563e25SRoman Lebedev; CHECK-LABEL: @logical_or_2ops(
306a563e25SRoman Lebedev; CHECK-NEXT:  entry:
31e9a1c82dSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = freeze i32 [[M:%.*]]
326a563e25SRoman Lebedev; CHECK-NEXT:    br label [[LOOP:%.*]]
336a563e25SRoman Lebedev; CHECK:       loop:
3482fb4f4bSRoman Lebedev; CHECK-NEXT:    br i1 true, label [[EXIT:%.*]], label [[LOOP]]
356a563e25SRoman Lebedev; CHECK:       exit:
36e9a1c82dSNikita Popov; CHECK-NEXT:    [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[TMP0]], i32 [[N:%.*]])
37e9a1c82dSNikita Popov; CHECK-NEXT:    ret i32 [[UMIN]]
386a563e25SRoman Lebedev;
396a563e25SRoman Lebedeventry:
406a563e25SRoman Lebedev  br label %loop
416a563e25SRoman Lebedevloop:
426a563e25SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
436a563e25SRoman Lebedev  %i.next = add i32 %i, 1
446a563e25SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %n
456a563e25SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %m
466a563e25SRoman Lebedev  %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
476a563e25SRoman Lebedev  br i1 %cond, label %exit, label %loop
486a563e25SRoman Lebedevexit:
496a563e25SRoman Lebedev  ret i32 %i
506a563e25SRoman Lebedev}
516a563e25SRoman Lebedev
526a563e25SRoman Lebedevdefine i32 @logical_and_3ops(i32 %n, i32 %m, i32 %k) {
536a563e25SRoman Lebedev; CHECK-LABEL: @logical_and_3ops(
546a563e25SRoman Lebedev; CHECK-NEXT:  entry:
55e9a1c82dSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = freeze i32 [[K:%.*]]
56e9a1c82dSNikita Popov; CHECK-NEXT:    [[TMP1:%.*]] = freeze i32 [[M:%.*]]
57e9a1c82dSNikita Popov; CHECK-NEXT:    [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[TMP0]], i32 [[TMP1]])
586a563e25SRoman Lebedev; CHECK-NEXT:    br label [[LOOP:%.*]]
596a563e25SRoman Lebedev; CHECK:       loop:
6082fb4f4bSRoman Lebedev; CHECK-NEXT:    br i1 false, label [[LOOP]], label [[EXIT:%.*]]
616a563e25SRoman Lebedev; CHECK:       exit:
62e9a1c82dSNikita Popov; CHECK-NEXT:    [[UMIN1:%.*]] = call i32 @llvm.umin.i32(i32 [[UMIN]], i32 [[N:%.*]])
63e9a1c82dSNikita Popov; CHECK-NEXT:    ret i32 [[UMIN1]]
646a563e25SRoman Lebedev;
656a563e25SRoman Lebedeventry:
666a563e25SRoman Lebedev  br label %loop
676a563e25SRoman Lebedevloop:
686a563e25SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
696a563e25SRoman Lebedev  %i.next = add i32 %i, 1
706a563e25SRoman Lebedev  %cond_p0 = icmp ult i32 %i, %n
716a563e25SRoman Lebedev  %cond_p1 = icmp ult i32 %i, %m
726a563e25SRoman Lebedev  %cond_p2 = icmp ult i32 %i, %k
736a563e25SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 %cond_p1, i1 false
746a563e25SRoman Lebedev  %cond = select i1 %cond_p3, i1 %cond_p2, i1 false
756a563e25SRoman Lebedev  br i1 %cond, label %loop, label %exit
766a563e25SRoman Lebedevexit:
776a563e25SRoman Lebedev  ret i32 %i
786a563e25SRoman Lebedev}
796a563e25SRoman Lebedev
806a563e25SRoman Lebedevdefine i32 @logical_or_3ops(i32 %n, i32 %m, i32 %k) {
816a563e25SRoman Lebedev; CHECK-LABEL: @logical_or_3ops(
826a563e25SRoman Lebedev; CHECK-NEXT:  entry:
83e9a1c82dSNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = freeze i32 [[K:%.*]]
84e9a1c82dSNikita Popov; CHECK-NEXT:    [[TMP1:%.*]] = freeze i32 [[M:%.*]]
85e9a1c82dSNikita Popov; CHECK-NEXT:    [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[TMP0]], i32 [[TMP1]])
866a563e25SRoman Lebedev; CHECK-NEXT:    br label [[LOOP:%.*]]
876a563e25SRoman Lebedev; CHECK:       loop:
8882fb4f4bSRoman Lebedev; CHECK-NEXT:    br i1 true, label [[EXIT:%.*]], label [[LOOP]]
896a563e25SRoman Lebedev; CHECK:       exit:
90e9a1c82dSNikita Popov; CHECK-NEXT:    [[UMIN1:%.*]] = call i32 @llvm.umin.i32(i32 [[UMIN]], i32 [[N:%.*]])
91e9a1c82dSNikita Popov; CHECK-NEXT:    ret i32 [[UMIN1]]
926a563e25SRoman Lebedev;
936a563e25SRoman Lebedeventry:
946a563e25SRoman Lebedev  br label %loop
956a563e25SRoman Lebedevloop:
966a563e25SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
976a563e25SRoman Lebedev  %i.next = add i32 %i, 1
986a563e25SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %n
996a563e25SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %m
1006a563e25SRoman Lebedev  %cond_p2 = icmp uge i32 %i, %k
1016a563e25SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
1026a563e25SRoman Lebedev  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
1036a563e25SRoman Lebedev  br i1 %cond, label %exit, label %loop
1046a563e25SRoman Lebedevexit:
1056a563e25SRoman Lebedev  ret i32 %i
1066a563e25SRoman Lebedev}
107