1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -indvars -S | FileCheck %s 3 4define i32 @logical_and_2ops(i32 %n, i32 %m) { 5; CHECK-LABEL: @logical_and_2ops( 6; CHECK-NEXT: entry: 7; CHECK-NEXT: br label [[LOOP:%.*]] 8; CHECK: loop: 9; CHECK-NEXT: br i1 false, label [[LOOP]], label [[EXIT:%.*]] 10; CHECK: exit: 11; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[M:%.*]], i32 [[N:%.*]]) 12; CHECK-NEXT: ret i32 [[UMIN]] 13; 14entry: 15 br label %loop 16loop: 17 %i = phi i32 [0, %entry], [%i.next, %loop] 18 %i.next = add i32 %i, 1 19 %cond_p0 = icmp ult i32 %i, %n 20 %cond_p1 = icmp ult i32 %i, %m 21 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 22 br i1 %cond, label %loop, label %exit 23exit: 24 ret i32 %i 25} 26 27define i32 @logical_or_2ops(i32 %n, i32 %m) { 28; CHECK-LABEL: @logical_or_2ops( 29; CHECK-NEXT: entry: 30; CHECK-NEXT: br label [[LOOP:%.*]] 31; CHECK: loop: 32; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[LOOP]] 33; CHECK: exit: 34; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[M:%.*]], i32 [[N:%.*]]) 35; CHECK-NEXT: ret i32 [[UMIN]] 36; 37entry: 38 br label %loop 39loop: 40 %i = phi i32 [0, %entry], [%i.next, %loop] 41 %i.next = add i32 %i, 1 42 %cond_p0 = icmp uge i32 %i, %n 43 %cond_p1 = icmp uge i32 %i, %m 44 %cond = select i1 %cond_p0, i1 true, i1 %cond_p1 45 br i1 %cond, label %exit, label %loop 46exit: 47 ret i32 %i 48} 49 50define i32 @logical_and_3ops(i32 %n, i32 %m, i32 %k) { 51; CHECK-LABEL: @logical_and_3ops( 52; CHECK-NEXT: entry: 53; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[K:%.*]], i32 [[M:%.*]]) 54; CHECK-NEXT: br label [[LOOP:%.*]] 55; CHECK: loop: 56; CHECK-NEXT: br i1 false, label [[LOOP]], label [[EXIT:%.*]] 57; CHECK: exit: 58; CHECK-NEXT: [[UMIN1:%.*]] = call i32 @llvm.umin.i32(i32 [[UMIN]], i32 [[N:%.*]]) 59; CHECK-NEXT: ret i32 [[UMIN1]] 60; 61entry: 62 br label %loop 63loop: 64 %i = phi i32 [0, %entry], [%i.next, %loop] 65 %i.next = add i32 %i, 1 66 %cond_p0 = icmp ult i32 %i, %n 67 %cond_p1 = icmp ult i32 %i, %m 68 %cond_p2 = icmp ult i32 %i, %k 69 %cond_p3 = select i1 %cond_p0, i1 %cond_p1, i1 false 70 %cond = select i1 %cond_p3, i1 %cond_p2, i1 false 71 br i1 %cond, label %loop, label %exit 72exit: 73 ret i32 %i 74} 75 76define i32 @logical_or_3ops(i32 %n, i32 %m, i32 %k) { 77; CHECK-LABEL: @logical_or_3ops( 78; CHECK-NEXT: entry: 79; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[K:%.*]], i32 [[M:%.*]]) 80; CHECK-NEXT: br label [[LOOP:%.*]] 81; CHECK: loop: 82; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[LOOP]] 83; CHECK: exit: 84; CHECK-NEXT: [[UMIN1:%.*]] = call i32 @llvm.umin.i32(i32 [[UMIN]], i32 [[N:%.*]]) 85; CHECK-NEXT: ret i32 [[UMIN1]] 86; 87entry: 88 br label %loop 89loop: 90 %i = phi i32 [0, %entry], [%i.next, %loop] 91 %i.next = add i32 %i, 1 92 %cond_p0 = icmp uge i32 %i, %n 93 %cond_p1 = icmp uge i32 %i, %m 94 %cond_p2 = icmp uge i32 %i, %k 95 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 96 %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 97 br i1 %cond, label %exit, label %loop 98exit: 99 ret i32 %i 100} 101