[llvm] [LLVM][Verifier] Remove constant-only matrix stride check (PR #207665)

via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 17 01:54:18 PDT 2026


https://github.com/mayanksolanki393 updated https://github.com/llvm/llvm-project/pull/207665

>From 75be4a98bbf29fe2f1816d61c0c7983a239dba29 Mon Sep 17 00:00:00 2001
From: mayanksolanki393 <mayanksolanki393 at gmail.com>
Date: Mon, 6 Jul 2026 12:29:52 +0530
Subject: [PATCH 1/3] [LLVM][Verifier] Remove constant-only matrix stride check

    Remove the verifier check requiring constant column-major matrix
    load/store strides to be greater than or equal to the row count.

    The stride operand is not an immarg, so the verifier must not enforce
    constraints that only apply when the argument happens to be constant.
    Add coverage for an inline case where a non-constant stride is folded to
    a smaller constant stride.
---
 llvm/lib/IR/Verifier.cpp                       |  2 --
 llvm/test/Verifier/matrix-intrinsics-inline.ll | 18 ++++++++++++++++++
 llvm/test/Verifier/matrix-intrinsics.ll        | 18 ------------------
 3 files changed, 18 insertions(+), 20 deletions(-)
 create mode 100644 llvm/test/Verifier/matrix-intrinsics-inline.ll

diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 198ff055f9721..2bd091ff61cf3 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -6663,8 +6663,6 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
     if (Stride) {
       Check(Stride->getBitWidth() <= 64, "Stride bitwidth cannot exceed 64!",
             IF);
-      Check(Stride->getZExtValue() >= NumRows->getZExtValue(),
-            "Stride must be greater or equal than the number of rows!", IF);
     }
 
     break;
diff --git a/llvm/test/Verifier/matrix-intrinsics-inline.ll b/llvm/test/Verifier/matrix-intrinsics-inline.ll
new file mode 100644
index 0000000000000..000ad6d5c51e4
--- /dev/null
+++ b/llvm/test/Verifier/matrix-intrinsics-inline.ll
@@ -0,0 +1,18 @@
+; RUN: opt -passes=inline -S %s 2>&1 | FileCheck %s
+; CHECK-NOT: LLVM ERROR: Broken module found, compilation aborted!
+define void @bar(i32 %stride) {
+  call void @llvm.matrix.column.major.store.v6f64.i32(<6 x double> zeroinitializer, ptr null, i32 %stride, i1 false, i32 3, i32 2)
+  ret void
+}
+
+; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: write)
+declare void @llvm.matrix.column.major.store.v6f64.i32(<6 x double>, ptr nocapture writeonly, i32, i1 immarg, i32 immarg, i32 immarg)
+
+define i64 @foo() {
+entry:
+  unreachable
+
+sink.call:                                        ; No predecessors!
+  call void @bar(i32 0)
+  ret i64 0
+}
\ No newline at end of file
diff --git a/llvm/test/Verifier/matrix-intrinsics.ll b/llvm/test/Verifier/matrix-intrinsics.ll
index 42e98d5805c0f..58b69cd6d96cf 100644
--- a/llvm/test/Verifier/matrix-intrinsics.ll
+++ b/llvm/test/Verifier/matrix-intrinsics.ll
@@ -96,24 +96,6 @@ define void @column.major_store_non_int_float_type(ptr %m, ptr %n, i64 %arg) {
   ret void
 }
 
-define <4 x float> @column.major_load_stride_too_small(ptr %m, i32 %arg) {
-;
-; CHECK-NEXT: Stride must be greater or equal than the number of rows!
-; CHECK-NEXT: ptr @llvm.matrix.column.major.load.v4f32.i64
-;
-  %result.1 = call <4 x float> @llvm.matrix.column.major.load.v4f32.i64(ptr %m, i64 1, i1 false, i32 2, i32 2)
-  ret <4 x float> %result.1
-}
-
-define void @column.major_store_stride_too_small(ptr %m, i64 %arg) {
-;
-; CHECK-NEXT: Stride must be greater or equal than the number of rows!
-; CHECK-NEXT: ptr @llvm.matrix.column.major.store.v4f32.i64
-;
-  call void @llvm.matrix.column.major.store.v4f32.i64(<4 x float> zeroinitializer, ptr %m, i64 1, i1 false, i32 2, i32 2)
-  ret void
-}
-
 define <4 x float> @column.major_load_stride_i128(ptr %m, i32 %arg) {
 ; CHECK-NEXT: Stride bitwidth cannot exceed 64!
 ; CHECK-NEXT: ptr @llvm.matrix.column.major.load.v4f32.i128

>From 1b177dd0de7c3188a0b7b1e6b65298f1dcdc4b49 Mon Sep 17 00:00:00 2001
From: Mayank Solanki <mayanksolanki393 at gmail.com>
Date: Fri, 17 Jul 2026 10:49:58 +0530
Subject: [PATCH 2/3] [LLVM][Verifier] Remove constant-only matrix stride check

---
 llvm/test/Verifier/matrix-intrinsics-inline.ll | 18 ------------------
 llvm/test/Verifier/matrix-intrinsics.ll        | 16 ++++++++++++++++
 2 files changed, 16 insertions(+), 18 deletions(-)
 delete mode 100644 llvm/test/Verifier/matrix-intrinsics-inline.ll

diff --git a/llvm/test/Verifier/matrix-intrinsics-inline.ll b/llvm/test/Verifier/matrix-intrinsics-inline.ll
deleted file mode 100644
index 000ad6d5c51e4..0000000000000
--- a/llvm/test/Verifier/matrix-intrinsics-inline.ll
+++ /dev/null
@@ -1,18 +0,0 @@
-; RUN: opt -passes=inline -S %s 2>&1 | FileCheck %s
-; CHECK-NOT: LLVM ERROR: Broken module found, compilation aborted!
-define void @bar(i32 %stride) {
-  call void @llvm.matrix.column.major.store.v6f64.i32(<6 x double> zeroinitializer, ptr null, i32 %stride, i1 false, i32 3, i32 2)
-  ret void
-}
-
-; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: write)
-declare void @llvm.matrix.column.major.store.v6f64.i32(<6 x double>, ptr nocapture writeonly, i32, i1 immarg, i32 immarg, i32 immarg)
-
-define i64 @foo() {
-entry:
-  unreachable
-
-sink.call:                                        ; No predecessors!
-  call void @bar(i32 0)
-  ret i64 0
-}
\ No newline at end of file
diff --git a/llvm/test/Verifier/matrix-intrinsics.ll b/llvm/test/Verifier/matrix-intrinsics.ll
index 58b69cd6d96cf..574260a1c344d 100644
--- a/llvm/test/Verifier/matrix-intrinsics.ll
+++ b/llvm/test/Verifier/matrix-intrinsics.ll
@@ -96,6 +96,22 @@ define void @column.major_store_non_int_float_type(ptr %m, ptr %n, i64 %arg) {
   ret void
 }
 
+define <4 x float> @column.major_load_stride_too_small(ptr %m, i32 %arg) {
+;
+; CHECK-NOT: Stride must be greater or equal than the number of rows!
+;
+  %result.1 = call <4 x float> @llvm.matrix.column.major.load.v4f32.i64(ptr %m, i64 1, i1 false, i32 2, i32 2)
+  ret <4 x float> %result.1
+}
+
+define void @column.major_store_stride_too_small(ptr %m, i64 %arg) {
+;
+; CHECK-NOT: Stride must be greater or equal than the number of rows!
+;
+  call void @llvm.matrix.column.major.store.v4f32.i64(<4 x float> zeroinitializer, ptr %m, i64 1, i1 false, i32 2, i32 2)
+  ret void
+}
+
 define <4 x float> @column.major_load_stride_i128(ptr %m, i32 %arg) {
 ; CHECK-NEXT: Stride bitwidth cannot exceed 64!
 ; CHECK-NEXT: ptr @llvm.matrix.column.major.load.v4f32.i128

>From 3686eef27771ececb93c4ac65dc133f3562ea34d Mon Sep 17 00:00:00 2001
From: Mayank Solanki <mayanksolanki393 at gmail.com>
Date: Fri, 17 Jul 2026 14:23:50 +0530
Subject: [PATCH 3/3] [LLVM][Verifier] Remove constant-only matrix stride check

---
 llvm/lib/IR/Verifier.cpp | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 2bd091ff61cf3..f6ece4541c3ab 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -6584,7 +6584,7 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
   case Intrinsic::matrix_column_major_load:
   case Intrinsic::matrix_column_major_store: {
     Function *IF = Call.getCalledFunction();
-    ConstantInt *Stride = nullptr;
+    Value *Stride = nullptr;
     ConstantInt *NumRows;
     ConstantInt *NumColumns;
     VectorType *ResultTy;
@@ -6621,14 +6621,14 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
           cast<VectorType>(Call.getArgOperand(0)->getType())->getElementType();
       break;
     case Intrinsic::matrix_column_major_load: {
-      Stride = dyn_cast<ConstantInt>(Call.getArgOperand(1));
+      Stride = Call.getArgOperand(1);
       NumRows = cast<ConstantInt>(Call.getArgOperand(3));
       NumColumns = cast<ConstantInt>(Call.getArgOperand(4));
       ResultTy = cast<VectorType>(Call.getType());
       break;
     }
     case Intrinsic::matrix_column_major_store: {
-      Stride = dyn_cast<ConstantInt>(Call.getArgOperand(2));
+      Stride = Call.getArgOperand(2);
       NumRows = cast<ConstantInt>(Call.getArgOperand(4));
       NumColumns = cast<ConstantInt>(Call.getArgOperand(5));
       ResultTy = cast<VectorType>(Call.getArgOperand(0)->getType());
@@ -6660,10 +6660,9 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
               NumRows->getZExtValue() * NumColumns->getZExtValue(),
           "Result of a matrix operation does not fit in the returned vector!");
 
-    if (Stride) {
-      Check(Stride->getBitWidth() <= 64, "Stride bitwidth cannot exceed 64!",
-            IF);
-    }
+    if (Stride)
+      Check(Stride->getType()->getIntegerBitWidth() <= 64,
+            "Stride bitwidth cannot exceed 64!", IF);
 
     break;
   }



More information about the llvm-commits mailing list