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