[llvm] 996599d - [LV] Add VPlan printing tests checking SCEV expansion (NFC). (#191053)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 8 14:49:14 PDT 2026
Author: Florian Hahn
Date: 2026-04-08T21:49:09Z
New Revision: 996599ddd95c81cbdf2c12336f3db6baec4499c5
URL: https://github.com/llvm/llvm-project/commit/996599ddd95c81cbdf2c12336f3db6baec4499c5
DIFF: https://github.com/llvm/llvm-project/commit/996599ddd95c81cbdf2c12336f3db6baec4499c5.diff
LOG: [LV] Add VPlan printing tests checking SCEV expansion (NFC). (#191053)
Add additional test cases checking VPlan output of SCEV expansions.
Added:
llvm/test/Transforms/LoopVectorize/VPlan/expand-scev.ll
Modified:
Removed:
################################################################################
diff --git a/llvm/test/Transforms/LoopVectorize/VPlan/expand-scev.ll b/llvm/test/Transforms/LoopVectorize/VPlan/expand-scev.ll
new file mode 100644
index 0000000000000..823ecbe18041f
--- /dev/null
+++ b/llvm/test/Transforms/LoopVectorize/VPlan/expand-scev.ll
@@ -0,0 +1,121 @@
+; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --filter-out-after "Successor" --version 6
+; RUN: opt -passes=loop-vectorize -force-vector-width=4 -force-vector-interleave=1 \
+; RUN: -force-target-supports-scalable-vectors \
+; RUN: -disable-output -vplan-print-after="printFinalVPlan$" %s 2>&1 | FileCheck %s
+
+define void @scev_add_expanded(ptr %dst, i64 %n) {
+; CHECK-LABEL: VPlan for loop in 'scev_add_expanded'
+; CHECK: VPlan 'Final VPlan for VF={4},UF={1}' {
+; CHECK-NEXT: Live-in ir<%0> = original trip-count
+; CHECK-EMPTY:
+; CHECK-NEXT: ir-bb<loop.preheader>:
+; CHECK-NEXT: IR %0 = add i64 %n, 2
+; CHECK-NEXT: EMIT vp<%min.iters.check> = icmp ult ir<%0>, ir<4>
+; CHECK-NEXT: EMIT branch-on-cond vp<%min.iters.check>
+; CHECK-NEXT: Successor(s): ir-bb<scalar.ph>, vector.ph
+;
+entry:
+ %cmp = icmp ne i64 %n, 0
+ br i1 %cmp, label %loop, label %exit
+
+loop:
+ %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
+ %gep = getelementptr i8, ptr %dst, i64 %iv
+ store i8 0, ptr %gep
+ %iv.next = add nuw i64 %iv, 1
+ %cmp.loop = icmp ule i64 %iv, %n
+ br i1 %cmp.loop, label %loop, label %exit
+
+exit:
+ ret void
+}
+
+define void @scev_add_lshr_expanded(ptr %dst, i64 %n) {
+; CHECK-LABEL: VPlan for loop in 'scev_add_lshr_expanded'
+; CHECK: VPlan 'Final VPlan for VF={4},UF={1}' {
+; CHECK-NEXT: Live-in ir<%2> = original trip-count
+; CHECK-EMPTY:
+; CHECK-NEXT: ir-bb<loop.preheader>:
+; CHECK-NEXT: IR %0 = add i64 %n, -1
+; CHECK-NEXT: IR %1 = lshr i64 %0, 1
+; CHECK-NEXT: IR %2 = add nuw i64 %1, 1
+; CHECK-NEXT: EMIT vp<%min.iters.check> = icmp ult ir<%2>, ir<4>
+; CHECK-NEXT: EMIT branch-on-cond vp<%min.iters.check>
+; CHECK-NEXT: Successor(s): ir-bb<scalar.ph>, vector.ph
+;
+entry:
+ %cmp = icmp ugt i64 %n, 2
+ br i1 %cmp, label %loop, label %exit
+
+loop:
+ %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
+ %gep = getelementptr i8, ptr %dst, i64 %iv
+ store i8 0, ptr %gep
+ %iv.next = add nuw i64 %iv, 2
+ %cmp.loop = icmp ult i64 %iv.next, %n
+ br i1 %cmp.loop, label %loop, label %exit
+
+exit:
+ ret void
+}
+
+define void @scev_add_udiv3_expanded(ptr %dst, i64 %n) {
+; CHECK-LABEL: VPlan for loop in 'scev_add_udiv3_expanded'
+; CHECK: VPlan 'Final VPlan for VF={4},UF={1}' {
+; CHECK-NEXT: Live-in ir<%2> = original trip-count
+; CHECK-EMPTY:
+; CHECK-NEXT: ir-bb<loop.preheader>:
+; CHECK-NEXT: IR %0 = add i64 %n, -1
+; CHECK-NEXT: IR %1 = udiv i64 %0, 3
+; CHECK-NEXT: IR %2 = add nuw nsw i64 %1, 1
+; CHECK-NEXT: EMIT vp<%min.iters.check> = icmp ult ir<%2>, ir<4>
+; CHECK-NEXT: EMIT branch-on-cond vp<%min.iters.check>
+; CHECK-NEXT: Successor(s): ir-bb<scalar.ph>, vector.ph
+;
+entry:
+ %cmp = icmp ugt i64 %n, 3
+ br i1 %cmp, label %loop, label %exit
+
+loop:
+ %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
+ %gep = getelementptr i8, ptr %dst, i64 %iv
+ store i8 0, ptr %gep
+ %iv.next = add nuw i64 %iv, 3
+ %cmp.loop = icmp ult i64 %iv.next, %n
+ br i1 %cmp.loop, label %loop, label %exit
+
+exit:
+ ret void
+}
+
+define void @scev_expand_vscale_mul(ptr %dst, i64 %n) {
+; CHECK-LABEL: VPlan for loop in 'scev_expand_vscale_mul'
+; CHECK: VPlan 'Final VPlan for VF={vscale x 4},UF={1}' {
+; CHECK-NEXT: Live-in ir<%n> = original trip-count
+; CHECK-EMPTY:
+; CHECK-NEXT: ir-bb<loop.preheader>:
+; CHECK-NEXT: IR %0 = call i64 @llvm.vscale.i64()
+; CHECK-NEXT: IR %1 = shl nuw i64 %0, 2
+; CHECK-NEXT: EMIT vp<%min.iters.check> = icmp ult ir<%n>, ir<%1>
+; CHECK-NEXT: EMIT branch-on-cond vp<%min.iters.check>
+; CHECK-NEXT: Successor(s): ir-bb<scalar.ph>, vector.ph
+;
+entry:
+ %cmp = icmp ne i64 %n, 0
+ br i1 %cmp, label %loop, label %exit
+
+loop:
+ %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
+ %gep = getelementptr i8, ptr %dst, i64 %iv
+ store i8 0, ptr %gep
+ %iv.next = add nuw i64 %iv, 1
+ %cmp.loop = icmp ult i64 %iv.next, %n
+ br i1 %cmp.loop, label %loop, label %exit, !llvm.loop !0
+
+exit:
+ ret void
+}
+
+!0 = distinct !{!0, !1, !2}
+!1 = !{!"llvm.loop.vectorize.scalable.enable", i1 true}
+!2 = !{!"llvm.loop.vectorize.width", i32 4}
More information about the llvm-commits
mailing list