[llvm] [AMDGPU] Constrain AV->VReg if we do not exceed RP thresholds (PR #150086)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 23 16:11:34 PDT 2025
================
@@ -1036,6 +1046,78 @@ bool GCNSchedStage::initGCNSchedStage() {
return true;
}
+bool AVGPRRewriteScheduleStage::reconstrainRegClass(
+ Register Reg, const TargetRegisterClass *NewRC) const {
+ const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
+ const TargetRegisterClass *OldRC = DAG.MRI.getRegClass(Reg);
+ const TargetRegisterInfo *TRI = DAG.MRI.getTargetRegisterInfo();
+ const TargetRegisterClass *ConstrainRC = NewRC;
+ const SIRegisterInfo *SRI = MF.getSubtarget<GCNSubtarget>().getRegisterInfo();
+
+ // Stop early if there is nothing to do.
+ if (!NewRC || NewRC == OldRC)
+ return false;
+
+ // Accumulate constraints from all uses.
+ for (MachineOperand &MO : DAG.MRI.reg_nodbg_operands(Reg)) {
+ // Apply the effect of the given operand to NewRC.
+ MachineInstr *MI = MO.getParent();
+ unsigned OpNo = &MO - &MI->getOperand(0);
+ ConstrainRC = MI->getRegClassConstraintEffect(OpNo, ConstrainRC, TII, TRI);
+ if (!ConstrainRC)
+ return false;
+ if (MI->isCopy()) {
+ MachineOperand &OtherOp = MI->getOperand(1 - OpNo);
+ if (!OtherOp.isReg())
+ continue;
+
+ if (!SRI->isVGPR(DAG.MRI, OtherOp.getReg()))
+ return false;
+ }
+ }
+ DAG.MRI.setRegClass(Reg, ConstrainRC);
+ return true;
+}
+
+bool AVGPRRewriteScheduleStage::initGCNSchedStage() {
+ const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>();
+
+ // The main benefit of AVReg usage is that the register can be assigned to
+ // either VGPR or AGPR. However, for the unified RF case, we should only be
+ // using AGPR if strictly necessary. That is, if the required number of VGPRs
+ // exceeds the addressable limit. Otherwise, we should be stricly using VGPRs
+ // to minimize cross RC copies. Thus, if we are underc this limit, we should
----------------
arsenm wrote:
```suggestion
// to minimize cross RC copies. Thus, if we are under this limit, we should
```
https://github.com/llvm/llvm-project/pull/150086
More information about the llvm-commits
mailing list