63 std::list<MachineInstr*> EmittedInstrs;
68 std::list<MachineInstr *> EmittedVALUInstrs;
73 static constexpr unsigned MaxVALULookAhead = 18;
77 bool HasPendingWMMACoexecHazard =
false;
88 bool RunLdsBranchVmemWARHazardFixup;
99 std::optional<unsigned> CurrentCoExecStage;
102 unsigned CoExecWindowStartCycle = 0;
105 unsigned CyclesUntilTRANS = 0;
108 unsigned CyclesUntilVALU = 0;
112 std::array<char, AMDGPU::MaxCoExecStages> CoExecWindowLog;
115 void dumpCoExecWindow()
const;
118 bool hasCoExecWindowModel()
const;
149 void schedulerAdvanceCycle();
152 void schedulerReset();
160 void resetClause()
const {
165 void addClauseInst(
const MachineInstr &
MI)
const;
169 unsigned getMFMAPipelineWaitStates(
const MachineInstr &
MI)
const;
173 void processBundle();
177 void runOnInstruction(MachineInstr *
MI);
181 using WindowForFn = function_ref<std::optional<int>(
const MachineInstr &)>;
187 int getMaxWindowDeficit(
int MaxWindow, WindowForFn WindowFor)
const;
188 int getMaxVALUWindowDeficit(
int MaxWindow, WindowForFn WindowFor)
const;
193 int getWaitStatesSinceDef(
unsigned Reg,
IsHazardFn IsHazardDef,
195 int getWaitStatesSinceSetReg(
IsHazardFn IsHazard,
int Limit)
const;
197 int checkSoftClauseHazards(MachineInstr *SMEM)
const;
198 int checkSMRDHazards(MachineInstr *SMRD)
const;
199 int checkVMEMHazards(MachineInstr *VMEM)
const;
200 int checkDPPHazards(MachineInstr *
DPP)
const;
201 int checkDivFMasHazards(MachineInstr *DivFMas)
const;
202 int checkGetRegHazards(MachineInstr *GetRegInstr)
const;
203 int checkSetRegHazards(MachineInstr *SetRegInstr)
const;
204 int createsVALUHazard(
const MachineInstr &
MI)
const;
205 int checkVALUHazards(MachineInstr *VALU)
const;
206 int checkVALUHazardsHelper(
const MachineOperand &Def,
207 const MachineRegisterInfo &MRI)
const;
208 int checkUniformWindowVALUHazardsHelper(
Register Reg)
const;
209 int checkSOFFSETWindowVALUHazardsHelper(
Register Reg)
const;
210 int checkRWLaneHazards(MachineInstr *RWLane)
const;
211 int checkRFEHazards(MachineInstr *RFE)
const;
212 int checkInlineAsmHazards(MachineInstr *IA)
const;
213 int checkReadM0Hazards(MachineInstr *SMovRel)
const;
214 int checkNSAtoVMEMHazard(MachineInstr *
MI)
const;
215 int checkFPAtomicToDenormModeHazard(MachineInstr *
MI)
const;
219 int WaitStatesNeeded,
bool IsHoisting =
false);
220 void fixHazards(MachineInstr *
MI);
221 bool fixVcmpxPermlaneHazards(MachineInstr *
MI);
222 bool fixVMEMtoScalarWriteHazards(MachineInstr *
MI);
223 bool fixSMEMtoVectorWriteHazards(MachineInstr *
MI);
224 bool fixVcmpxExecWARHazard(MachineInstr *
MI);
225 bool fixLdsBranchVmemWARHazard(MachineInstr *
MI);
226 bool fixLdsDirectVALUHazard(MachineInstr *
MI);
227 bool fixLdsDirectVMEMHazard(MachineInstr *
MI);
228 bool fixVALUPartialForwardingHazard(MachineInstr *
MI);
229 bool fixVALUTransUseHazard(MachineInstr *
MI);
230 bool fixVALUTransCoexecutionHazards(MachineInstr *
MI);
231 bool fixWMMAHazards(MachineInstr *
MI);
232 int checkWMMACoexecutionHazards(MachineInstr *
MI)
const;
233 bool fixWMMACoexecutionHazards(MachineInstr *
MI);
234 bool tryHoistWMMAVnopsFromLoop(MachineInstr *
MI,
int WaitStatesNeeded);
235 bool hasWMMAHazardInLoop(MachineLoop *L, MachineInstr *
MI,
236 bool IncludeSubloops =
true);
237 bool hasWMMAToWMMARegOverlap(
const MachineInstr &WMMA,
238 const MachineInstr &
MI)
const;
239 bool hasWMMAToVALURegOverlap(
const MachineInstr &WMMA,
240 const MachineInstr &
MI)
const;
241 bool isCoexecutionHazardFor(
const MachineInstr &
I,
242 const MachineInstr &
MI)
const;
243 bool fixShift64HighRegBug(MachineInstr *
MI);
244 bool fixVPermPk16Hazard(MachineInstr *
MI);
245 bool fixVALUMaskWriteHazard(MachineInstr *
MI);
246 bool fixRequiredExportPriority(MachineInstr *
MI);
247 bool fixGetRegWaitIdle(MachineInstr *
MI);
248 bool fixDsAtomicAsyncBarrierArriveB64(MachineInstr *
MI);
249 bool fixScratchBaseForwardingHazard(MachineInstr *
MI);
250 bool fixSetRegMode(MachineInstr *
MI);
251 bool fixTDM(MachineInstr *
MI);
255 int getMFMAReadWaitStates(
const MachineInstr &Consumer,
259 int checkMAIHazards(MachineInstr *
MI)
const;
260 int checkMAIHazards908(MachineInstr *
MI)
const;
261 int checkMAIHazards90A(MachineInstr *
MI)
const;
265 int getMFMAOverlappedSrcCWaitStates(
const MachineInstr *Reader,
266 const MachineInstr *Writer)
const;
282 int checkMFMAPadding(MachineInstr *
MI)
const;
283 int checkMAIVALUHazards(MachineInstr *
MI)
const;
284 int checkMAILdStHazards(MachineInstr *
MI)
const;
285 int checkPermlaneHazards(MachineInstr *
MI)
const;
290 MachineLoopInfo *MLI =
nullptr);
294 MachineLoopInfo *MLI =
nullptr);
340 void Reset()
override;
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))