@@ -5689,7 +5689,8 @@ class BoUpSLP {
5689
5689
/// Updates the dependency information of a bundle and of all instructions/
5690
5690
/// bundles which depend on the original bundle.
5691
5691
void calculateDependencies(ScheduleBundle &Bundle, bool InsertInReadyList,
5692
- BoUpSLP *SLP);
5692
+ BoUpSLP *SLP,
5693
+ ArrayRef<ScheduleData *> ControlDeps = {});
5693
5694
5694
5695
/// Sets all instruction in the scheduling region to un-scheduled.
5695
5696
void resetSchedule();
@@ -20727,15 +20728,21 @@ BoUpSLP::BlockScheduling::tryScheduleBundle(ArrayRef<Value *> VL, BoUpSLP *SLP,
20727
20728
LLVM_DEBUG(dbgs() << "SLP: bundle: " << *S.getMainOp() << "\n");
20728
20729
20729
20730
auto TryScheduleBundleImpl = [=](bool ReSchedule, ScheduleBundle &Bundle) {
20730
- // Clear deps or reculate the region, if the memory instruction is a
20731
- // copyable. It may have memory deps, which must be reaculated.
20731
+ // Clear deps or recalculate the region, if the memory instruction is a
20732
+ // copyable. It may have memory deps, which must be recalculated.
20733
+ SmallVector<ScheduleData *> ControlDependentMembers;
20732
20734
auto CheckIfNeedToClearDeps = [&](ScheduleBundle &Bundle) {
20733
20735
SmallDenseMap<std::pair<Instruction *, Value *>, unsigned> UserOpToNumOps;
20734
20736
for (ScheduleEntity *SE : Bundle.getBundle()) {
20735
20737
if (ScheduleCopyableData *SD = dyn_cast<ScheduleCopyableData>(SE)) {
20736
20738
if (ScheduleData *BundleMember = getScheduleData(SD->getInst());
20737
- BundleMember && BundleMember->hasValidDependencies())
20739
+ BundleMember && BundleMember->hasValidDependencies()) {
20738
20740
BundleMember->clearDirectDependencies();
20741
+ if (RegionHasStackSave ||
20742
+ !isGuaranteedToTransferExecutionToSuccessor(
20743
+ BundleMember->getInst()))
20744
+ ControlDependentMembers.push_back(BundleMember);
20745
+ }
20739
20746
continue;
20740
20747
}
20741
20748
auto *SD = cast<ScheduleData>(SE);
@@ -20748,8 +20755,12 @@ BoUpSLP::BlockScheduling::tryScheduleBundle(ArrayRef<Value *> VL, BoUpSLP *SLP,
20748
20755
if (auto *Op = dyn_cast<Instruction>(U.get());
20749
20756
Op && areAllOperandsReplacedByCopyableData(SD->getInst(), Op,
20750
20757
*SLP, NumOps)) {
20751
- if (ScheduleData *OpSD = getScheduleData(Op))
20758
+ if (ScheduleData *OpSD = getScheduleData(Op)) {
20752
20759
OpSD->clearDirectDependencies();
20760
+ if (RegionHasStackSave ||
20761
+ !isGuaranteedToTransferExecutionToSuccessor(OpSD->getInst()))
20762
+ ControlDependentMembers.push_back(OpSD);
20763
+ }
20753
20764
}
20754
20765
}
20755
20766
}
@@ -20783,7 +20794,8 @@ BoUpSLP::BlockScheduling::tryScheduleBundle(ArrayRef<Value *> VL, BoUpSLP *SLP,
20783
20794
CheckIfNeedToClearDeps(Bundle);
20784
20795
LLVM_DEBUG(dbgs() << "SLP: try schedule bundle " << Bundle << " in block "
20785
20796
<< BB->getName() << "\n");
20786
- calculateDependencies(Bundle, /*InsertInReadyList=*/!ReSchedule, SLP);
20797
+ calculateDependencies(Bundle, /*InsertInReadyList=*/!ReSchedule, SLP,
20798
+ ControlDependentMembers);
20787
20799
}
20788
20800
20789
20801
if (ReSchedule) {
@@ -21048,9 +21060,9 @@ void BoUpSLP::BlockScheduling::initScheduleData(Instruction *FromI,
21048
21060
}
21049
21061
}
21050
21062
21051
- void BoUpSLP::BlockScheduling::calculateDependencies(ScheduleBundle &Bundle,
21052
- bool InsertInReadyList,
21053
- BoUpSLP *SLP ) {
21063
+ void BoUpSLP::BlockScheduling::calculateDependencies(
21064
+ ScheduleBundle &Bundle, bool InsertInReadyList, BoUpSLP *SLP ,
21065
+ ArrayRef<ScheduleData *> ControlDeps ) {
21054
21066
SmallVector<ScheduleEntity *> WorkList;
21055
21067
auto ProcessNode = [&](ScheduleEntity *SE) {
21056
21068
if (auto *CD = dyn_cast<ScheduleCopyableData>(SE)) {
@@ -21293,6 +21305,7 @@ void BoUpSLP::BlockScheduling::calculateDependencies(ScheduleBundle &Bundle,
21293
21305
};
21294
21306
21295
21307
WorkList.push_back(Bundle.getBundle().front());
21308
+ WorkList.append(ControlDeps.begin(), ControlDeps.end());
21296
21309
SmallPtrSet<ScheduleBundle *, 16> Visited;
21297
21310
while (!WorkList.empty()) {
21298
21311
ScheduleEntity *SD = WorkList.pop_back_val();
0 commit comments