[llvm] [SLP][modularisation][NFC] Move isFirstInsertElement/getDebugLocFromPHI to SLPUtils (PR #222612)
Madhur Amilkanthwar via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 10 04:12:55 PDT 2026
https://github.com/madhur13490 created https://github.com/llvm/llvm-project/pull/222612
Move the BoUpSLP-independent helpers isFirstInsertElement and
getDebugLocFromPHI out of SLPVectorizer.cpp into the self-contained
SLPVectorizer/SLPUtils.{h,cpp} module.
Part of the SLPVectorizer.cpp modularization effort:
https://discourse.llvm.org/t/modularizing-slpvectorizer-cpp/90922
>From e46c2db12bbbabacc71a8ace6c5fd3abda74514f Mon Sep 17 00:00:00 2001
From: Madhur Amilkanthwar <madhura at nvidia.com>
Date: Thu, 10 Sep 2026 04:08:12 -0700
Subject: [PATCH] [SLP][modularisation][NFC] Move
isFirstInsertElement/getDebugLocFromPHI to SLPUtils
Move the BoUpSLP-independent helpers isFirstInsertElement and
getDebugLocFromPHI out of SLPVectorizer.cpp into the self-contained
SLPVectorizer/SLPUtils.{h,cpp} module.
Part of the SLPVectorizer.cpp modularization effort:
https://discourse.llvm.org/t/modularizing-slpvectorizer-cpp/90922
---
.../Transforms/Vectorize/SLPVectorizer.cpp | 33 ------------------
.../Vectorize/SLPVectorizer/SLPUtils.cpp | 34 +++++++++++++++++++
.../Vectorize/SLPVectorizer/SLPUtils.h | 12 +++++++
3 files changed, 46 insertions(+), 33 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 3fd146320c959..ee9ad7fc43973 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -18076,33 +18076,6 @@ InstructionCost BoUpSLP::getSpillCost() {
/// Checks if the \p IE1 instructions is followed by \p IE2 instruction in the
/// buildvector sequence.
-static bool isFirstInsertElement(const InsertElementInst *IE1,
- const InsertElementInst *IE2) {
- if (IE1 == IE2)
- return false;
- const auto *I1 = IE1;
- const auto *I2 = IE2;
- const InsertElementInst *PrevI1;
- const InsertElementInst *PrevI2;
- unsigned Idx1 = *getElementIndex(IE1);
- unsigned Idx2 = *getElementIndex(IE2);
- do {
- if (I2 == IE1)
- return true;
- if (I1 == IE2)
- return false;
- PrevI1 = I1;
- PrevI2 = I2;
- if (I1 && (I1 == IE1 || I1->hasOneUse()) &&
- getElementIndex(I1).value_or(Idx2) != Idx2)
- I1 = dyn_cast<InsertElementInst>(I1->getOperand(0));
- if (I2 && ((I2 == IE2 || I2->hasOneUse())) &&
- getElementIndex(I2).value_or(Idx1) != Idx1)
- I2 = dyn_cast<InsertElementInst>(I2->getOperand(0));
- } while ((I1 && PrevI1 != I1) || (I2 && PrevI2 != I2));
- llvm_unreachable("Two different buildvectors not expected.");
-}
-
namespace {
/// Returns incoming Value *, if the requested type is Value * too, or a default
/// value, otherwise.
@@ -22380,12 +22353,6 @@ static Instruction *propagateMetadata(Instruction *Inst, ArrayRef<Value *> VL) {
return llvm::propagateMetadata(Inst, Insts);
}
-static DebugLoc getDebugLocFromPHI(PHINode &PN) {
- if (DebugLoc DL = PN.getDebugLoc())
- return DL;
- return DebugLoc::getUnknown();
-}
-
Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
IRBuilderBase::InsertPointGuard Guard(Builder);
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.cpp
index e7d5498c757e4..56915bda370cf 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.cpp
@@ -16,6 +16,7 @@
#include "llvm/Analysis/VectorUtils.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
+#include "llvm/IR/DebugLoc.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Instructions.h"
@@ -1139,4 +1140,37 @@ TargetTransformInfo::TargetCostKind getSLPCostKind(const Function *F) {
return F->hasOptSize() ? TTI::TCK_CodeSize : TTI::TCK_RecipThroughput;
}
+bool isFirstInsertElement(const InsertElementInst *IE1,
+ const InsertElementInst *IE2) {
+ if (IE1 == IE2)
+ return false;
+ const auto *I1 = IE1;
+ const auto *I2 = IE2;
+ const InsertElementInst *PrevI1;
+ const InsertElementInst *PrevI2;
+ unsigned Idx1 = *getElementIndex(IE1);
+ unsigned Idx2 = *getElementIndex(IE2);
+ do {
+ if (I2 == IE1)
+ return true;
+ if (I1 == IE2)
+ return false;
+ PrevI1 = I1;
+ PrevI2 = I2;
+ if (I1 && (I1 == IE1 || I1->hasOneUse()) &&
+ getElementIndex(I1).value_or(Idx2) != Idx2)
+ I1 = dyn_cast<InsertElementInst>(I1->getOperand(0));
+ if (I2 && ((I2 == IE2 || I2->hasOneUse())) &&
+ getElementIndex(I2).value_or(Idx1) != Idx1)
+ I2 = dyn_cast<InsertElementInst>(I2->getOperand(0));
+ } while ((I1 && PrevI1 != I1) || (I2 && PrevI2 != I2));
+ llvm_unreachable("Two different buildvectors not expected.");
+}
+
+DebugLoc getDebugLocFromPHI(PHINode &PN) {
+ if (DebugLoc DL = PN.getDebugLoc())
+ return DL;
+ return DebugLoc::getUnknown();
+}
+
} // namespace llvm::slpvectorizer
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.h b/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.h
index 91340ac0d07c6..f319b1aea7e5a 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.h
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.h
@@ -32,8 +32,11 @@ namespace llvm {
class AssumptionCache;
class Constant;
class DataLayout;
+class DebugLoc;
class Instruction;
+class InsertElementInst;
class IRBuilderBase;
+class PHINode;
class TargetLibraryInfo;
class Type;
class Value;
@@ -411,6 +414,15 @@ void collectNarrowedLeaves(Value *V, unsigned RdxOpcode, unsigned WideBW,
TargetTransformInfo::TargetCostKind getSLPCostKind(const Function *F);
+/// \returns true if \p IE1 appears before \p IE2 in the same insertelement
+/// build-vector chain.
+bool isFirstInsertElement(const InsertElementInst *IE1,
+ const InsertElementInst *IE2);
+
+/// \returns the debug location of \p PN, or an unknown location if it has
+/// none.
+DebugLoc getDebugLocFromPHI(PHINode &PN);
+
} // namespace llvm::slpvectorizer
#endif // LLVM_LIB_TRANSFORMS_VECTORIZE_SLPVECTORIZER_SLPUTILS_H
More information about the llvm-commits
mailing list