[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