[llvm] 9c20f3b - [Verifier] Prevent insertion/extraction of scalable vectors into/from fixed vectors (#215647)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Aug 22 23:50:13 PDT 2026
Author: Sean Clarke
Date: 2026-08-23T07:50:08+01:00
New Revision: 9c20f3b12d7bf6f3ba2d0bc9bd82189e579a7702
URL: https://github.com/llvm/llvm-project/commit/9c20f3b12d7bf6f3ba2d0bc9bd82189e579a7702
DIFF: https://github.com/llvm/llvm-project/commit/9c20f3b12d7bf6f3ba2d0bc9bd82189e579a7702.diff
LOG: [Verifier] Prevent insertion/extraction of scalable vectors into/from fixed vectors (#215647)
Per LangRef:
> Scalable vectors can only be inserted into other scalable vectors.
> (...)
> Scalable vectors can only be extracted from other scalable vectors.
Add checks to enforce these rules for `llvm.vector.insert` and
`llvm.vector.extract` intrinsics.
Added:
Modified:
llvm/lib/IR/Verifier.cpp
llvm/test/Verifier/insert-extract-intrinsics-invalid.ll
Removed:
################################################################################
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index afaec253f7517..9cef4b05f19e5 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -6863,6 +6863,13 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
"vector_insert index must be a constant multiple of "
"the subvector's known minimum vector length.");
+ // The only allowed 'mixed' case is inserting a fixed vector into a
+ // scalable vector.
+ if (SubVecEC.isScalable()) {
+ Check(VecEC.isScalable(), "cannot vector_insert a scalable vector into "
+ "a fixed vector.");
+ }
+
// If this insertion is not the 'mixed' case where a fixed vector is
// inserted into a scalable vector, ensure that the insertion of the
// subvector does not overrun the parent vector.
@@ -6893,6 +6900,13 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
"vector_extract index must be a constant multiple of "
"the result type's known minimum vector length.");
+ // The only allowed 'mixed' case is extracting a fixed vector from a
+ // scalable vector.
+ if (ResultEC.isScalable()) {
+ Check(VecEC.isScalable(), "cannot vector_extract a scalable vector from "
+ "a fixed vector.");
+ }
+
// If this extraction is not the 'mixed' case where a fixed vector is
// extracted from a scalable vector, ensure that the extraction does not
// overrun the parent vector.
diff --git a/llvm/test/Verifier/insert-extract-intrinsics-invalid.ll b/llvm/test/Verifier/insert-extract-intrinsics-invalid.ll
index 851828d61f955..d7cc71b2bf16b 100644
--- a/llvm/test/Verifier/insert-extract-intrinsics-invalid.ll
+++ b/llvm/test/Verifier/insert-extract-intrinsics-invalid.ll
@@ -78,6 +78,23 @@ define <vscale x 8 x i32> @insert_overrun_scalable_fixed(<vscale x 8 x i32> %vec
ret <vscale x 8 x i32> %1
}
+;
+; Test that extractions/insertions of a scalable vector from/into a fixed vector
+; are captured.
+;
+
+; CHECK: cannot vector_extract a scalable vector from a fixed vector.
+define <vscale x 4 x i32> @extract_scalable_from_fixed(<8 x i32> %vec) {
+ %1 = call <vscale x 4 x i32> @llvm.vector.extract.nxv4i32.v8i32(<8 x i32> %vec, i64 0)
+ ret <vscale x 4 x i32> %1
+}
+
+; CHECK: cannot vector_insert a scalable vector into a fixed vector.
+define <8 x i32> @insert_scalable_into_fixed(<8 x i32> %vec, <vscale x 4 x i32> %subvec) {
+ %1 = call <8 x i32> @llvm.vector.insert.v8i32.nxv4i32(<8 x i32> %vec, <vscale x 4 x i32> %subvec, i64 0)
+ ret <8 x i32> %1
+}
+
declare <vscale x 3 x i32> @llvm.vector.extract.nxv8i32.nxv3i32(<vscale x 8 x i32>, i64)
declare <vscale x 8 x i32> @llvm.vector.insert.nxv8i32.nxv3i32(<vscale x 8 x i32>, <vscale x 3 x i32>, i64)
declare <vscale x 8 x i32> @llvm.vector.insert.nxv8i32.v3i32(<vscale x 8 x i32>, <3 x i32>, i64)
More information about the llvm-commits
mailing list