@@ -656,7 +656,7 @@ getVOP3PSourceModifierFromOpIdx(const MachineInstr *UseI, int UseOpIdx,
656656// Get the subreg idx of the subreg that is used by the given instruction
657657// operand, considering the given op_sel modifier.
658658// Return 0 if the whole register is used or as a conservative fallback.
659- static unsigned getEffectiveSubRegIdx (const SIRegisterInfo * TRI,
659+ static unsigned getEffectiveSubRegIdx (const SIRegisterInfo & TRI,
660660 const SIInstrInfo &InstrInfo,
661661 const MachineOperand &Op) {
662662 const MachineInstr *I = Op.getParent ();
@@ -690,14 +690,14 @@ static unsigned getEffectiveSubRegIdx(const SIRegisterInfo *TRI,
690690 (InstrInfo.isVOP3PMix (*I) && !OpSelHi))
691691 return 0 ;
692692
693- const TargetRegisterClass *RC =
694- InstrInfo. getOpRegClass (*I , Op. getOperandNo () );
693+ const MachineRegisterInfo &MRI = I-> getParent ()-> getParent ()-> getRegInfo ();
694+ const TargetRegisterClass *RC = TRI. getRegClassForOperandReg (MRI , Op);
695695
696696 if (unsigned SubRegIdx = OpSel ? AMDGPU::sub1 : AMDGPU::sub0;
697- TRI-> getSubRegisterClass (RC, SubRegIdx))
697+ TRI. getSubClassWithSubReg (RC, SubRegIdx) == RC )
698698 return SubRegIdx;
699699 if (unsigned SubRegIdx = OpSel ? AMDGPU::hi16 : AMDGPU::lo16;
700- TRI-> getSubRegisterClass (RC, SubRegIdx))
700+ TRI. getSubClassWithSubReg (RC, SubRegIdx) == RC )
701701 return SubRegIdx;
702702
703703 return 0 ;
@@ -721,7 +721,7 @@ Register GCNSubtarget::getRealSchedDependency(const MachineInstr *DefI,
721721 unsigned DefSubRegIdx = DefOp.getSubReg ();
722722 if (DefReg.isVirtual () && !DefSubRegIdx)
723723 return DefReg;
724- unsigned UseSubRegIdx = getEffectiveSubRegIdx (TRI, InstrInfo, UseOp);
724+ unsigned UseSubRegIdx = getEffectiveSubRegIdx (* TRI, InstrInfo, UseOp);
725725 if (UseReg.isVirtual () && !UseSubRegIdx)
726726 return DefReg;
727727
@@ -733,8 +733,10 @@ Register GCNSubtarget::getRealSchedDependency(const MachineInstr *DefI,
733733 // apply to virtual registers because we cannot construct a subreg for them.
734734 if (DefReg.isVirtual ())
735735 return DefReg;
736- MCRegister DefMCReg = TRI->getSubReg (DefReg.asMCReg (), DefSubRegIdx);
737- MCRegister UseMCReg = TRI->getSubReg (UseReg.asMCReg (), UseSubRegIdx);
736+ MCRegister DefMCReg =
737+ DefSubRegIdx ? TRI->getSubReg (DefReg, DefSubRegIdx) : DefReg.asMCReg ();
738+ MCRegister UseMCReg =
739+ UseSubRegIdx ? TRI->getSubReg (UseReg, UseSubRegIdx) : UseReg.asMCReg ();
738740 const TargetRegisterClass *DefRC = TRI->getPhysRegBaseClass (DefMCReg);
739741 const TargetRegisterClass *UseRC = TRI->getPhysRegBaseClass (UseMCReg);
740742 // Some registers, such as SGPR[0-9]+_HI16, do not have a register class.
0 commit comments