[llvm] [NFC][SLP] Remove useless code of the schedule (PR #104697)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Aug 18 02:41:18 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: tcwzxx (tcwzxx)
<details>
<summary>Changes</summary>
Currently, the SLP schedule has two containers of `ScheduleData`: `ExtraScheduleDataMap` and `ScheduleDataMap`. However, the `ScheduleData` in `ExtraScheduleDataMap` is only used to indicate whether the instruction is processed or not and does not participate in the schedule, which is useless. `ScheduleDataMap` is sufficient for this purpose. The `OpValue` member is used only in `ExtraScheduleDataMap`, which is also useless.
---
Full diff: https://github.com/llvm/llvm-project/pull/104697.diff
1 Files Affected:
- (modified) llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp (+6-65)
``````````diff
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 9ecd8160a97891..397b84997a1301 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -3583,14 +3583,14 @@ class BoUpSLP {
ScheduleData() = default;
- void init(int BlockSchedulingRegionID, Value *OpVal) {
+ void init(int BlockSchedulingRegionID, Instruction *I) {
FirstInBundle = this;
NextInBundle = nullptr;
NextLoadStore = nullptr;
IsScheduled = false;
SchedulingRegionID = BlockSchedulingRegionID;
clearDependencies();
- OpValue = OpVal;
+ Inst = I;
TE = nullptr;
}
@@ -3696,9 +3696,6 @@ class BoUpSLP {
Instruction *Inst = nullptr;
- /// Opcode of the current instruction in the schedule data.
- Value *OpValue = nullptr;
-
/// The TreeEntry that this instruction corresponds to.
TreeEntry *TE = nullptr;
@@ -3815,18 +3812,6 @@ class BoUpSLP {
return nullptr;
}
- ScheduleData *getScheduleData(Value *V, Value *Key) {
- if (V == Key)
- return getScheduleData(V);
- auto I = ExtraScheduleDataMap.find(V);
- if (I != ExtraScheduleDataMap.end()) {
- ScheduleData *SD = I->second.lookup(Key);
- if (SD && isInSchedulingRegion(SD))
- return SD;
- }
- return nullptr;
- }
-
bool isInSchedulingRegion(ScheduleData *SD) const {
return SD->SchedulingRegionID == SchedulingRegionID;
}
@@ -3840,8 +3825,6 @@ class BoUpSLP {
for (ScheduleData *BundleMember = SD; BundleMember;
BundleMember = BundleMember->NextInBundle) {
- if (BundleMember->Inst != BundleMember->OpValue)
- continue;
// Handle the def-use chain dependencies.
@@ -3959,11 +3942,6 @@ class BoUpSLP {
function_ref<void(ScheduleData *SD)> Action) {
if (ScheduleData *SD = getScheduleData(V))
Action(SD);
- auto I = ExtraScheduleDataMap.find(V);
- if (I != ExtraScheduleDataMap.end())
- for (auto &P : I->second)
- if (isInSchedulingRegion(P.second))
- Action(P.second);
}
/// Put all instructions into the ReadyList which are ready for scheduling.
@@ -4035,10 +4013,6 @@ class BoUpSLP {
/// ScheduleData structures are recycled.
DenseMap<Instruction *, ScheduleData *> ScheduleDataMap;
- /// Attaches ScheduleData to Instruction with the leading key.
- DenseMap<Value *, SmallDenseMap<Value *, ScheduleData *>>
- ExtraScheduleDataMap;
-
/// The ready-list for scheduling (only used for the dry-run).
SetVector<ScheduleData *> ReadyInsts;
@@ -11898,8 +11872,7 @@ Instruction &BoUpSLP::getLastInstructionInBundle(const TreeEntry *E) {
auto *Bundle = BlocksSchedules[BB]->getScheduleData(V);
if (Bundle && Bundle->isPartOfBundle())
for (; Bundle; Bundle = Bundle->NextInBundle)
- if (Bundle->OpValue == Bundle->Inst)
- Res.second = Bundle->Inst;
+ Res.second = Bundle->Inst;
}
// LastInst can still be null at this point if there's either not an entry
@@ -15087,35 +15060,19 @@ BoUpSLP::ScheduleData *BoUpSLP::BlockScheduling::allocateScheduleDataChunks() {
bool BoUpSLP::BlockScheduling::extendSchedulingRegion(Value *V,
const InstructionsState &S) {
- if (getScheduleData(V, isOneOf(S, V)))
- return true;
Instruction *I = dyn_cast<Instruction>(V);
assert(I && "bundle member must be an instruction");
assert(!isa<PHINode>(I) && !isVectorLikeInstWithConstOps(I) &&
!doesNotNeedToBeScheduled(I) &&
"phi nodes/insertelements/extractelements/extractvalues don't need to "
"be scheduled");
- auto &&CheckScheduleForI = [this, &S](Instruction *I) -> bool {
- ScheduleData *ISD = getScheduleData(I);
- if (!ISD)
- return false;
- assert(isInSchedulingRegion(ISD) &&
- "ScheduleData not in scheduling region");
- ScheduleData *SD = allocateScheduleDataChunks();
- SD->Inst = I;
- SD->init(SchedulingRegionID, S.OpValue);
- ExtraScheduleDataMap[I][S.OpValue] = SD;
- return true;
- };
- if (CheckScheduleForI(I))
+ if (getScheduleData(I))
return true;
if (!ScheduleStart) {
// It's the first instruction in the new region.
initScheduleData(I, I->getNextNode(), nullptr, nullptr);
ScheduleStart = I;
ScheduleEnd = I->getNextNode();
- if (isOneOf(S, I) != I)
- CheckScheduleForI(I);
assert(ScheduleEnd && "tried to vectorize a terminator?");
LLVM_DEBUG(dbgs() << "SLP: initialize schedule region to " << *I << "\n");
return true;
@@ -15154,8 +15111,6 @@ bool BoUpSLP::BlockScheduling::extendSchedulingRegion(Value *V,
"Instruction is in wrong basic block.");
initScheduleData(I, ScheduleStart, nullptr, FirstLoadStoreInRegion);
ScheduleStart = I;
- if (isOneOf(S, I) != I)
- CheckScheduleForI(I);
LLVM_DEBUG(dbgs() << "SLP: extend schedule region start to " << *I
<< "\n");
return true;
@@ -15168,8 +15123,6 @@ bool BoUpSLP::BlockScheduling::extendSchedulingRegion(Value *V,
initScheduleData(ScheduleEnd, I->getNextNode(), LastLoadStoreInRegion,
nullptr);
ScheduleEnd = I->getNextNode();
- if (isOneOf(S, I) != I)
- CheckScheduleForI(I);
assert(ScheduleEnd && "tried to vectorize a terminator?");
LLVM_DEBUG(dbgs() << "SLP: extend schedule region end to " << *I << "\n");
return true;
@@ -15188,7 +15141,6 @@ void BoUpSLP::BlockScheduling::initScheduleData(Instruction *FromI,
if (!SD) {
SD = allocateScheduleDataChunks();
ScheduleDataMap[I] = SD;
- SD->Inst = I;
}
assert(!isInSchedulingRegion(SD) &&
"new ScheduleData already in scheduling region");
@@ -15242,8 +15194,8 @@ void BoUpSLP::BlockScheduling::calculateDependencies(ScheduleData *SD,
BundleMember->resetUnscheduledDeps();
// Handle def-use chain dependencies.
- if (BundleMember->OpValue != BundleMember->Inst) {
- if (ScheduleData *UseSD = getScheduleData(BundleMember->Inst)) {
+ for (User *U : BundleMember->Inst->users()) {
+ if (ScheduleData *UseSD = getScheduleData(cast<Instruction>(U))) {
BundleMember->Dependencies++;
ScheduleData *DestBundle = UseSD->FirstInBundle;
if (!DestBundle->IsScheduled)
@@ -15251,17 +15203,6 @@ void BoUpSLP::BlockScheduling::calculateDependencies(ScheduleData *SD,
if (!DestBundle->hasValidDependencies())
WorkList.push_back(DestBundle);
}
- } else {
- for (User *U : BundleMember->Inst->users()) {
- if (ScheduleData *UseSD = getScheduleData(cast<Instruction>(U))) {
- BundleMember->Dependencies++;
- ScheduleData *DestBundle = UseSD->FirstInBundle;
- if (!DestBundle->IsScheduled)
- BundleMember->incrementUnscheduledDeps(1);
- if (!DestBundle->hasValidDependencies())
- WorkList.push_back(DestBundle);
- }
- }
}
auto MakeControlDependent = [&](Instruction *I) {
``````````
</details>
https://github.com/llvm/llvm-project/pull/104697
More information about the llvm-commits
mailing list