Skip to content

Commit df0a6f2

Browse files
committed
[AMDGPU] Fall back to SavedMutations when not applying IGLP
Change-Id: Ib5fac752b9302e8817d7dcc1aded264e0d0b1b7f
1 parent eb45946 commit df0a6f2

File tree

4 files changed

+46
-23
lines changed

4 files changed

+46
-23
lines changed

llvm/lib/Target/AMDGPU/AMDGPUIGroupLP.cpp

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -849,7 +849,7 @@ class IGLPStrategy {
849849

850850
public:
851851
/// Add SchedGroups to \p SyncedSchedGroups to implement this Strategy.
852-
virtual void applyIGLPStrategy(
852+
virtual bool applyIGLPStrategy(
853853
DenseMap<int, SUnitsToCandidateSGsMap> &SyncedInstrs,
854854
DenseMap<int, SmallVector<SchedGroup, 4>> &SyncedSchedGroups,
855855
IGLPPhase Phase) = 0;
@@ -868,7 +868,7 @@ class IGLPStrategy {
868868
class MFMASmallGemmOpt final : public IGLPStrategy {
869869
private:
870870
public:
871-
void applyIGLPStrategy(
871+
bool applyIGLPStrategy(
872872
DenseMap<int, SUnitsToCandidateSGsMap> &SyncedInstrs,
873873
DenseMap<int, SmallVector<SchedGroup, 4>> &SyncedSchedGroups,
874874
IGLPPhase Phase) override;
@@ -881,7 +881,7 @@ class MFMASmallGemmOpt final : public IGLPStrategy {
881881
}
882882
};
883883

884-
void MFMASmallGemmOpt::applyIGLPStrategy(
884+
bool MFMASmallGemmOpt::applyIGLPStrategy(
885885
DenseMap<int, SUnitsToCandidateSGsMap> &SyncedInstrs,
886886
DenseMap<int, SmallVector<SchedGroup, 4>> &SyncedSchedGroups,
887887
IGLPPhase Phase) {
@@ -902,6 +902,8 @@ void MFMASmallGemmOpt::applyIGLPStrategy(
902902
SchedGroupMask::MFMA, 1, PipelineSyncID, DAG, TII);
903903
SG->initSchedGroup(SyncedInstrs[SG->getSyncID()]);
904904
}
905+
906+
return true;
905907
}
906908

907909
class MFMASmallGemmSingleWaveOpt final : public IGLPStrategy {
@@ -1098,7 +1100,7 @@ class MFMASmallGemmSingleWaveOpt final : public IGLPStrategy {
10981100
};
10991101

11001102
public:
1101-
void applyIGLPStrategy(
1103+
bool applyIGLPStrategy(
11021104
DenseMap<int, SUnitsToCandidateSGsMap> &SyncedInstrs,
11031105
DenseMap<int, SmallVector<SchedGroup, 4>> &SyncedSchedGroups,
11041106
IGLPPhase Phase) override;
@@ -1115,7 +1117,7 @@ static unsigned DSWCount = 0;
11151117
static unsigned DSWWithPermCount = 0;
11161118
static unsigned DSWWithSharedVMEMCount = 0;
11171119

1118-
void MFMASmallGemmSingleWaveOpt::applyIGLPStrategy(
1120+
bool MFMASmallGemmSingleWaveOpt::applyIGLPStrategy(
11191121
DenseMap<int, SUnitsToCandidateSGsMap> &SyncedInstrs,
11201122
DenseMap<int, SmallVector<SchedGroup, 4>> &SyncedSchedGroups,
11211123
IGLPPhase Phase) {
@@ -1354,6 +1356,8 @@ void MFMASmallGemmSingleWaveOpt::applyIGLPStrategy(
13541356
SchedGroupMask::MFMA, 1, PipelineSyncID, DAG, TII);
13551357
SG->initSchedGroup(SyncedInstrs[SG->getSyncID()]);
13561358
}
1359+
1360+
return true;
13571361
}
13581362

13591363
static std::unique_ptr<IGLPStrategy>
@@ -1375,6 +1379,8 @@ class IGroupLPDAGMutation : public ScheduleDAGMutation {
13751379

13761380
ScheduleDAGMI *DAG;
13771381

1382+
std::vector<std::unique_ptr<ScheduleDAGMutation>> *SavedMutations;
1383+
13781384
// Organize lists of SchedGroups by their SyncID. SchedGroups /
13791385
// SCHED_GROUP_BARRIERs with different SyncIDs will have no edges added
13801386
// between then.
@@ -1401,7 +1407,7 @@ class IGroupLPDAGMutation : public ScheduleDAGMutation {
14011407
void initSchedGroupBarrierPipelineStage(
14021408
std::vector<SUnit>::reverse_iterator RIter);
14031409

1404-
void initIGLPOpt(SUnit &SU);
1410+
bool initIGLPOpt(SUnit &SU);
14051411

14061412
public:
14071413
void apply(ScheduleDAGInstrs *DAGInstrs) override;
@@ -1417,7 +1423,10 @@ class IGroupLPDAGMutation : public ScheduleDAGMutation {
14171423
IGLPPhase Phase = IGLPPhase::Initial;
14181424

14191425
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) {}
14211430
};
14221431

14231432
unsigned SchedGroup::NumSchedGroups = 0;
@@ -1622,8 +1631,7 @@ void IGroupLPDAGMutation::apply(ScheduleDAGInstrs *DAGInstrs) {
16221631
} else if (Opc == AMDGPU::IGLP_OPT) {
16231632
resetEdges(*R, DAG);
16241633
if (!foundSB && !foundIGLP)
1625-
initIGLPOpt(*R);
1626-
foundIGLP = true;
1634+
foundIGLP |= initIGLPOpt(*R);
16271635
}
16281636
}
16291637

@@ -1632,7 +1640,13 @@ void IGroupLPDAGMutation::apply(ScheduleDAGInstrs *DAGInstrs) {
16321640
// PipelineSolver performs the mutation by adding the edges it
16331641
// determined as the best
16341642
PS.solve();
1643+
return;
16351644
}
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);
16361650
}
16371651

16381652
void IGroupLPDAGMutation::addSchedBarrierEdges(SUnit &SchedBarrier) {
@@ -1711,14 +1725,15 @@ void IGroupLPDAGMutation::initSchedGroupBarrierPipelineStage(
17111725
SG.initSchedGroup(RIter, SyncedInstrs[SG.getSyncID()]);
17121726
}
17131727

1714-
void IGroupLPDAGMutation::initIGLPOpt(SUnit &SU) {
1728+
bool IGroupLPDAGMutation::initIGLPOpt(SUnit &SU) {
17151729
IGLPStrategyID StrategyID =
17161730
(IGLPStrategyID)SU.getInstr()->getOperand(0).getImm();
17171731
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);
17221737
}
17231738

17241739
} // namespace
@@ -1730,8 +1745,10 @@ namespace llvm {
17301745
/// same scheduling region (e.g. pre and post-RA scheduling / multiple
17311746
/// scheduling "phases"), we can reenter this mutation framework more than once
17321747
/// 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);
17351752
}
17361753

17371754
} // end namespace llvm

llvm/lib/Target/AMDGPU/AMDGPUIGroupLP.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include "llvm/CodeGen/ScheduleDAGMutation.h"
1313
#include <memory>
14+
#include <vector>
1415

1516
namespace llvm {
1617

@@ -22,7 +23,9 @@ enum class IGLPPhase {
2223
PostRA = 1u << 1
2324
};
2425

25-
std::unique_ptr<ScheduleDAGMutation> createIGroupLPDAGMutation(IGLPPhase Phase);
26+
std::unique_ptr<ScheduleDAGMutation> createIGroupLPDAGMutation(
27+
IGLPPhase Phase,
28+
std::vector<std::unique_ptr<ScheduleDAGMutation>> *SavedMutations);
2629

2730
} // namespace llvm
2831

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ createGCNMaxOccupancyMachineScheduler(MachineSchedContext *C) {
461461
DAG->addMutation(createLoadClusterDAGMutation(DAG->TII, DAG->TRI));
462462
if (ST.shouldClusterStores())
463463
DAG->addMutation(createStoreClusterDAGMutation(DAG->TII, DAG->TRI));
464-
DAG->addMutation(createIGroupLPDAGMutation(IGLPPhase::Initial));
464+
DAG->addMutation(createIGroupLPDAGMutation(IGLPPhase::Initial, nullptr));
465465
DAG->addMutation(createAMDGPUMacroFusionDAGMutation());
466466
DAG->addMutation(createAMDGPUExportClusteringDAGMutation());
467467
return DAG;
@@ -471,7 +471,7 @@ static ScheduleDAGInstrs *
471471
createGCNMaxILPMachineScheduler(MachineSchedContext *C) {
472472
ScheduleDAGMILive *DAG =
473473
new GCNScheduleDAGMILive(C, std::make_unique<GCNMaxILPSchedStrategy>(C));
474-
DAG->addMutation(createIGroupLPDAGMutation(IGLPPhase::Initial));
474+
DAG->addMutation(createIGroupLPDAGMutation(IGLPPhase::Initial, nullptr));
475475
return DAG;
476476
}
477477

@@ -934,7 +934,7 @@ class GCNPassConfig final : public AMDGPUPassConfig {
934934
if (ST.shouldClusterStores())
935935
DAG->addMutation(createStoreClusterDAGMutation(DAG->TII, DAG->TRI));
936936
DAG->addMutation(ST.createFillMFMAShadowMutation(DAG->TII));
937-
DAG->addMutation(createIGroupLPDAGMutation(IGLPPhase::PostRA));
937+
DAG->addMutation(createIGroupLPDAGMutation(IGLPPhase::PostRA, nullptr));
938938
if (isPassEnabled(EnableVOPD, CodeGenOptLevel::Less))
939939
DAG->addMutation(createVOPDPairingMutation());
940940
return DAG;

llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,7 @@ bool UnclusteredHighRPStage::initGCNSchedStage() {
713713
return false;
714714

715715
SavedMutations.swap(DAG.Mutations);
716-
DAG.addMutation(createIGroupLPDAGMutation(IGLPPhase::PreRAReentry));
716+
DAG.addMutation(createIGroupLPDAGMutation(IGLPPhase::PreRAReentry, nullptr));
717717

718718
InitialOccupancy = DAG.MinOccupancy;
719719
// Aggressivly try to reduce register pressure in the unclustered high RP
@@ -855,7 +855,9 @@ bool GCNSchedStage::initGCNRegion() {
855855
SavedMutations.swap(DAG.Mutations);
856856
bool IsInitialStage = StageID == GCNSchedStageID::OccInitialSchedule ||
857857
StageID == GCNSchedStageID::ILPInitialSchedule;
858-
DAG.addMutation(createIGroupLPDAGMutation(IsInitialStage ? IGLPPhase::Initial : IGLPPhase::PreRAReentry));
858+
DAG.addMutation(createIGroupLPDAGMutation(
859+
IsInitialStage ? IGLPPhase::Initial : IGLPPhase::PreRAReentry,
860+
&SavedMutations));
859861
}
860862

861863
return true;
@@ -1569,7 +1571,8 @@ void GCNPostScheduleDAGMILive::schedule() {
15691571
if (HasIGLPInstrs) {
15701572
SavedMutations.clear();
15711573
SavedMutations.swap(Mutations);
1572-
addMutation(createIGroupLPDAGMutation(/*IsReentry=*/IGLPPhase::PostRA));
1574+
addMutation(createIGroupLPDAGMutation(/*IsReentry=*/IGLPPhase::PostRA,
1575+
&SavedMutations));
15731576
}
15741577

15751578
ScheduleDAGMI::schedule();

0 commit comments

Comments
 (0)