mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-27 00:28:14 +00:00
fdfawef324 notes that current LLVM spills SGPRs into VGPRs it allocates like any other register, so one window register can be an ordinary register early in a program and hold spill lanes later. ReadLaneEliminator only followed a spilled lane across M0-indexed window stores for slots never used as ordinary registers, so RESIDENT EVIL 4 (PPSA07411) and LEGO Horizon Adventures (PPSA14632) kept their reloaded descriptors as run-time values and stopped. A known lane can only come from a v_writelane chain, so keep it across a computed-index store instead; a constant-index store of the slot still ends the spill. This is fdfawef324's suggestion on #6277. That such a store misses the spill cannot be proven for these programs, so it is checked at run time where a replaced read depends on it: a backward liveness over each slot and lane whose known value a replaced read used puts a WindowLaneGuard before every computed-index store at which that lane is live, and the guard records a WindowLaneSpill fault when the store changes that lane of the slot. The driver reads the fault buffer back for every program with such a guard and reports the dispatch or draw as failed, so a broken assumption is no longer silent. This also covers the pure spill slots main already folds. Co-authored-by: fdfawef324 <[email protected]> Co-Authored-By: Claude <[email protected]>