blob: a376c456fb1e64d17ace9c7e81905e3d485d980e [file] [edit]
; 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()