[llvm] [LV][NFC] Update low trip count tail-folding tests (PR #176898)

via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 20 03:27:23 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-risc-v

Author: David Sherwood (david-arm)

<details>
<summary>Changes</summary>

Whilst reviewing PR #<!-- -->176754 I realised there seemed to be some odd cost model issues for the tests in file

LoopVectorize/AArch64/fold-tail-low-trip-count.ll

where we seemed to be vectorising loops that aren't worth it. It turns out the tests were not targeting AArch64 despite being in the AArch64 directory. I fixed the RUN line for the file and also added a new file for RISCV so we get more test coverage.

---
Full diff: https://github.com/llvm/llvm-project/pull/176898.diff


2 Files Affected:

- (modified) llvm/test/Transforms/LoopVectorize/AArch64/fold-tail-low-trip-count.ll (+1-1) 
- (added) llvm/test/Transforms/LoopVectorize/RISCV/fold-tail-low-trip-count.ll (+116) 


``````````diff
diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/fold-tail-low-trip-count.ll b/llvm/test/Transforms/LoopVectorize/AArch64/fold-tail-low-trip-count.ll
index 14f5dd7d41691..1305f103d0f5f 100644
--- a/llvm/test/Transforms/LoopVectorize/AArch64/fold-tail-low-trip-count.ll
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/fold-tail-low-trip-count.ll
@@ -1,5 +1,5 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 6
-; RUN: opt -p loop-vectorize -S %s | FileCheck %s
+; RUN: opt -p loop-vectorize -mtriple=aarch64-linux-gnu -S %s | FileCheck %s
 
 define void @low_trip_count_small(i32 %x, ptr %dst) {
 ; CHECK-LABEL: define void @low_trip_count_small(
diff --git a/llvm/test/Transforms/LoopVectorize/RISCV/fold-tail-low-trip-count.ll b/llvm/test/Transforms/LoopVectorize/RISCV/fold-tail-low-trip-count.ll
new file mode 100644
index 0000000000000..40105a74ead7a
--- /dev/null
+++ b/llvm/test/Transforms/LoopVectorize/RISCV/fold-tail-low-trip-count.ll
@@ -0,0 +1,116 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 6
+; RUN: opt -passes=loop-vectorize \
+; RUN: -prefer-predicate-over-epilogue=predicate-else-scalar-epilogue \
+; RUN: -mtriple=riscv64 -mattr=+v -S < %s | FileCheck --check-prefix=IF-EVL %s
+; RUN: opt -passes=loop-vectorize \
+; RUN: -prefer-predicate-over-epilogue=scalar-epilogue \
+; RUN: -mtriple=riscv64 -mattr=+v -S < %s | FileCheck --check-prefix=NO-VP %s
+
+define void @low_trip_count_small(i32 %x, ptr %dst) {
+; IF-EVL-LABEL: define void @low_trip_count_small(
+; IF-EVL-SAME: i32 [[X:%.*]], ptr [[DST:%.*]]) #[[ATTR0:[0-9]+]] {
+; IF-EVL-NEXT:  [[ENTRY:.*]]:
+; IF-EVL-NEXT:    [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 1)
+; IF-EVL-NEXT:    [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[SMAX]], i32 4)
+; IF-EVL-NEXT:    br label %[[LOOP:.*]]
+; IF-EVL:       [[LOOP]]:
+; IF-EVL-NEXT:    [[PTR:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[PTR_NEXT:%.*]], %[[LOOP]] ]
+; IF-EVL-NEXT:    [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
+; IF-EVL-NEXT:    [[PTR_NEXT]] = getelementptr i8, ptr [[PTR]], i64 1
+; IF-EVL-NEXT:    store i8 0, ptr [[PTR_NEXT]], align 1
+; IF-EVL-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1
+; IF-EVL-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[IV_NEXT]], [[UMIN]]
+; IF-EVL-NEXT:    br i1 [[EXITCOND]], label %[[EXIT:.*]], label %[[LOOP]]
+; IF-EVL:       [[EXIT]]:
+; IF-EVL-NEXT:    ret void
+;
+; NO-VP-LABEL: define void @low_trip_count_small(
+; NO-VP-SAME: i32 [[X:%.*]], ptr [[DST:%.*]]) #[[ATTR0:[0-9]+]] {
+; NO-VP-NEXT:  [[ENTRY:.*]]:
+; NO-VP-NEXT:    [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 1)
+; NO-VP-NEXT:    [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[SMAX]], i32 4)
+; NO-VP-NEXT:    br label %[[LOOP:.*]]
+; NO-VP:       [[LOOP]]:
+; NO-VP-NEXT:    [[PTR:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[PTR_NEXT:%.*]], %[[LOOP]] ]
+; NO-VP-NEXT:    [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
+; NO-VP-NEXT:    [[PTR_NEXT]] = getelementptr i8, ptr [[PTR]], i64 1
+; NO-VP-NEXT:    store i8 0, ptr [[PTR_NEXT]], align 1
+; NO-VP-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1
+; NO-VP-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[IV_NEXT]], [[UMIN]]
+; NO-VP-NEXT:    br i1 [[EXITCOND]], label %[[EXIT:.*]], label %[[LOOP]]
+; NO-VP:       [[EXIT]]:
+; NO-VP-NEXT:    ret void
+;
+entry:
+  %smax = call i32 @llvm.smax.i32(i32 %x, i32 1)
+  %umin = call i32 @llvm.umin.i32(i32 %smax, i32 4)
+  br label %loop
+
+loop:                                             ; preds = %loop, %entry
+  %ptr = phi ptr [ %dst, %entry ], [ %ptr.next, %loop ]
+  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
+  %ptr.next = getelementptr i8, ptr %ptr, i64 1
+  store i8 0, ptr %ptr.next
+  %iv.next = add i32 %iv, 1
+  %exitcond = icmp eq i32 %iv.next, %umin
+  br i1 %exitcond, label %exit, label %loop
+
+exit:
+  ret void
+}
+
+
+define ptr @low_trip_count_small_with_live_out(i32 %x, ptr %dst) {
+; IF-EVL-LABEL: define ptr @low_trip_count_small_with_live_out(
+; IF-EVL-SAME: i32 [[X:%.*]], ptr [[DST:%.*]]) #[[ATTR0]] {
+; IF-EVL-NEXT:  [[ENTRY:.*]]:
+; IF-EVL-NEXT:    [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 1)
+; IF-EVL-NEXT:    [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[SMAX]], i32 4)
+; IF-EVL-NEXT:    br label %[[LOOP:.*]]
+; IF-EVL:       [[LOOP]]:
+; IF-EVL-NEXT:    [[PTR:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[PTR_NEXT:%.*]], %[[LOOP]] ]
+; IF-EVL-NEXT:    [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
+; IF-EVL-NEXT:    [[PTR_NEXT]] = getelementptr i8, ptr [[PTR]], i64 1
+; IF-EVL-NEXT:    store i8 0, ptr [[PTR_NEXT]], align 1
+; IF-EVL-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1
+; IF-EVL-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[IV_NEXT]], [[UMIN]]
+; IF-EVL-NEXT:    br i1 [[EXITCOND]], label %[[EXIT:.*]], label %[[LOOP]]
+; IF-EVL:       [[EXIT]]:
+; IF-EVL-NEXT:    [[PTR_NEXT_LCSSA:%.*]] = phi ptr [ [[PTR_NEXT]], %[[LOOP]] ]
+; IF-EVL-NEXT:    ret ptr [[PTR_NEXT_LCSSA]]
+;
+; NO-VP-LABEL: define ptr @low_trip_count_small_with_live_out(
+; NO-VP-SAME: i32 [[X:%.*]], ptr [[DST:%.*]]) #[[ATTR0]] {
+; NO-VP-NEXT:  [[ENTRY:.*]]:
+; NO-VP-NEXT:    [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 1)
+; NO-VP-NEXT:    [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[SMAX]], i32 4)
+; NO-VP-NEXT:    br label %[[LOOP:.*]]
+; NO-VP:       [[LOOP]]:
+; NO-VP-NEXT:    [[PTR:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[PTR_NEXT:%.*]], %[[LOOP]] ]
+; NO-VP-NEXT:    [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
+; NO-VP-NEXT:    [[PTR_NEXT]] = getelementptr i8, ptr [[PTR]], i64 1
+; NO-VP-NEXT:    store i8 0, ptr [[PTR_NEXT]], align 1
+; NO-VP-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1
+; NO-VP-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[IV_NEXT]], [[UMIN]]
+; NO-VP-NEXT:    br i1 [[EXITCOND]], label %[[EXIT:.*]], label %[[LOOP]]
+; NO-VP:       [[EXIT]]:
+; NO-VP-NEXT:    [[PTR_NEXT_LCSSA:%.*]] = phi ptr [ [[PTR_NEXT]], %[[LOOP]] ]
+; NO-VP-NEXT:    ret ptr [[PTR_NEXT_LCSSA]]
+;
+entry:
+  %smax = call i32 @llvm.smax.i32(i32 %x, i32 1)
+  %umin = call i32 @llvm.umin.i32(i32 %smax, i32 4)
+  br label %loop
+
+loop:
+  %ptr = phi ptr [ %dst, %entry ], [ %ptr.next, %loop ]
+  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
+  %ptr.next = getelementptr i8, ptr %ptr, i64 1
+  store i8 0, ptr %ptr.next
+  %iv.next = add i32 %iv, 1
+  %exitcond = icmp eq i32 %iv.next, %umin
+  br i1 %exitcond, label %exit, label %loop
+
+exit:
+  ret ptr %ptr.next
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/176898


More information about the llvm-commits mailing list