[llvm] 98c4f4f - [LV] Remove IVEndValues, use resume value directly from fixed phi.(NFC)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 13 13:04:05 PST 2024
Author: Florian Hahn
Date: 2024-11-13T21:03:54Z
New Revision: 98c4f4fce84bb7b0943be92d06765ed4dff28710
URL: https://github.com/llvm/llvm-project/commit/98c4f4fce84bb7b0943be92d06765ed4dff28710
DIFF: https://github.com/llvm/llvm-project/commit/98c4f4fce84bb7b0943be92d06765ed4dff28710.diff
LOG: [LV] Remove IVEndValues, use resume value directly from fixed phi.(NFC)
Use the IV resume/end values from the phis in the scalar header,
instead of collecting them in a map. This removes some complexity
from the code dealing with induction resume values.
Analogous to 1edd22030 which did the same for reduction resume values.
Added:
Modified:
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 1ebc62f9843905..5d1c54d620ea77 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -537,8 +537,8 @@ class InnerLoopVectorizer {
/// Set up the values of the IVs correctly when exiting the vector loop.
virtual void fixupIVUsers(PHINode *OrigPhi, const InductionDescriptor &II,
- Value *VectorTripCount, Value *EndValue,
- BasicBlock *MiddleBlock, VPTransformState &State);
+ Value *VectorTripCount, BasicBlock *MiddleBlock,
+ VPTransformState &State);
/// Iteratively sink the scalarized operands of a predicated instruction into
/// the block that was created for it.
@@ -651,10 +651,6 @@ class InnerLoopVectorizer {
// Record whether runtime checks are added.
bool AddedSafetyChecks = false;
- // Holds the end values for each induction variable. We save the end values
- // so we can later fix-up the external users of the induction variables.
- DenseMap<PHINode *, Value *> IVEndValues;
-
/// BFI and PSI are used to check for profile guided size optimizations.
BlockFrequencyInfo *BFI;
ProfileSummaryInfo *PSI;
@@ -766,8 +762,7 @@ class EpilogueVectorizerMainLoop : public InnerLoopAndEpilogueVectorizer {
void printDebugTracesAtEnd() override;
void fixupIVUsers(PHINode *OrigPhi, const InductionDescriptor &II,
- Value *VectorTripCount, Value *EndValue,
- BasicBlock *MiddleBlock,
+ Value *VectorTripCount, BasicBlock *MiddleBlock,
VPTransformState &State) override {};
};
@@ -2599,7 +2594,7 @@ PHINode *InnerLoopVectorizer::createInductionResumeValue(
assert(VectorTripCount && "Expected valid arguments");
Instruction *OldInduction = Legal->getPrimaryInduction();
- Value *&EndValue = IVEndValues[OrigPhi];
+ Value *EndValue = nullptr;
Value *EndValueFromAdditionalBypass = AdditionalBypass.second;
if (OrigPhi == OldInduction) {
// We know what the end value is.
@@ -2756,7 +2751,7 @@ InnerLoopVectorizer::createVectorizedLoopSkeleton(
// value for the IV when arriving directly from the middle block.
void InnerLoopVectorizer::fixupIVUsers(PHINode *OrigPhi,
const InductionDescriptor &II,
- Value *VectorTripCount, Value *EndValue,
+ Value *VectorTripCount,
BasicBlock *MiddleBlock,
VPTransformState &State) {
// There are two kinds of external IV usages - those that use the value
@@ -2768,6 +2763,10 @@ void InnerLoopVectorizer::fixupIVUsers(PHINode *OrigPhi,
DenseMap<Value *, Value *> MissingVals;
+ Value *EndValue = cast<PHINode>(OrigPhi->getIncomingValueForBlock(
+ OrigLoop->getLoopPreheader()))
+ ->getIncomingValueForBlock(MiddleBlock);
+
// An external user of the last iteration's value should see the value that
// the remainder loop uses to initialize its own IV.
Value *PostInc = OrigPhi->getIncomingValueForBlock(OrigLoop->getLoopLatch());
@@ -2970,8 +2969,7 @@ void InnerLoopVectorizer::fixVectorizedLoop(VPTransformState &State) {
// Fix-up external users of the induction variables.
for (const auto &Entry : Legal->getInductionVars())
fixupIVUsers(Entry.first, Entry.second,
- getOrCreateVectorTripCount(nullptr),
- IVEndValues[Entry.first], LoopMiddleBlock, State);
+ getOrCreateVectorTripCount(nullptr), LoopMiddleBlock, State);
}
for (Instruction *PI : PredicatedInstructions)
More information about the llvm-commits
mailing list