[VPlan] Add m_ExtractLastElement matcher. (NFC)
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 729ac83..04d777f 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -8599,8 +8599,7 @@
// the VPIRInstruction modeling the phi.
for (VPUser *U : FOR->users()) {
using namespace llvm::VPlanPatternMatch;
- if (!match(U, m_VPInstruction<VPInstruction::ExtractLastElement>(
- m_Specific(FOR))))
+ if (!match(U, m_ExtractLastElement(m_Specific(FOR))))
continue;
// For VF vscale x 1, if vscale = 1, we are unable to extract the
// penultimate value of the recurrence. Instead we rely on the existing
@@ -9242,8 +9241,7 @@
if (FinalReductionResult == U || Parent->getParent())
continue;
U->replaceUsesOfWith(OrigExitingVPV, FinalReductionResult);
- if (match(U, m_VPInstruction<VPInstruction::ExtractLastElement>(
- m_VPValue())))
+ if (match(U, m_ExtractLastElement(m_VPValue())))
cast<VPInstruction>(U)->replaceAllUsesWith(FinalReductionResult);
}
diff --git a/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h b/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
index 490c5c4..214d522 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
+++ b/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
@@ -301,6 +301,11 @@
return m_VPInstruction<VPInstruction::Broadcast>(Op0);
}
+template <typename Op0_t>
+inline VPInstruction_match<VPInstruction::ExtractLastElement, Op0_t>
+m_ExtractLastElement(const Op0_t &Op0) {
+ return m_VPInstruction<VPInstruction::ExtractLastElement>(Op0);
+}
template <typename Op0_t, typename Op1_t>
inline VPInstruction_match<VPInstruction::ActiveLaneMask, Op0_t, Op1_t>
m_ActiveLaneMask(const Op0_t &Op0, const Op1_t &Op1) {
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 677d97e..0d2e8cf 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -832,8 +832,7 @@
VPBlockBase *PredVPBB, VPValue *Op,
DenseMap<VPValue *, VPValue *> &EndValues) {
VPValue *Incoming;
- if (!match(Op, m_VPInstruction<VPInstruction::ExtractLastElement>(
- m_VPValue(Incoming))))
+ if (!match(Op, m_ExtractLastElement(m_VPValue(Incoming))))
return nullptr;
auto *WideIV = getOptimizableIVOf(Incoming);
@@ -1173,8 +1172,7 @@
}
// Look through ExtractLastElement (BuildVector ....).
- if (match(&R, m_VPInstruction<VPInstruction::ExtractLastElement>(
- m_BuildVector()))) {
+ if (match(&R, m_ExtractLastElement(m_BuildVector()))) {
auto *BuildVector = cast<VPInstruction>(R.getOperand(0));
Def->replaceAllUsesWith(
BuildVector->getOperand(BuildVector->getNumOperands() - 1));
@@ -1228,15 +1226,13 @@
return;
}
- if (match(Def, m_VPInstruction<VPInstruction::ExtractLastElement>(
- m_Broadcast(m_VPValue(A))))) {
+ if (match(Def, m_ExtractLastElement(m_Broadcast(m_VPValue(A))))) {
Def->replaceAllUsesWith(A);
return;
}
VPInstruction *OpVPI;
- if (match(Def, m_VPInstruction<VPInstruction::ExtractLastElement>(
- m_VPInstruction(OpVPI))) &&
+ if (match(Def, m_ExtractLastElement(m_VPInstruction(OpVPI))) &&
OpVPI->isVectorToScalar()) {
Def->replaceAllUsesWith(OpVPI);
return;
diff --git a/llvm/lib/Transforms/Vectorize/VPlanUnroll.cpp b/llvm/lib/Transforms/Vectorize/VPlanUnroll.cpp
index d47d76d..4bcde8c 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanUnroll.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanUnroll.cpp
@@ -373,8 +373,7 @@
R.addOperand(getValueForPart(Op1, Part));
continue;
}
- if (match(&R, m_VPInstruction<VPInstruction::ExtractLastElement>(
- m_VPValue(Op0))) ||
+ if (match(&R, m_ExtractLastElement(m_VPValue(Op0))) ||
match(&R, m_VPInstruction<VPInstruction::ExtractPenultimateElement>(
m_VPValue(Op0)))) {
addUniformForAllParts(cast<VPSingleDefRecipe>(&R));