[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