[llvm] [LV] Add test for printing cast flags. (PR #200806)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 1 06:04:22 PDT 2026
https://github.com/fhahn created https://github.com/llvm/llvm-project/pull/200806
Add test showing missing flags when printing VPInstructionWithType casts.
>From 80b7093881660f894453cf68a5f86103cc4a22a6 Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Mon, 1 Jun 2026 11:59:40 +0100
Subject: [PATCH] Add flag printing test
---
.../VPlan/vplan-printing-flags.ll | 104 ++++++++++++++++++
1 file changed, 104 insertions(+)
create mode 100644 llvm/test/Transforms/LoopVectorize/VPlan/vplan-printing-flags.ll
diff --git a/llvm/test/Transforms/LoopVectorize/VPlan/vplan-printing-flags.ll b/llvm/test/Transforms/LoopVectorize/VPlan/vplan-printing-flags.ll
new file mode 100644
index 0000000000000..94b4293965ec1
--- /dev/null
+++ b/llvm/test/Transforms/LoopVectorize/VPlan/vplan-printing-flags.ll
@@ -0,0 +1,104 @@
+; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --filter-out-after "middle.block:" --version 6
+; RUN: opt -passes=loop-vectorize -force-vector-width=4 -force-vector-interleave=1 \
+; RUN: -vplan-print-after=printAfterInitialConstruction -disable-output %s 2>&1 \
+; RUN: | FileCheck --strict-whitespace %s
+
+define void @cast_flags_mixed(ptr noalias %A, ptr noalias %B) {
+; CHECK-LABEL: VPlan for loop in 'cast_flags_mixed'
+; CHECK: VPlan ' for UF>=1' {
+; CHECK-NEXT: Live-in ir<4> = original trip-count
+; CHECK-EMPTY:
+; CHECK-NEXT: ir-bb<entry>:
+; CHECK-NEXT: Successor(s): scalar.ph, vector.ph
+; CHECK-EMPTY:
+; CHECK-NEXT: vector.ph:
+; CHECK-NEXT: Successor(s): loop
+; CHECK-EMPTY:
+; CHECK-NEXT: loop:
+; CHECK-NEXT: EMIT-SCALAR ir<%iv> = phi [ ir<0>, vector.ph ], [ ir<%iv.next>, loop ]
+; CHECK-NEXT: EMIT-SCALAR ir<%zext.nneg> = zext ir<3> to i64
+; CHECK-NEXT: EMIT ir<%gep.zext> = getelementptr ir<%A>, ir<%zext.nneg>
+; CHECK-NEXT: EMIT-SCALAR ir<%sext.plain> = sext ir<%iv> to i64
+; CHECK-NEXT: EMIT ir<%gep.sext> = getelementptr ir<%A>, ir<%sext.plain>
+; CHECK-NEXT: EMIT-SCALAR ir<%trunc.flags> = trunc ir<3> to i8
+; CHECK-NEXT: EMIT ir<%gep.trunc> = getelementptr ir<%B>, ir<%trunc.flags>
+; CHECK-NEXT: EMIT store ir<%gep.sext>, ir<%gep.zext>
+; CHECK-NEXT: EMIT store ir<0>, ir<%gep.trunc>
+; CHECK-NEXT: EMIT ir<%iv.next> = add nsw ir<%iv>, ir<1>
+; CHECK-NEXT: EMIT ir<%ec> = icmp slt ir<%iv.next>, ir<4>
+; CHECK-NEXT: EMIT vp<[[VP1:%[0-9]+]]> = not ir<%ec>
+; CHECK-NEXT: EMIT branch-on-cond vp<[[VP1]]>
+; CHECK-NEXT: Successor(s): middle.block, loop
+; CHECK-EMPTY:
+; CHECK-NEXT: middle.block:
+;
+entry:
+ br label %loop
+
+loop:
+ %iv = phi i16 [ 0, %entry ], [ %iv.next, %loop ]
+ %zext.nneg = zext nneg i16 3 to i64
+ %gep.zext = getelementptr ptr, ptr %A, i64 %zext.nneg
+ %sext.plain = sext i16 %iv to i64
+ %gep.sext = getelementptr [4 x ptr], ptr %A, i64 %sext.plain
+ %trunc.flags = trunc nuw nsw i16 3 to i8
+ %gep.trunc = getelementptr [4 x i8], ptr %B, i8 %trunc.flags
+ store ptr %gep.sext, ptr %gep.zext
+ store i8 0, ptr %gep.trunc
+ %iv.next = add nsw i16 %iv, 1
+ %ec = icmp slt i16 %iv.next, 4
+ br i1 %ec, label %loop, label %exit
+
+exit:
+ ret void
+}
+
+define void @cast_flags_single(ptr noalias %A, ptr noalias %B) {
+; CHECK-LABEL: VPlan for loop in 'cast_flags_single'
+; CHECK: VPlan ' for UF>=1' {
+; CHECK-NEXT: Live-in ir<4> = original trip-count
+; CHECK-EMPTY:
+; CHECK-NEXT: ir-bb<entry>:
+; CHECK-NEXT: Successor(s): scalar.ph, vector.ph
+; CHECK-EMPTY:
+; CHECK-NEXT: vector.ph:
+; CHECK-NEXT: Successor(s): loop
+; CHECK-EMPTY:
+; CHECK-NEXT: loop:
+; CHECK-NEXT: EMIT-SCALAR ir<%iv> = phi [ ir<0>, vector.ph ], [ ir<%iv.next>, loop ]
+; CHECK-NEXT: EMIT-SCALAR ir<%trunc.nuw.only> = trunc ir<3> to i8
+; CHECK-NEXT: EMIT-SCALAR ir<%trunc.nsw.only> = trunc ir<3> to i8
+; CHECK-NEXT: EMIT-SCALAR ir<%zext.plain> = zext ir<3> to i64
+; CHECK-NEXT: EMIT ir<%gep.a> = getelementptr ir<%A>, ir<%iv>
+; CHECK-NEXT: EMIT ir<%gep.b> = getelementptr ir<%B>, ir<%iv>
+; CHECK-NEXT: EMIT store ir<%trunc.nuw.only>, ir<%gep.a>
+; CHECK-NEXT: EMIT store ir<%trunc.nsw.only>, ir<%gep.a>
+; CHECK-NEXT: EMIT store ir<%zext.plain>, ir<%gep.b>
+; CHECK-NEXT: EMIT ir<%iv.next> = add nsw ir<%iv>, ir<1>
+; CHECK-NEXT: EMIT ir<%ec> = icmp slt ir<%iv.next>, ir<4>
+; CHECK-NEXT: EMIT vp<[[VP1:%[0-9]+]]> = not ir<%ec>
+; CHECK-NEXT: EMIT branch-on-cond vp<[[VP1]]>
+; CHECK-NEXT: Successor(s): middle.block, loop
+; CHECK-EMPTY:
+; CHECK-NEXT: middle.block:
+;
+entry:
+ br label %loop
+
+loop:
+ %iv = phi i16 [ 0, %entry ], [ %iv.next, %loop ]
+ %trunc.nuw.only = trunc nuw i16 3 to i8
+ %trunc.nsw.only = trunc nsw i16 3 to i8
+ %zext.plain = zext i16 3 to i64
+ %gep.a = getelementptr i8, ptr %A, i16 %iv
+ %gep.b = getelementptr i64, ptr %B, i16 %iv
+ store i8 %trunc.nuw.only, ptr %gep.a
+ store i8 %trunc.nsw.only, ptr %gep.a
+ store i64 %zext.plain, ptr %gep.b
+ %iv.next = add nsw i16 %iv, 1
+ %ec = icmp slt i16 %iv.next, 4
+ br i1 %ec, label %loop, label %exit
+
+exit:
+ ret void
+}
More information about the llvm-commits
mailing list