@@ -657,7 +657,7 @@ getVOP3PSourceModifierFromOpIdx(const MachineInstr *UseI, int UseOpIdx,
657657// Get the subreg idx of the subreg that is used by the given instruction
658658// operand, considering the given op_sel modifier.
659659// Return 0 if the whole register is used or as a conservative fallback.
660- static unsigned getEffectiveSubRegIdx (const SIRegisterInfo * TRI,
660+ static unsigned getEffectiveSubRegIdx (const SIRegisterInfo & TRI,
661661 const SIInstrInfo &InstrInfo,
662662 const MachineOperand &Op) {
663663 const MachineInstr *I = Op.getParent ();
@@ -691,14 +691,14 @@ static unsigned getEffectiveSubRegIdx(const SIRegisterInfo *TRI,
691691 (InstrInfo.isVOP3PMix (*I) && !OpSelHi))
692692 return 0 ;
693693
694- const TargetRegisterClass *RC =
695- InstrInfo. getOpRegClass (*I , Op. getOperandNo () );
694+ const MachineRegisterInfo &MRI = I-> getParent ()-> getParent ()-> getRegInfo ();
695+ const TargetRegisterClass *RC = TRI. getRegClassForOperandReg (MRI , Op);
696696
697697 if (unsigned SubRegIdx = OpSel ? AMDGPU::sub1 : AMDGPU::sub0;
698- TRI-> getSubRegisterClass (RC, SubRegIdx))
698+ TRI. getSubClassWithSubReg (RC, SubRegIdx) == RC )
699699 return SubRegIdx;
700700 if (unsigned SubRegIdx = OpSel ? AMDGPU::hi16 : AMDGPU::lo16;
701- TRI-> getSubRegisterClass (RC, SubRegIdx))
701+ TRI. getSubClassWithSubReg (RC, SubRegIdx) == RC )
702702 return SubRegIdx;
703703
704704 return 0 ;
@@ -722,7 +722,7 @@ Register GCNSubtarget::getRealSchedDependency(const MachineInstr *DefI,
722722 unsigned DefSubRegIdx = DefOp.getSubReg ();
723723 if (DefReg.isVirtual () && !DefSubRegIdx)
724724 return DefReg;
725- unsigned UseSubRegIdx = getEffectiveSubRegIdx (TRI, InstrInfo, UseOp);
725+ unsigned UseSubRegIdx = getEffectiveSubRegIdx (* TRI, InstrInfo, UseOp);
726726 if (UseReg.isVirtual () && !UseSubRegIdx)
727727 return DefReg;
728728
@@ -734,8 +734,10 @@ Register GCNSubtarget::getRealSchedDependency(const MachineInstr *DefI,
734734 // apply to virtual registers because we cannot construct a subreg for them.
735735 if (DefReg.isVirtual ())
736736 return DefReg;
737- MCRegister DefMCReg = TRI->getSubReg (DefReg.asMCReg (), DefSubRegIdx);
738- MCRegister UseMCReg = TRI->getSubReg (UseReg.asMCReg (), UseSubRegIdx);
737+ MCRegister DefMCReg =
738+ DefSubRegIdx ? TRI->getSubReg (DefReg, DefSubRegIdx) : DefReg.asMCReg ();
739+ MCRegister UseMCReg =
740+ UseSubRegIdx ? TRI->getSubReg (UseReg, UseSubRegIdx) : UseReg.asMCReg ();
739741 const TargetRegisterClass *DefRC = TRI->getPhysRegBaseClass (DefMCReg);
740742 const TargetRegisterClass *UseRC = TRI->getPhysRegBaseClass (UseMCReg);
741743 // Some registers, such as SGPR[0-9]+_HI16, do not have a register class.
0 commit comments