[llvm] [SLP] NFC. Add assert for ShuffleCostEstimator and ShuffleInstructionBuilder usage. (PR #123708)

Han-Kuan Chen via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 21 21:03:57 PST 2025


https://github.com/HanKuanChen updated https://github.com/llvm/llvm-project/pull/123708

>From 3d3ad5fbcfe130d1f4040e1d46ad9b0bf3782746 Mon Sep 17 00:00:00 2001
From: Han-Kuan Chen <hankuan.chen at sifive.com>
Date: Thu, 16 Jan 2025 04:50:40 -0800
Subject: [PATCH] [SLP] NFC. Add assert for ShuffleCostEstimator and
 ShuffleInstructionBuilder usage.

---
 .../Transforms/Vectorize/SLPVectorizer.cpp    | 33 +++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index fc3afed391a06d..1fbda3b77605a7 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -10932,6 +10932,7 @@ class BoUpSLP::ShuffleCostEstimator : public BaseShuffleAnalysis {
            ArrayRef<std::pair<const TreeEntry *, unsigned>> SubVectors,
            ArrayRef<int> SubVectorsMask, unsigned VF = 0,
            function_ref<void(Value *&, SmallVectorImpl<int> &)> Action = {}) {
+    assert(!IsFinalized && "ShuffleCostEstimator is already finalized.");
     IsFinalized = true;
     if (Action) {
       const PointerUnion<Value *, const TreeEntry *> &Vec = InVectors.front();
@@ -14524,6 +14525,7 @@ class BoUpSLP::ShuffleInstructionBuilder final : public BaseShuffleAnalysis {
            ArrayRef<std::pair<const TreeEntry *, unsigned>> SubVectors,
            ArrayRef<int> SubVectorsMask, unsigned VF = 0,
            function_ref<void(Value *&, SmallVectorImpl<int> &)> Action = {}) {
+    assert(!IsFinalized && "ShuffleInstructionBuilder is already finalized.");
     IsFinalized = true;
     unsigned ScalarTyNumElements = getNumElements(ScalarTy);
     SmallVector<int> NewExtMask(ExtMask);
@@ -14696,6 +14698,8 @@ Value *BoUpSLP::vectorizeOperand(TreeEntry *E, unsigned NodeIdx,
           NumElements != 1 ? FixedVectorType::get(ScalarTy, NumElements)
                            : ScalarTy,
           Builder, *this);
+      assert(Mask.size() == VL.size() &&
+             "The mask is incompatible with the expected result.");
       ShuffleBuilder.add(V, Mask);
       SmallVector<std::pair<const TreeEntry *, unsigned>> SubVectors(
           E->CombinedEntriesWithIndices.size());
@@ -14912,6 +14916,8 @@ ResTy BoUpSLP::processBuildVector(const TreeEntry *E, Type *ScalarTy,
         // process to keep correct order.
         return *Delayed;
       }
+      assert(ExtractMask.size() == E->Scalars.size() &&
+             "The mask is incompatible with the expected result.");
       if (Value *VecBase = ShuffleBuilder.adjustExtracts(
               E, ExtractMask, ExtractShuffles, NumParts, UseVecBaseAsInput)) {
         ExtractVecBase = VecBase;
@@ -14973,6 +14979,8 @@ ResTy BoUpSLP::processBuildVector(const TreeEntry *E, Type *ScalarTy,
             Mask[I] = FrontTE->findLaneForValue(V);
           }
         }
+        assert(Mask.size() == E->Scalars.size() &&
+               "The mask is incompatible with the expected result.");
         ShuffleBuilder.add(*FrontTE, Mask);
         // Full matched entry found, no need to insert subvectors.
         Res = ShuffleBuilder.finalize(E->getCommonMask(), {}, {});
@@ -15123,6 +15131,8 @@ ResTy BoUpSLP::processBuildVector(const TreeEntry *E, Type *ScalarTy,
         IsUsedInExpr = false;
         IsNonPoisoned &= isGuaranteedNotToBePoison(Vec1, AC) &&
                          isGuaranteedNotToBePoison(Vec2, AC);
+        assert(ExtractMask.size() == E->Scalars.size() &&
+               "The mask is incompatible with the expected result.");
         ShuffleBuilder.add(Vec1, Vec2, ExtractMask);
       } else if (Vec1) {
         bool IsNotPoisonedVec = isGuaranteedNotToBePoison(Vec1, AC);
@@ -15130,10 +15140,14 @@ ResTy BoUpSLP::processBuildVector(const TreeEntry *E, Type *ScalarTy,
             ExtractMask,
             cast<FixedVectorType>(Vec1->getType())->getNumElements(), 0,
             ExtractMask.size(), IsNotPoisonedVec);
+        assert(ExtractMask.size() == E->Scalars.size() &&
+               "The mask is incompatible with the expected result.");
         ShuffleBuilder.add(Vec1, ExtractMask, /*ForExtracts=*/true);
         IsNonPoisoned &= IsNotPoisonedVec;
       } else {
         IsUsedInExpr = false;
+        assert(ExtractMask.size() == E->Scalars.size() &&
+               "The mask is incompatible with the expected result.");
         ShuffleBuilder.add(PoisonValue::get(VecTy), ExtractMask,
                            /*ForExtracts=*/true);
       }
@@ -15161,10 +15175,16 @@ ResTy BoUpSLP::processBuildVector(const TreeEntry *E, Type *ScalarTy,
           IsUsedInExpr &=
               FindReusedSplat(VecMask, TEs.front()->getVectorFactor(), I,
                               SliceSize, IsNotPoisonedVec);
+          assert((VecMask.size() == E->Scalars.size() ||
+                  VecMask.size() == E->ReuseShuffleIndices.size()) &&
+                 "The mask is incompatible with the expected result.");
           ShuffleBuilder.add(*TEs.front(), VecMask);
           IsNonPoisoned &= IsNotPoisonedVec;
         } else {
           IsUsedInExpr = false;
+          assert((VecMask.size() == E->Scalars.size() ||
+                  VecMask.size() == E->ReuseShuffleIndices.size()) &&
+                 "The mask is incompatible with the expected result.");
           ShuffleBuilder.add(*TEs.front(), *TEs.back(), VecMask);
           if (TEs.front()->VectorizedValue && TEs.back()->VectorizedValue)
             IsNonPoisoned &=
@@ -15229,6 +15249,9 @@ ResTy BoUpSLP::processBuildVector(const TreeEntry *E, Type *ScalarTy,
       SmallVector<int> BVMask(GatheredScalars.size(), PoisonMaskElem);
       TryPackScalars(GatheredScalars, BVMask, /*IsRootPoison=*/true);
       Value *BV = ShuffleBuilder.gather(GatheredScalars, BVMask.size());
+      assert((BVMask.size() == E->Scalars.size() ||
+              BVMask.size() == E->ReuseShuffleIndices.size()) &&
+             "The mask is incompatible with the expected result.");
       ShuffleBuilder.add(BV, BVMask);
     }
     if (all_of(NonConstants, [=](Value *V) {
@@ -15250,6 +15273,9 @@ ResTy BoUpSLP::processBuildVector(const TreeEntry *E, Type *ScalarTy,
     SmallVector<int> ReuseMask(GatheredScalars.size(), PoisonMaskElem);
     TryPackScalars(GatheredScalars, ReuseMask, /*IsRootPoison=*/true);
     Value *BV = ShuffleBuilder.gather(GatheredScalars, ReuseMask.size());
+    assert((ReuseMask.size() == E->Scalars.size() ||
+            ReuseMask.size() == E->ReuseShuffleIndices.size()) &&
+           "The mask is incompatible with the expected result.");
     ShuffleBuilder.add(BV, ReuseMask);
     Res = ShuffleBuilder.finalize(E->ReuseShuffleIndices, SubVectors,
                                   SubVectorsMask);
@@ -15261,6 +15287,8 @@ ResTy BoUpSLP::processBuildVector(const TreeEntry *E, Type *ScalarTy,
         Mask[I] = I;
     }
     Value *BV = ShuffleBuilder.gather(GatheredScalars);
+    assert(Mask.size() == E->Scalars.size() &&
+           "The mask is incompatible with the expected result.");
     ShuffleBuilder.add(BV, Mask);
     Res = ShuffleBuilder.finalize(E->ReuseShuffleIndices, SubVectors,
                                   SubVectorsMask);
@@ -15329,10 +15357,15 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) {
       ArrayRef<int> Mask =
           ArrayRef(reinterpret_cast<const int *>(E->ReorderIndices.begin()),
                    E->ReorderIndices.size());
+      assert((Mask.empty() || Mask.size() == E->Scalars.size()) &&
+             "The mask is incompatible with the expected result.");
       ShuffleBuilder.add(V, Mask);
     } else if (E->State == TreeEntry::StridedVectorize && IsReverseOrder) {
       ShuffleBuilder.addOrdered(V, {});
     } else {
+      assert((E->ReorderIndices.empty() ||
+              E->ReorderIndices.size() == E->Scalars.size()) &&
+             "The mask is incompatible with the expected result.");
       ShuffleBuilder.addOrdered(V, E->ReorderIndices);
     }
     SmallVector<std::pair<const TreeEntry *, unsigned>> SubVectors(



More information about the llvm-commits mailing list