[llvm] [SLP][NFC] Refactor duplicate code into `getVectorizedValue` (PR #156277)
Piotr Fusik via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 1 07:57:01 PDT 2025
https://github.com/pfusik updated https://github.com/llvm/llvm-project/pull/156277
>From 8911d7984fa085308f1c319e1032249a0a765923 Mon Sep 17 00:00:00 2001
From: Piotr Fusik <p.fusik at samsung.com>
Date: Mon, 1 Sep 2025 07:05:56 +0200
Subject: [PATCH 1/3] [SLP][NFC] Refactor duplicate code into
`getVectorizedValue`
---
.../Transforms/Vectorize/SLPVectorizer.cpp | 48 +++++++------------
1 file changed, 16 insertions(+), 32 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 4d4f34a0bdd38..a3a79c91072a1 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -17848,6 +17848,18 @@ class BoUpSLP::ShuffleInstructionBuilder final : public BaseShuffleAnalysis {
IsSigned.value_or(!isKnownNonNegative(V, SimplifyQuery(*R.DL))));
}
+ Value *getVectorizedValue(const TreeEntry &E1) {
+ Value *V1 = E1.VectorizedValue;
+ if (!V1->getType()->isIntOrIntVectorTy())
+ return V1;
+ return castToScalarTyElem(V1, any_of(E1.Scalars, [&](Value *V) {
+ if (isa<PoisonValue>(V))
+ return false;
+ return !isKnownNonNegative(
+ V, SimplifyQuery(*R.DL));
+ }));
+ }
+
public:
ShuffleInstructionBuilder(Type *ScalarTy, IRBuilderBase &Builder, BoUpSLP &R)
: BaseShuffleAnalysis(ScalarTy), Builder(Builder), R(R) {}
@@ -18014,35 +18026,14 @@ class BoUpSLP::ShuffleInstructionBuilder final : public BaseShuffleAnalysis {
/// Adds 2 input vectors (in form of tree entries) and the mask for their
/// shuffling.
void add(const TreeEntry &E1, const TreeEntry &E2, ArrayRef<int> Mask) {
- Value *V1 = E1.VectorizedValue;
- if (V1->getType()->isIntOrIntVectorTy())
- V1 = castToScalarTyElem(V1, any_of(E1.Scalars, [&](Value *V) {
- if (isa<PoisonValue>(V))
- return false;
- return !isKnownNonNegative(
- V, SimplifyQuery(*R.DL));
- }));
- Value *V2 = E2.VectorizedValue;
- if (V2->getType()->isIntOrIntVectorTy())
- V2 = castToScalarTyElem(V2, any_of(E2.Scalars, [&](Value *V) {
- if (isa<PoisonValue>(V))
- return false;
- return !isKnownNonNegative(
- V, SimplifyQuery(*R.DL));
- }));
+ Value *V1 = getVectorizedValue(E1);
+ Value *V2 = getVectorizedValue(E2);
add(V1, V2, Mask);
}
/// Adds single input vector (in form of tree entry) and the mask for its
/// shuffling.
void add(const TreeEntry &E1, ArrayRef<int> Mask) {
- Value *V1 = E1.VectorizedValue;
- if (V1->getType()->isIntOrIntVectorTy())
- V1 = castToScalarTyElem(V1, any_of(E1.Scalars, [&](Value *V) {
- if (isa<PoisonValue>(V))
- return false;
- return !isKnownNonNegative(
- V, SimplifyQuery(*R.DL));
- }));
+ Value *V1 = getVectorizedValue(E1);
add(V1, Mask);
}
/// Adds 2 input vectors and the mask for their shuffling.
@@ -18191,14 +18182,7 @@ class BoUpSLP::ShuffleInstructionBuilder final : public BaseShuffleAnalysis {
auto CreateSubVectors = [&](Value *Vec,
SmallVectorImpl<int> &CommonMask) {
for (auto [E, Idx] : SubVectors) {
- Value *V = E->VectorizedValue;
- if (V->getType()->isIntOrIntVectorTy())
- V = castToScalarTyElem(V, any_of(E->Scalars, [&](Value *V) {
- if (isa<PoisonValue>(V))
- return false;
- return !isKnownNonNegative(
- V, SimplifyQuery(*R.DL));
- }));
+ Value *V = getVectorizedValue(*E);
unsigned InsertionIndex = Idx * getNumElements(ScalarTy);
// Use scalar version of the SCalarType to correctly handle shuffles
// for revectorization. The revectorization mode operates by the
>From 7896f5f30d585e04fedc8000c9bd2c027ead3d88 Mon Sep 17 00:00:00 2001
From: Piotr Fusik <p.fusik at samsung.com>
Date: Mon, 1 Sep 2025 10:12:34 +0200
Subject: [PATCH 2/3] [SLP][NFC] `if` -> `&&`
---
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index a3a79c91072a1..53ed93d353255 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -17853,10 +17853,9 @@ class BoUpSLP::ShuffleInstructionBuilder final : public BaseShuffleAnalysis {
if (!V1->getType()->isIntOrIntVectorTy())
return V1;
return castToScalarTyElem(V1, any_of(E1.Scalars, [&](Value *V) {
- if (isa<PoisonValue>(V))
- return false;
- return !isKnownNonNegative(
- V, SimplifyQuery(*R.DL));
+ return !isa<PoisonValue>(V) &&
+ !isKnownNonNegative(
+ V, SimplifyQuery(*R.DL));
}));
}
>From 1dac199ad53bd530287ad448a9665cf41a6f1d96 Mon Sep 17 00:00:00 2001
From: Piotr Fusik <p.fusik at samsung.com>
Date: Mon, 1 Sep 2025 16:56:23 +0200
Subject: [PATCH 3/3] [SLP][NFC] Rename variables
---
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 53ed93d353255..19936e235d935 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -17848,11 +17848,11 @@ class BoUpSLP::ShuffleInstructionBuilder final : public BaseShuffleAnalysis {
IsSigned.value_or(!isKnownNonNegative(V, SimplifyQuery(*R.DL))));
}
- Value *getVectorizedValue(const TreeEntry &E1) {
- Value *V1 = E1.VectorizedValue;
- if (!V1->getType()->isIntOrIntVectorTy())
- return V1;
- return castToScalarTyElem(V1, any_of(E1.Scalars, [&](Value *V) {
+ Value *getVectorizedValue(const TreeEntry &E) {
+ Value *Vec = E.VectorizedValue;
+ if (!Vec->getType()->isIntOrIntVectorTy())
+ return Vec;
+ return castToScalarTyElem(Vec, any_of(E.Scalars, [&](Value *V) {
return !isa<PoisonValue>(V) &&
!isKnownNonNegative(
V, SimplifyQuery(*R.DL));
More information about the llvm-commits
mailing list