@@ -4758,30 +4758,41 @@ MachineInstr *SIInstrInfo::buildShrunkInst(MachineInstr &MI,
47584758 return Inst32;
47594759}
47604760
4761+ bool SIInstrInfo::physRegUsesConstantBus (const MachineOperand &RegOp) const {
4762+ // Null is free
4763+ Register Reg = RegOp.getReg ();
4764+ if (Reg == AMDGPU::SGPR_NULL || Reg == AMDGPU::SGPR_NULL64)
4765+ return false ;
4766+
4767+ // SGPRs use the constant bus
4768+
4769+ // FIXME: implicit registers that are not part of the MCInstrDesc's implicit
4770+ // physical register operands should also count, except for exec.
4771+ if (RegOp.isImplicit ())
4772+ return Reg == AMDGPU::VCC || Reg == AMDGPU::VCC_LO || Reg == AMDGPU::M0;
4773+
4774+ // SGPRs use the constant bus
4775+ return AMDGPU::SReg_32RegClass.contains (Reg) ||
4776+ AMDGPU::SReg_64RegClass.contains (Reg);
4777+ }
4778+
4779+ bool SIInstrInfo::regUsesConstantBus (const MachineOperand &RegOp,
4780+ const MachineRegisterInfo &MRI) const {
4781+ Register Reg = RegOp.getReg ();
4782+ return Reg.isVirtual () ? RI.isSGPRClass (MRI.getRegClass (Reg))
4783+ : physRegUsesConstantBus (RegOp);
4784+ }
4785+
47614786bool SIInstrInfo::usesConstantBus (const MachineRegisterInfo &MRI,
47624787 const MachineOperand &MO,
47634788 const MCOperandInfo &OpInfo) const {
47644789 // Literal constants use the constant bus.
47654790 if (!MO.isReg ())
47664791 return !isInlineConstant (MO, OpInfo);
47674792
4768- if (!MO.isUse ())
4769- return false ;
4770-
4771- if (MO.getReg ().isVirtual ())
4772- return RI.isSGPRClass (MRI.getRegClass (MO.getReg ()));
4773-
4774- // Null is free
4775- if (MO.getReg () == AMDGPU::SGPR_NULL || MO.getReg () == AMDGPU::SGPR_NULL64)
4776- return false ;
4777-
4778- // SGPRs use the constant bus
4779- if (MO.isImplicit ()) {
4780- return MO.getReg () == AMDGPU::M0 || MO.getReg () == AMDGPU::VCC ||
4781- MO.getReg () == AMDGPU::VCC_LO;
4782- }
4783- return AMDGPU::SReg_32RegClass.contains (MO.getReg ()) ||
4784- AMDGPU::SReg_64RegClass.contains (MO.getReg ());
4793+ Register Reg = MO.getReg ();
4794+ return Reg.isVirtual () ? RI.isSGPRClass (MRI.getRegClass (Reg))
4795+ : physRegUsesConstantBus (MO);
47854796}
47864797
47874798static Register findImplicitSGPRRead (const MachineInstr &MI) {
@@ -6250,13 +6261,12 @@ bool SIInstrInfo::isOperandLegal(const MachineInstr &MI, unsigned OpIdx,
62506261 continue ;
62516262 const MachineOperand &Op = MI.getOperand (i);
62526263 if (Op.isReg ()) {
6253- RegSubRegPair SGPR (Op.getReg (), Op.getSubReg ());
6254- if (!SGPRsUsed.count (SGPR) &&
6255- // FIXME: This can access off the end of the operands() array.
6256- usesConstantBus (MRI, Op, InstDesc.operands ().begin ()[i])) {
6257- if (--ConstantBusLimit <= 0 )
6258- return false ;
6259- SGPRsUsed.insert (SGPR);
6264+ if (Op.isUse ()) {
6265+ RegSubRegPair SGPR (Op.getReg (), Op.getSubReg ());
6266+ if (regUsesConstantBus (Op, MRI) && SGPRsUsed.insert (SGPR).second ) {
6267+ if (--ConstantBusLimit <= 0 )
6268+ return false ;
6269+ }
62606270 }
62616271 } else if (AMDGPU::isSISrcOperand (InstDesc, i) &&
62626272 !isInlineConstant (Op, InstDesc.operands ()[i])) {
0 commit comments