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