[llvm] [AMDGPU] Fix LSR cost comparator that regressed GFX9+ occupancy (PR #204344)
Yuyang Zhang via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 29 19:24:20 PDT 2026
================
@@ -1858,21 +1858,20 @@ InstructionCost GCNTTIImpl::getScalingFactorCost(Type *Ty, GlobalValue *BaseGV,
bool GCNTTIImpl::isLSRCostLess(const TTI::LSRCost &A,
const TTI::LSRCost &B) const {
- // Favor lower per-iteration work over preheader/setup costs.
- // AMDGPU lacks rich addressing modes, so ScaleCost is folded into the
- // effective instruction count (base+scale*index requires a separate ADD).
+ // GFX9+ occupancy is VGPR-bound, so register pressure must dominate the LSR
+ // cost: NumRegs/AddRecCost outrank EffInsns (Insns + ScaleCost), so LSR does
+ // not add registers to save a few per-iteration instructions.
unsigned EffInsnsA = A.Insns + A.ScaleCost;
unsigned EffInsnsB = B.Insns + B.ScaleCost;
-
- return std::tie(EffInsnsA, A.NumIVMuls, A.AddRecCost, A.NumBaseAdds,
- A.SetupCost, A.ImmCost, A.NumRegs) <
- std::tie(EffInsnsB, B.NumIVMuls, B.AddRecCost, B.NumBaseAdds,
- B.SetupCost, B.ImmCost, B.NumRegs);
+ return std::tie(A.NumRegs, A.AddRecCost, EffInsnsA, A.NumIVMuls,
+ A.NumBaseAdds, A.ImmCost, A.SetupCost) <
+ std::tie(B.NumRegs, B.AddRecCost, EffInsnsB, B.NumIVMuls,
+ B.NumBaseAdds, B.ImmCost, B.SetupCost);
}
bool GCNTTIImpl::isNumRegsMajorCostOfLSR() const {
- // isLSRCostLess de-prioritizes register count; keep consistent.
- return false;
+ // NumRegs leads isLSRCostLess, so register count is the major cost.
----------------
yuyzhang512 wrote:
Thanks, I agree the comment is confusing. My intent was just to keep the existing hook consistent with the updated cost ordering. I’ll drop the comment and keep the change focused.
https://github.com/llvm/llvm-project/pull/204344
More information about the llvm-commits
mailing list