@@ -5689,7 +5689,8 @@ class BoUpSLP {
56895689 /// Updates the dependency information of a bundle and of all instructions/
56905690 /// bundles which depend on the original bundle.
56915691 void calculateDependencies(ScheduleBundle &Bundle, bool InsertInReadyList,
5692- BoUpSLP *SLP);
5692+ BoUpSLP *SLP,
5693+ ArrayRef<ScheduleData *> ControlDeps = {});
56935694
56945695 /// Sets all instruction in the scheduling region to un-scheduled.
56955696 void resetSchedule();
@@ -20727,15 +20728,21 @@ BoUpSLP::BlockScheduling::tryScheduleBundle(ArrayRef<Value *> VL, BoUpSLP *SLP,
2072720728 LLVM_DEBUG(dbgs() << "SLP: bundle: " << *S.getMainOp() << "\n");
2072820729
2072920730 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;
2073220734 auto CheckIfNeedToClearDeps = [&](ScheduleBundle &Bundle) {
2073320735 SmallDenseMap<std::pair<Instruction *, Value *>, unsigned> UserOpToNumOps;
2073420736 for (ScheduleEntity *SE : Bundle.getBundle()) {
2073520737 if (ScheduleCopyableData *SD = dyn_cast<ScheduleCopyableData>(SE)) {
2073620738 if (ScheduleData *BundleMember = getScheduleData(SD->getInst());
20737- BundleMember && BundleMember->hasValidDependencies())
20739+ BundleMember && BundleMember->hasValidDependencies()) {
2073820740 BundleMember->clearDirectDependencies();
20741+ if (RegionHasStackSave ||
20742+ !isGuaranteedToTransferExecutionToSuccessor(
20743+ BundleMember->getInst()))
20744+ ControlDependentMembers.push_back(BundleMember);
20745+ }
2073920746 continue;
2074020747 }
2074120748 auto *SD = cast<ScheduleData>(SE);
@@ -20748,8 +20755,12 @@ BoUpSLP::BlockScheduling::tryScheduleBundle(ArrayRef<Value *> VL, BoUpSLP *SLP,
2074820755 if (auto *Op = dyn_cast<Instruction>(U.get());
2074920756 Op && areAllOperandsReplacedByCopyableData(SD->getInst(), Op,
2075020757 *SLP, NumOps)) {
20751- if (ScheduleData *OpSD = getScheduleData(Op))
20758+ if (ScheduleData *OpSD = getScheduleData(Op)) {
2075220759 OpSD->clearDirectDependencies();
20760+ if (RegionHasStackSave ||
20761+ !isGuaranteedToTransferExecutionToSuccessor(OpSD->getInst()))
20762+ ControlDependentMembers.push_back(OpSD);
20763+ }
2075320764 }
2075420765 }
2075520766 }
@@ -20783,7 +20794,8 @@ BoUpSLP::BlockScheduling::tryScheduleBundle(ArrayRef<Value *> VL, BoUpSLP *SLP,
2078320794 CheckIfNeedToClearDeps(Bundle);
2078420795 LLVM_DEBUG(dbgs() << "SLP: try schedule bundle " << Bundle << " in block "
2078520796 << BB->getName() << "\n");
20786- calculateDependencies(Bundle, /*InsertInReadyList=*/!ReSchedule, SLP);
20797+ calculateDependencies(Bundle, /*InsertInReadyList=*/!ReSchedule, SLP,
20798+ ControlDependentMembers);
2078720799 }
2078820800
2078920801 if (ReSchedule) {
@@ -21048,9 +21060,9 @@ void BoUpSLP::BlockScheduling::initScheduleData(Instruction *FromI,
2104821060 }
2104921061}
2105021062
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 ) {
2105421066 SmallVector<ScheduleEntity *> WorkList;
2105521067 auto ProcessNode = [&](ScheduleEntity *SE) {
2105621068 if (auto *CD = dyn_cast<ScheduleCopyableData>(SE)) {
@@ -21293,6 +21305,7 @@ void BoUpSLP::BlockScheduling::calculateDependencies(ScheduleBundle &Bundle,
2129321305 };
2129421306
2129521307 WorkList.push_back(Bundle.getBundle().front());
21308+ WorkList.append(ControlDeps.begin(), ControlDeps.end());
2129621309 SmallPtrSet<ScheduleBundle *, 16> Visited;
2129721310 while (!WorkList.empty()) {
2129821311 ScheduleEntity *SD = WorkList.pop_back_val();
0 commit comments