diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2024-01-24 19:17:23 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2024-04-06 20:13:49 +0000 |
commit | 7a6dacaca14b62ca4b74406814becb87a3fefac0 (patch) | |
tree | 273a870ac27484bb1f5ee55e7ef0dc0d061f63e7 /contrib/llvm-project/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | |
parent | 46c59ea9b61755455ff6bf9f3e7b834e1af634ea (diff) | |
parent | 4df029cc74e5ec124f14a5682e44999ce4f086df (diff) |
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/contrib/llvm-project/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/contrib/llvm-project/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index 055fbb00871f..601d2454c1e1 100644 --- a/contrib/llvm-project/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/contrib/llvm-project/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -7379,6 +7379,8 @@ class BoUpSLP::ShuffleCostEstimator : public BaseShuffleAnalysis { continue; if (Idx >= static_cast<int>(CommonVF)) Idx = E1Mask[Idx - CommonVF] + VF; + else + Idx = E1Mask[Idx]; } CommonVF = VF; } @@ -12986,8 +12988,8 @@ void BoUpSLP::scheduleBlock(BlockScheduling *BS) { for (ScheduleData *BundleMember = Picked; BundleMember; BundleMember = BundleMember->NextInBundle) { Instruction *PickedInst = BundleMember->Inst; - if (PickedInst->getNextNode() != LastScheduledInst) - PickedInst->moveBefore(LastScheduledInst); + if (PickedInst->getNextNonDebugInstruction() != LastScheduledInst) + PickedInst->moveAfter(LastScheduledInst->getPrevNode()); LastScheduledInst = PickedInst; } @@ -13181,7 +13183,7 @@ void BoUpSLP::computeMinimumValueSizes() { // We only attempt to truncate integer expressions. auto &TreeRoot = VectorizableTree[0]->Scalars; auto *TreeRootIT = dyn_cast<IntegerType>(TreeRoot[0]->getType()); - if (!TreeRootIT) + if (!TreeRootIT || VectorizableTree.front()->State == TreeEntry::NeedToGather) return; // Ensure the roots of the vectorizable tree don't form a cycle. @@ -14792,8 +14794,17 @@ public: LocalExternallyUsedValues[RdxVal]; // Update LocalExternallyUsedValues for the scalar, replaced by // extractelement instructions. + DenseMap<Value *, Value *> ReplacementToExternal; + for (const std::pair<Value *, Value *> &Pair : ReplacedExternals) + ReplacementToExternal.try_emplace(Pair.second, Pair.first); for (const std::pair<Value *, Value *> &Pair : ReplacedExternals) { - auto *It = ExternallyUsedValues.find(Pair.first); + Value *Ext = Pair.first; + auto RIt = ReplacementToExternal.find(Ext); + while (RIt != ReplacementToExternal.end()) { + Ext = RIt->second; + RIt = ReplacementToExternal.find(Ext); + } + auto *It = ExternallyUsedValues.find(Ext); if (It == ExternallyUsedValues.end()) continue; LocalExternallyUsedValues[Pair.second].append(It->second); @@ -15214,6 +15225,19 @@ private: assert(IsSupportedHorRdxIdentityOp && "The optimization of matched scalar identity horizontal reductions " "must be supported."); + auto *VTy = cast<FixedVectorType>(VectorizedValue->getType()); + if (VTy->getElementType() != VL.front()->getType()) { + VectorizedValue = Builder.CreateIntCast( + VectorizedValue, + FixedVectorType::get(VL.front()->getType(), VTy->getNumElements()), + any_of(VL, [&](Value *R) { + KnownBits Known = computeKnownBits( + R, cast<Instruction>(ReductionOps.front().front()) + ->getModule() + ->getDataLayout()); + return !Known.isNonNegative(); + })); + } switch (RdxKind) { case RecurKind::Add: { // root = mul prev_root, <1, 1, n, 1> @@ -16217,10 +16241,13 @@ bool SLPVectorizerPass::vectorizeGEPIndices(BasicBlock *BB, BoUpSLP &R) { SetVector<Value *> Candidates(GEPList.begin(), GEPList.end()); // Some of the candidates may have already been vectorized after we - // initially collected them. If so, they are marked as deleted, so remove - // them from the set of candidates. - Candidates.remove_if( - [&R](Value *I) { return R.isDeleted(cast<Instruction>(I)); }); + // initially collected them or their index is optimized to constant value. + // If so, they are marked as deleted, so remove them from the set of + // candidates. + Candidates.remove_if([&R](Value *I) { + return R.isDeleted(cast<Instruction>(I)) || + isa<Constant>(cast<GetElementPtrInst>(I)->idx_begin()->get()); + }); // Remove from the set of candidates all pairs of getelementptrs with // constant differences. Such getelementptrs are likely not good |