| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: opt -passes=indvars -S < %s | FileCheck %s | |
| target datalayout = "e-m:e-i64:64-n8:16:32:64-S128" | |
| ; If x <u 10, then x - 5 is in [-5, 5), so x - 5 <s 5. | |
| define void @ult_const_slt_offset(i32 %x) { | |
| ; CHECK-LABEL: define void @ult_const_slt_offset( | |
| ; CHECK-SAME: i32 [[X:%.*]]) { | |
| ; CHECK-NEXT: [[ENTRY:.*:]] | |
| ; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[X]], 10 | |
| ; CHECK-NEXT: br i1 [[C]], label %[[LOOP_PREHEADER:.*]], label %[[EXIT:.*]] | |
| ; CHECK: [[LOOP_PREHEADER]]: | |
| ; CHECK-NEXT: br label %[[LOOP:.*]] | |
| ; CHECK: [[LOOP]]: | |
| ; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], %[[LATCH:.*]] ], [ 0, %[[LOOP_PREHEADER]] ] | |
| ; CHECK-NEXT: br i1 false, label %[[EXIT_LOOPEXIT:.*]], label %[[LATCH]] | |
| ; CHECK: [[LATCH]]: | |
| ; CHECK-NEXT: call void @side() | |
| ; CHECK-NEXT: [[I_NEXT]] = add nuw nsw i32 [[I]], 1 | |
| ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[I_NEXT]], 100 | |
| ; CHECK-NEXT: br i1 [[EXITCOND]], label %[[LOOP]], label %[[EXIT_LOOPEXIT]] | |
| ; CHECK: [[EXIT_LOOPEXIT]]: | |
| ; CHECK-NEXT: br label %[[EXIT]] | |
| ; CHECK: [[EXIT]]: | |
| ; CHECK-NEXT: ret void | |
| ; | |
| entry: | |
| %c = icmp ult i32 %x, 10 | |
| br i1 %c, label %loop, label %exit | |
| loop: | |
| %i = phi i32 [ 0, %entry ], [ %i.next, %latch ] | |
| %x.m5 = add i32 %x, -5 | |
| %q = icmp sge i32 %x.m5, 5 | |
| br i1 %q, label %exit, label %latch | |
| latch: | |
| call void @side() | |
| %i.next = add nuw nsw i32 %i, 1 | |
| %ec = icmp ult i32 %i.next, 100 | |
| br i1 %ec, label %loop, label %exit | |
| exit: | |
| ret void | |
| } | |
| declare void @side() |