blob: 35c7790347dc734f7179c8fb67bcdb4397676dd3 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6
; RUN: opt -disable-output -passes='print<scalar-evolution>' -scalar-evolution-classify-expressions=0 %s 2>&1 | FileCheck %s
declare void @use(i64)
; all_of max: umax start value, every operand bounded by %bound.
define void @umax_start(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'umax_start'
; CHECK-NEXT: Determining loop execution counts for: @umax_start
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * (%x0 umax %x1)) + (%x0 umax %x1 umax %bound))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * (%x0 umax %x1)) + (%x0 umax %x1 umax %bound))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp ule i64 %x0, %bound
call void @llvm.assume(i1 %pre.x0)
%pre.x1 = icmp ule i64 %x1, %bound
call void @llvm.assume(i1 %pre.x1)
%start = call i64 @llvm.umax.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %start, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nuw i64 %iv, 1
%cond = icmp ult i64 %iv, %bound
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @umax_start_ne_pred(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'umax_start_ne_pred'
; CHECK-NEXT: Determining loop execution counts for: @umax_start_ne_pred
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * (%x0 umax %x1)) + %bound)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * (%x0 umax %x1)) + %bound)
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp ne i64 %x0, %bound
call void @llvm.assume(i1 %pre.x0)
%pre.x1 = icmp ne i64 %x1, %bound
call void @llvm.assume(i1 %pre.x1)
%start = call i64 @llvm.umax.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %start, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nuw i64 %iv, 1
%cond = icmp ne i64 %iv, %bound
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @umax_start_3op(i64 %x0, i64 %x1, i64 %x2, i64 %bound) {
; CHECK-LABEL: 'umax_start_3op'
; CHECK-NEXT: Determining loop execution counts for: @umax_start_3op
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * (%x0 umax %x1 umax %x2)) + (%x0 umax %x1 umax %x2 umax %bound))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * (%x0 umax %x1 umax %x2)) + (%x0 umax %x1 umax %x2 umax %bound))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp ule i64 %x0, %bound
call void @llvm.assume(i1 %pre.x0)
%pre.x1 = icmp ule i64 %x1, %bound
call void @llvm.assume(i1 %pre.x1)
%pre.x2 = icmp ule i64 %x2, %bound
call void @llvm.assume(i1 %pre.x2)
%max01 = call i64 @llvm.umax.i64(i64 %x0, i64 %x1)
%start = call i64 @llvm.umax.i64(i64 %max01, i64 %x2)
br label %loop
loop:
%iv = phi i64 [ %start, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nuw i64 %iv, 1
%cond = icmp ult i64 %iv, %bound
br i1 %cond, label %loop, label %exit
exit:
ret void
}
; all_of max, guards/condition written with operands swapped (%bound uge %x).
define void @umax_start_swapped_guards(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'umax_start_swapped_guards'
; CHECK-NEXT: Determining loop execution counts for: @umax_start_swapped_guards
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * (%x0 umax %x1)) + (%x0 umax %x1 umax %bound))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * (%x0 umax %x1)) + (%x0 umax %x1 umax %bound))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp uge i64 %bound, %x0
call void @llvm.assume(i1 %pre.x0)
%pre.x1 = icmp uge i64 %bound, %x1
call void @llvm.assume(i1 %pre.x1)
%start = call i64 @llvm.umax.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %start, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nuw i64 %iv, 1
%cond = icmp ugt i64 %bound, %iv
br i1 %cond, label %loop, label %exit
exit:
ret void
}
; all_of max, signed.
define void @smax_start(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'smax_start'
; CHECK-NEXT: Determining loop execution counts for: @smax_start
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * (%x0 smax %x1)) + (%x0 smax %x1 smax %bound))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * (%x0 smax %x1)) + (%x0 smax %x1 smax %bound))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp sle i64 %x0, %bound
call void @llvm.assume(i1 %pre.x0)
%pre.x1 = icmp sle i64 %x1, %bound
call void @llvm.assume(i1 %pre.x1)
%start = call i64 @llvm.smax.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %start, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nsw i64 %iv, 1
%cond = icmp slt i64 %iv, %bound
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @smax_start_ne(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'smax_start_ne'
; CHECK-NEXT: Determining loop execution counts for: @smax_start_ne
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * (%x0 smax %x1)) + %bound)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * (%x0 smax %x1)) + %bound)
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp ne i64 %x0, %bound
call void @llvm.assume(i1 %pre.x0)
%pre.x1 = icmp ne i64 %x1, %bound
call void @llvm.assume(i1 %pre.x1)
%start = call i64 @llvm.smax.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %start, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nsw i64 %iv, 1
%cond = icmp ne i64 %iv, %bound
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @smax_start_3op(i64 %x0, i64 %x1, i64 %x2, i64 %bound) {
; CHECK-LABEL: 'smax_start_3op'
; CHECK-NEXT: Determining loop execution counts for: @smax_start_3op
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * (%x0 smax %x1 smax %x2)) + (%x0 smax %x1 smax %x2 smax %bound))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * (%x0 smax %x1 smax %x2)) + (%x0 smax %x1 smax %x2 smax %bound))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp sle i64 %x0, %bound
call void @llvm.assume(i1 %pre.x0)
%pre.x1 = icmp sle i64 %x1, %bound
call void @llvm.assume(i1 %pre.x1)
%pre.x2 = icmp sle i64 %x2, %bound
call void @llvm.assume(i1 %pre.x2)
%max01 = call i64 @llvm.smax.i64(i64 %x0, i64 %x1)
%start = call i64 @llvm.smax.i64(i64 %max01, i64 %x2)
br label %loop
loop:
%iv = phi i64 [ %start, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nsw i64 %iv, 1
%cond = icmp slt i64 %iv, %bound
br i1 %cond, label %loop, label %exit
exit:
ret void
}
; all_of max, signed, guards/condition written with operands swapped
; (%bound sge %x).
define void @smax_start_swapped_guards(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'smax_start_swapped_guards'
; CHECK-NEXT: Determining loop execution counts for: @smax_start_swapped_guards
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * (%x0 smax %x1)) + (%x0 smax %x1 smax %bound))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * (%x0 smax %x1)) + (%x0 smax %x1 smax %bound))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp sge i64 %bound, %x0
call void @llvm.assume(i1 %pre.x0)
%pre.x1 = icmp sge i64 %bound, %x1
call void @llvm.assume(i1 %pre.x1)
%start = call i64 @llvm.smax.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %start, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nsw i64 %iv, 1
%cond = icmp sgt i64 %bound, %iv
br i1 %cond, label %loop, label %exit
exit:
ret void
}
; all_of min: umin limit, every operand bounded below by %bound (the start).
define void @umin_limit(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'umin_limit'
; CHECK-NEXT: Determining loop execution counts for: @umin_limit
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * %bound) + ((%x0 umin %x1) umax %bound))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * %bound) + ((%x0 umin %x1) umax %bound))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp ule i64 %bound, %x0
call void @llvm.assume(i1 %pre.x0)
%pre.x1 = icmp ule i64 %bound, %x1
call void @llvm.assume(i1 %pre.x1)
%lim = call i64 @llvm.umin.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %bound, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nuw i64 %iv, 1
%cond = icmp ult i64 %iv, %lim
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @umin_limit_ne(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'umin_limit_ne'
; CHECK-NEXT: Determining loop execution counts for: @umin_limit_ne
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * %bound) + (%x0 umin %x1))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * %bound) + (%x0 umin %x1))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp ne i64 %bound, %x0
call void @llvm.assume(i1 %pre.x0)
%pre.x1 = icmp ne i64 %bound, %x1
call void @llvm.assume(i1 %pre.x1)
%lim = call i64 @llvm.umin.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %bound, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nuw i64 %iv, 1
%cond = icmp ne i64 %iv, %lim
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @umin_limit_3op(i64 %x0, i64 %x1, i64 %x2, i64 %bound) {
; CHECK-LABEL: 'umin_limit_3op'
; CHECK-NEXT: Determining loop execution counts for: @umin_limit_3op
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * %bound) + ((%x0 umin %x1 umin %x2) umax %bound))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * %bound) + ((%x0 umin %x1 umin %x2) umax %bound))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp ule i64 %bound, %x0
call void @llvm.assume(i1 %pre.x0)
%pre.x1 = icmp ule i64 %bound, %x1
call void @llvm.assume(i1 %pre.x1)
%pre.x2 = icmp ule i64 %bound, %x2
call void @llvm.assume(i1 %pre.x2)
%min01 = call i64 @llvm.umin.i64(i64 %x0, i64 %x1)
%lim = call i64 @llvm.umin.i64(i64 %min01, i64 %x2)
br label %loop
loop:
%iv = phi i64 [ %bound, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nuw i64 %iv, 1
%cond = icmp ult i64 %iv, %lim
br i1 %cond, label %loop, label %exit
exit:
ret void
}
; all_of min, guards/condition written with operands swapped (%x uge %bound).
define void @umin_limit_swapped_guards(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'umin_limit_swapped_guards'
; CHECK-NEXT: Determining loop execution counts for: @umin_limit_swapped_guards
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * %bound) + ((%x0 umin %x1) umax %bound))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * %bound) + ((%x0 umin %x1) umax %bound))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp uge i64 %x0, %bound
call void @llvm.assume(i1 %pre.x0)
%pre.x1 = icmp uge i64 %x1, %bound
call void @llvm.assume(i1 %pre.x1)
%lim = call i64 @llvm.umin.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %bound, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nuw i64 %iv, 1
%cond = icmp ugt i64 %lim, %iv
br i1 %cond, label %loop, label %exit
exit:
ret void
}
; all_of min, signed: smin limit, every operand bounded below by %bound.
define void @smin_limit(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'smin_limit'
; CHECK-NEXT: Determining loop execution counts for: @smin_limit
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * %bound) + ((%x0 smin %x1) smax %bound))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * %bound) + ((%x0 smin %x1) smax %bound))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp sle i64 %bound, %x0
call void @llvm.assume(i1 %pre.x0)
%pre.x1 = icmp sle i64 %bound, %x1
call void @llvm.assume(i1 %pre.x1)
%lim = call i64 @llvm.smin.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %bound, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nsw i64 %iv, 1
%cond = icmp slt i64 %iv, %lim
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @smin_limit_ne(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'smin_limit_ne'
; CHECK-NEXT: Determining loop execution counts for: @smin_limit_ne
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * %bound) + (%x0 smin %x1))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * %bound) + (%x0 smin %x1))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp ne i64 %bound, %x0
call void @llvm.assume(i1 %pre.x0)
%pre.x1 = icmp ne i64 %bound, %x1
call void @llvm.assume(i1 %pre.x1)
%lim = call i64 @llvm.smin.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %bound, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nsw i64 %iv, 1
%cond = icmp ne i64 %iv, %lim
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @smin_limit_3op(i64 %x0, i64 %x1, i64 %x2, i64 %bound) {
; CHECK-LABEL: 'smin_limit_3op'
; CHECK-NEXT: Determining loop execution counts for: @smin_limit_3op
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * %bound) + ((%x0 smin %x1 smin %x2) smax %bound))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * %bound) + ((%x0 smin %x1 smin %x2) smax %bound))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp sle i64 %bound, %x0
call void @llvm.assume(i1 %pre.x0)
%pre.x1 = icmp sle i64 %bound, %x1
call void @llvm.assume(i1 %pre.x1)
%pre.x2 = icmp sle i64 %bound, %x2
call void @llvm.assume(i1 %pre.x2)
%min01 = call i64 @llvm.smin.i64(i64 %x0, i64 %x1)
%lim = call i64 @llvm.smin.i64(i64 %min01, i64 %x2)
br label %loop
loop:
%iv = phi i64 [ %bound, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nsw i64 %iv, 1
%cond = icmp slt i64 %iv, %lim
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @smin_limit_swapped_guards(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'smin_limit_swapped_guards'
; CHECK-NEXT: Determining loop execution counts for: @smin_limit_swapped_guards
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * %bound) + ((%x0 smin %x1) smax %bound))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * %bound) + ((%x0 smin %x1) smax %bound))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp sge i64 %x0, %bound
call void @llvm.assume(i1 %pre.x0)
%pre.x1 = icmp sge i64 %x1, %bound
call void @llvm.assume(i1 %pre.x1)
%lim = call i64 @llvm.smin.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %bound, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nsw i64 %iv, 1
%cond = icmp sgt i64 %lim, %iv
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @umax_start_one_guard(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'umax_start_one_guard'
; CHECK-NEXT: Determining loop execution counts for: @umax_start_one_guard
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * (%x0 umax %x1)) + (%x0 umax %x1 umax %bound))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * (%x0 umax %x1)) + (%x0 umax %x1 umax %bound))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp ule i64 %x0, %bound
call void @llvm.assume(i1 %pre.x0)
%start = call i64 @llvm.umax.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %start, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nuw i64 %iv, 1
%cond = icmp ult i64 %iv, %bound
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @umin_limit_one_guard(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'umin_limit_one_guard'
; CHECK-NEXT: Determining loop execution counts for: @umin_limit_one_guard
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * %bound) + ((%x0 umin %x1) umax %bound))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * %bound) + ((%x0 umin %x1) umax %bound))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp ule i64 %bound, %x0
call void @llvm.assume(i1 %pre.x0)
%lim = call i64 @llvm.umin.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %bound, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nuw i64 %iv, 1
%cond = icmp ult i64 %iv, %lim
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @umin_start_no_guard(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'umin_start_no_guard'
; CHECK-NEXT: Determining loop execution counts for: @umin_start_no_guard
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * (%x0 umin %x1)) + ((%x0 umin %x1) umax %bound))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * (%x0 umin %x1)) + ((%x0 umin %x1) umax %bound))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%start = call i64 @llvm.umin.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %start, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nuw i64 %iv, 1
%cond = icmp ult i64 %iv, %bound
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @umin_start_one_guard(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'umin_start_one_guard'
; CHECK-NEXT: Determining loop execution counts for: @umin_start_one_guard
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * (%x0 umin %x1)) + %bound)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * (%x0 umin %x1)) + %bound)
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp ule i64 %x0, %bound
call void @llvm.assume(i1 %pre.x0)
%start = call i64 @llvm.umin.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %start, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nuw i64 %iv, 1
%cond = icmp ult i64 %iv, %bound
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @smin_start_one_guard(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'smin_start_one_guard'
; CHECK-NEXT: Determining loop execution counts for: @smin_start_one_guard
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * (%x0 smin %x1)) + %bound)
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * (%x0 smin %x1)) + %bound)
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp sle i64 %x0, %bound
call void @llvm.assume(i1 %pre.x0)
%start = call i64 @llvm.smin.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %start, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nsw i64 %iv, 1
%cond = icmp slt i64 %iv, %bound
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @smin_start_pred_mismatch(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'smin_start_pred_mismatch'
; CHECK-NEXT: Determining loop execution counts for: @smin_start_pred_mismatch
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * (%x0 smin %x1)) + ((%x0 smin %x1) umax %bound))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * (%x0 smin %x1)) + ((%x0 smin %x1) umax %bound))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%pre.x0 = icmp ule i64 %x0, %bound
call void @llvm.assume(i1 %pre.x0)
%start = call i64 @llvm.smin.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %start, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nuw i64 %iv, 1
%cond = icmp ult i64 %iv, %bound
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @umax_limit_no_guard(i64 %x0, i64 %x1, i64 %bound) {
; CHECK-LABEL: 'umax_limit_no_guard'
; CHECK-NEXT: Determining loop execution counts for: @umax_limit_no_guard
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * %bound) + (%x0 umax %x1 umax %bound))
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * %bound) + (%x0 umax %x1 umax %bound))
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%lim = call i64 @llvm.umax.i64(i64 %x0, i64 %x1)
br label %loop
loop:
%iv = phi i64 [ %bound, %entry ], [ %iv.next, %loop ]
call void @use(i64 %iv)
%iv.next = add nuw i64 %iv, 1
%cond = icmp ult i64 %iv, %lim
br i1 %cond, label %loop, label %exit
exit:
ret void
}