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