[llvm] [GlobalISel] Add bail outs for scalable vectors to some combines. (PR #106496)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 28 22:44:32 PDT 2024
https://github.com/topperc created https://github.com/llvm/llvm-project/pull/106496
These combines call getNumElements() which isn't valid for scalable vectors.
>From c10d09a4e5f71dfba8cb09ab7ae5ae34c7dd7a43 Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.topper at sifive.com>
Date: Wed, 28 Aug 2024 22:40:49 -0700
Subject: [PATCH] [GlobalISel] Add bail outs for scalable vectors to some
combines.
These combines call getNumElements() which isn't valid for
scalable vectors.
---
llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
index 1517ae707c8cff..df9c12bc9c97bd 100644
--- a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
@@ -2678,6 +2678,9 @@ bool CombinerHelper::matchInsertExtractVecEltOutOfBounds(MachineInstr &MI) {
MI.getOpcode() == TargetOpcode::G_EXTRACT_VECTOR_ELT) &&
"Expected an insert/extract element op");
LLT VecTy = MRI.getType(MI.getOperand(1).getReg());
+ if (VecTy.isScalableVector())
+ return false;
+
unsigned IdxIdx =
MI.getOpcode() == TargetOpcode::G_EXTRACT_VECTOR_ELT ? 2 : 3;
auto Idx = getIConstantVRegVal(MI.getOperand(IdxIdx).getReg(), MRI);
@@ -2961,6 +2964,10 @@ bool CombinerHelper::matchCombineInsertVecElts(
Register DstReg = MI.getOperand(0).getReg();
LLT DstTy = MRI.getType(DstReg);
assert(DstTy.isVector() && "Invalid G_INSERT_VECTOR_ELT?");
+
+ if (DstTy.isScalableVector())
+ return false;
+
unsigned NumElts = DstTy.getNumElements();
// If this MI is part of a sequence of insert_vec_elts, then
// don't do the combine in the middle of the sequence.
@@ -4046,6 +4053,8 @@ bool CombinerHelper::matchExtractVecEltBuildVec(MachineInstr &MI,
// and find the source register that the index maps to.
Register SrcVec = MI.getOperand(1).getReg();
LLT SrcTy = MRI.getType(SrcVec);
+ if (SrcTy.isScalableVector())
+ return false;
auto Cst = getIConstantVRegValWithLookThrough(MI.getOperand(2).getReg(), MRI);
if (!Cst || Cst->Value.getZExtValue() >= SrcTy.getNumElements())
More information about the llvm-commits
mailing list