[llvm] [AMDGPU] GCNHazardRecognizer: refactor getWaitStatesSince (NFCI) (PR #108347)
Carl Ritson via llvm-commits
llvm-commits at lists.llvm.org
Sat Sep 14 23:38:00 PDT 2024
================
@@ -495,51 +496,104 @@ hasHazard(StateT State,
return false;
}
-// Returns a minimum wait states since \p I walking all predecessors.
-// Only scans until \p IsExpired does not return true.
-// Can only be run in a hazard recognizer mode.
-static int getWaitStatesSince(
+// Update \p WaitStates while iterating from \p I to hazard in \p MBB.
+static HazardFnResult countWaitStatesSince(
GCNHazardRecognizer::IsHazardFn IsHazard, const MachineBasicBlock *MBB,
- MachineBasicBlock::const_reverse_instr_iterator I, int WaitStates,
- IsExpiredFn IsExpired, DenseSet<const MachineBasicBlock *> &Visited,
- GetNumWaitStatesFn GetNumWaitStates = SIInstrInfo::getNumWaitStates) {
+ MachineBasicBlock::const_reverse_instr_iterator I, int &WaitStates,
+ IsExpiredFn IsExpired, GetNumWaitStatesFn GetNumWaitStates) {
for (auto E = MBB->instr_rend(); I != E; ++I) {
// Don't add WaitStates for parent BUNDLE instructions.
if (I->isBundle())
continue;
if (IsHazard(*I))
- return WaitStates;
+ return HazardFound;
if (I->isInlineAsm())
continue;
WaitStates += GetNumWaitStates(*I);
if (IsExpired(*I, WaitStates))
- return std::numeric_limits<int>::max();
+ return HazardExpired;
+ }
+
+ return NoHazardFound;
+}
+
+// Implements predecessor search for getWaitStatesSince.
+static int getWaitStatesSinceImpl(
+ GCNHazardRecognizer::IsHazardFn IsHazard,
+ const MachineBasicBlock *InitialMBB, int InitialWaitStates,
+ IsExpiredFn IsExpired,
+ GetNumWaitStatesFn GetNumWaitStates = SIInstrInfo::getNumWaitStates) {
+ DenseMap<const MachineBasicBlock *, int> Visited;
+
+ // Build worklist of predecessors.
+ // Note: use queue so search is breadth first, which reduces search space
+ // when a hazard is found.
+ std::queue<const MachineBasicBlock *> Worklist;
----------------
perlfu wrote:
Yes, testing agrees using SmallVector is a bit faster (probably more so in common cases).
However, this method does mean the worklist will essentially grow to compass the entire search.
I have added some code to reclaim space when the list is (very) large.
https://github.com/llvm/llvm-project/pull/108347
More information about the llvm-commits
mailing list