[llvm] [Intrinsics] Check that element count is a valid multiple before calling VectorType::getOneNthElementsVectorType. (PR #178283)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 27 11:52:57 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-ir
Author: Craig Topper (topperc)
<details>
<summary>Changes</summary>
Fixes #<!-- -->178275
---
Full diff: https://github.com/llvm/llvm-project/pull/178283.diff
2 Files Affected:
- (modified) llvm/lib/IR/Intrinsics.cpp (+9-5)
- (added) llvm/test/Assembler/invalid-interleave.ll (+9)
``````````diff
diff --git a/llvm/lib/IR/Intrinsics.cpp b/llvm/lib/IR/Intrinsics.cpp
index f46d3e5063e43..48abead0929dd 100644
--- a/llvm/lib/IR/Intrinsics.cpp
+++ b/llvm/lib/IR/Intrinsics.cpp
@@ -974,14 +974,18 @@ matchIntrinsicType(Type *Ty, ArrayRef<Intrinsic::IITDescriptor> &Infos,
return Ty != NewTy;
}
- case IITDescriptor::OneNthEltsVecArgument:
+ case IITDescriptor::OneNthEltsVecArgument: {
// If this is a forward reference, defer the check for later.
if (D.getRefArgNumber() >= ArgTys.size())
return IsDeferredCheck || DeferCheck(Ty);
- return !isa<VectorType>(ArgTys[D.getRefArgNumber()]) ||
- VectorType::getOneNthElementsVectorType(
- cast<VectorType>(ArgTys[D.getRefArgNumber()]),
- D.getVectorDivisor()) != Ty;
+ auto *VTy = dyn_cast<VectorType>(ArgTys[D.getRefArgNumber()]);
+ if (!VTy)
+ return true;
+ if (!VTy->getElementCount().isKnownMultipleOf(D.getVectorDivisor()))
+ return true;
+ return VectorType::getOneNthElementsVectorType(VTy, D.getVectorDivisor()) !=
+ Ty;
+ }
case IITDescriptor::SameVecWidthArgument: {
if (D.getArgumentNumber() >= ArgTys.size()) {
// Defer check and subsequent check for the vector element type.
diff --git a/llvm/test/Assembler/invalid-interleave.ll b/llvm/test/Assembler/invalid-interleave.ll
new file mode 100644
index 0000000000000..bc650aa35f4d1
--- /dev/null
+++ b/llvm/test/Assembler/invalid-interleave.ll
@@ -0,0 +1,9 @@
+; RUN: not llvm-as < %s 2>&1 | FileCheck %s
+
+; Input element count without vscale is not a multiple of 3.
+
+; CHECK: error: invalid intrinsic signature
+define { <vscale x 2 x i32>, <vscale x 2 x i32>, <vscale x 2 x i32> } @test(<vscale x 8 x i8> %ptr) {
+ %v = tail call { <vscale x 2 x i32>, <vscale x 2 x i32>, <vscale x 2 x i32> } @llvm.vector.deinterleave3.nxv6i32(<vscale x 8 x i8> %ptr)
+ ret { <vscale x 2 x i32>, <vscale x 2 x i32>, <vscale x 2 x i32> } %v
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/178283
More information about the llvm-commits
mailing list