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