| ; 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 |
| } |