@@ -849,7 +849,7 @@ class IGLPStrategy {
849
849
850
850
public:
851
851
// / Add SchedGroups to \p SyncedSchedGroups to implement this Strategy.
852
- virtual void applyIGLPStrategy (
852
+ virtual bool applyIGLPStrategy (
853
853
DenseMap<int , SUnitsToCandidateSGsMap> &SyncedInstrs,
854
854
DenseMap<int , SmallVector<SchedGroup, 4 >> &SyncedSchedGroups,
855
855
IGLPPhase Phase) = 0;
@@ -868,7 +868,7 @@ class IGLPStrategy {
868
868
class MFMASmallGemmOpt final : public IGLPStrategy {
869
869
private:
870
870
public:
871
- void applyIGLPStrategy (
871
+ bool applyIGLPStrategy (
872
872
DenseMap<int , SUnitsToCandidateSGsMap> &SyncedInstrs,
873
873
DenseMap<int , SmallVector<SchedGroup, 4 >> &SyncedSchedGroups,
874
874
IGLPPhase Phase) override ;
@@ -881,7 +881,7 @@ class MFMASmallGemmOpt final : public IGLPStrategy {
881
881
}
882
882
};
883
883
884
- void MFMASmallGemmOpt::applyIGLPStrategy (
884
+ bool MFMASmallGemmOpt::applyIGLPStrategy (
885
885
DenseMap<int , SUnitsToCandidateSGsMap> &SyncedInstrs,
886
886
DenseMap<int , SmallVector<SchedGroup, 4 >> &SyncedSchedGroups,
887
887
IGLPPhase Phase) {
@@ -902,6 +902,8 @@ void MFMASmallGemmOpt::applyIGLPStrategy(
902
902
SchedGroupMask::MFMA, 1 , PipelineSyncID, DAG, TII);
903
903
SG->initSchedGroup (SyncedInstrs[SG->getSyncID ()]);
904
904
}
905
+
906
+ return true ;
905
907
}
906
908
907
909
class MFMASmallGemmSingleWaveOpt final : public IGLPStrategy {
@@ -1098,7 +1100,7 @@ class MFMASmallGemmSingleWaveOpt final : public IGLPStrategy {
1098
1100
};
1099
1101
1100
1102
public:
1101
- void applyIGLPStrategy (
1103
+ bool applyIGLPStrategy (
1102
1104
DenseMap<int , SUnitsToCandidateSGsMap> &SyncedInstrs,
1103
1105
DenseMap<int , SmallVector<SchedGroup, 4 >> &SyncedSchedGroups,
1104
1106
IGLPPhase Phase) override ;
@@ -1115,7 +1117,7 @@ static unsigned DSWCount = 0;
1115
1117
static unsigned DSWWithPermCount = 0 ;
1116
1118
static unsigned DSWWithSharedVMEMCount = 0 ;
1117
1119
1118
- void MFMASmallGemmSingleWaveOpt::applyIGLPStrategy (
1120
+ bool MFMASmallGemmSingleWaveOpt::applyIGLPStrategy (
1119
1121
DenseMap<int , SUnitsToCandidateSGsMap> &SyncedInstrs,
1120
1122
DenseMap<int , SmallVector<SchedGroup, 4 >> &SyncedSchedGroups,
1121
1123
IGLPPhase Phase) {
@@ -1354,6 +1356,8 @@ void MFMASmallGemmSingleWaveOpt::applyIGLPStrategy(
1354
1356
SchedGroupMask::MFMA, 1 , PipelineSyncID, DAG, TII);
1355
1357
SG->initSchedGroup (SyncedInstrs[SG->getSyncID ()]);
1356
1358
}
1359
+
1360
+ return true ;
1357
1361
}
1358
1362
1359
1363
static std::unique_ptr<IGLPStrategy>
@@ -1375,6 +1379,8 @@ class IGroupLPDAGMutation : public ScheduleDAGMutation {
1375
1379
1376
1380
ScheduleDAGMI *DAG;
1377
1381
1382
+ std::vector<std::unique_ptr<ScheduleDAGMutation>> *SavedMutations;
1383
+
1378
1384
// Organize lists of SchedGroups by their SyncID. SchedGroups /
1379
1385
// SCHED_GROUP_BARRIERs with different SyncIDs will have no edges added
1380
1386
// between then.
@@ -1401,7 +1407,7 @@ class IGroupLPDAGMutation : public ScheduleDAGMutation {
1401
1407
void initSchedGroupBarrierPipelineStage (
1402
1408
std::vector<SUnit>::reverse_iterator RIter);
1403
1409
1404
- void initIGLPOpt (SUnit &SU);
1410
+ bool initIGLPOpt (SUnit &SU);
1405
1411
1406
1412
public:
1407
1413
void apply (ScheduleDAGInstrs *DAGInstrs) override ;
@@ -1417,7 +1423,10 @@ class IGroupLPDAGMutation : public ScheduleDAGMutation {
1417
1423
IGLPPhase Phase = IGLPPhase::Initial;
1418
1424
1419
1425
IGroupLPDAGMutation () = default ;
1420
- IGroupLPDAGMutation (IGLPPhase Phase) : Phase(Phase) {}
1426
+ IGroupLPDAGMutation (
1427
+ IGLPPhase Phase,
1428
+ std::vector<std::unique_ptr<ScheduleDAGMutation>> *SavedMutations)
1429
+ : SavedMutations(SavedMutations), Phase(Phase) {}
1421
1430
};
1422
1431
1423
1432
unsigned SchedGroup::NumSchedGroups = 0 ;
@@ -1622,8 +1631,7 @@ void IGroupLPDAGMutation::apply(ScheduleDAGInstrs *DAGInstrs) {
1622
1631
} else if (Opc == AMDGPU::IGLP_OPT) {
1623
1632
resetEdges (*R, DAG);
1624
1633
if (!foundSB && !foundIGLP)
1625
- initIGLPOpt (*R);
1626
- foundIGLP = true ;
1634
+ foundIGLP |= initIGLPOpt (*R);
1627
1635
}
1628
1636
}
1629
1637
@@ -1632,7 +1640,13 @@ void IGroupLPDAGMutation::apply(ScheduleDAGInstrs *DAGInstrs) {
1632
1640
// PipelineSolver performs the mutation by adding the edges it
1633
1641
// determined as the best
1634
1642
PS.solve ();
1643
+ return ;
1635
1644
}
1645
+
1646
+ // !foundSB && !foundIGLP -- most likely we have an ILGP_OPT instruciton but
1647
+ // did not apply any mutation
1648
+ for (auto &m : *SavedMutations)
1649
+ m->apply (DAG);
1636
1650
}
1637
1651
1638
1652
void IGroupLPDAGMutation::addSchedBarrierEdges (SUnit &SchedBarrier) {
@@ -1711,14 +1725,15 @@ void IGroupLPDAGMutation::initSchedGroupBarrierPipelineStage(
1711
1725
SG.initSchedGroup (RIter, SyncedInstrs[SG.getSyncID ()]);
1712
1726
}
1713
1727
1714
- void IGroupLPDAGMutation::initIGLPOpt (SUnit &SU) {
1728
+ bool IGroupLPDAGMutation::initIGLPOpt (SUnit &SU) {
1715
1729
IGLPStrategyID StrategyID =
1716
1730
(IGLPStrategyID)SU.getInstr ()->getOperand (0 ).getImm ();
1717
1731
auto S = createIGLPStrategy (StrategyID, DAG, TII);
1718
- if (S->shouldApplyStrategy (DAG)) {
1719
- IsBottomUp = S->IsBottomUp ;
1720
- S->applyIGLPStrategy (SyncedInstrs, SyncedSchedGroups, Phase);
1721
- }
1732
+ if (!S->shouldApplyStrategy (DAG))
1733
+ return false ;
1734
+
1735
+ IsBottomUp = S->IsBottomUp ;
1736
+ return S->applyIGLPStrategy (SyncedInstrs, SyncedSchedGroups, Phase);
1722
1737
}
1723
1738
1724
1739
} // namespace
@@ -1730,8 +1745,10 @@ namespace llvm {
1730
1745
// / same scheduling region (e.g. pre and post-RA scheduling / multiple
1731
1746
// / scheduling "phases"), we can reenter this mutation framework more than once
1732
1747
// / for a given region.
1733
- std::unique_ptr<ScheduleDAGMutation> createIGroupLPDAGMutation (IGLPPhase Phase) {
1734
- return std::make_unique<IGroupLPDAGMutation>(Phase);
1748
+ std::unique_ptr<ScheduleDAGMutation> createIGroupLPDAGMutation (
1749
+ IGLPPhase Phase,
1750
+ std::vector<std::unique_ptr<ScheduleDAGMutation>> *SavedMutations) {
1751
+ return std::make_unique<IGroupLPDAGMutation>(Phase, SavedMutations);
1735
1752
}
1736
1753
1737
1754
} // end namespace llvm
0 commit comments