@@ -65,9 +65,8 @@ FunctionPass *llvm::createX86SuppressAPXForRelocationPass() {
6565 return new X86SuppressAPXForRelocationPass ();
6666}
6767
68- static void suppressEGPRRegClass (MachineFunction &MF , MachineInstr &MI,
68+ static void suppressEGPRRegClass (MachineRegisterInfo *MRI , MachineInstr &MI,
6969 const X86Subtarget &ST, unsigned int OpNum) {
70- MachineRegisterInfo *MRI = &MF.getRegInfo ();
7170 Register Reg = MI.getOperand (OpNum).getReg ();
7271 if (!Reg.isVirtual ()) {
7372 assert (!X86II::isApxExtendedReg (Reg) && " APX EGPR is used unexpectedly." );
@@ -77,29 +76,22 @@ static void suppressEGPRRegClass(MachineFunction &MF, MachineInstr &MI,
7776 const X86RegisterInfo *RI = ST.getRegisterInfo ();
7877 const TargetRegisterClass *NewRC = RI->constrainRegClassToNonRex2 (RC);
7978 MRI->setRegClass (Reg, NewRC);
79+ }
8080
81- for (MachineInstr &Use : MRI->use_instructions (Reg)) {
82- switch (Use.getOpcode ()) {
83- case X86::PHI: {
84- Register DstReg = Use.getOperand (0 ).getReg ();
85- if (!DstReg.isVirtual ()) {
86- assert (!X86II::isApxExtendedReg (DstReg) && " APX EGPR is used unexpectedly." );
87- return ;
88- }
89- const TargetRegisterClass *DstRC = MRI->getRegClass (DstReg);
90- const TargetRegisterClass *NewDstRC = RI->constrainRegClassToNonRex2 (DstRC);
91- MRI->setRegClass (DstReg, NewDstRC);
92- break ;
93- }
94- }
95- }
81+ static void suppressEGPRRegClassInRegUses (MachineRegisterInfo *MRI,
82+ const X86Subtarget &ST,
83+ Register Reg) {
84+ for (MachineInstr &Use : MRI->use_instructions (Reg))
85+ if (Use.getOpcode () == X86::PHI)
86+ suppressEGPRRegClass (MRI, Use, ST, 0 );
9687}
9788
9889static bool handleInstructionWithEGPR (MachineFunction &MF,
9990 const X86Subtarget &ST) {
10091 if (!ST.hasEGPR ())
10192 return false ;
10293
94+ MachineRegisterInfo *MRI = &MF.getRegInfo ();
10395 auto suppressEGPRInInstrWithReloc = [&](MachineInstr &MI,
10496 ArrayRef<unsigned > OpNoArray) {
10597 int MemOpNo = X86II::getMemoryOperandNo (MI.getDesc ().TSFlags ) +
@@ -110,7 +102,7 @@ static bool handleInstructionWithEGPR(MachineFunction &MF,
110102 LLVM_DEBUG (dbgs () << " Transform instruction with relocation type:\n "
111103 << MI);
112104 for (unsigned OpNo : OpNoArray)
113- suppressEGPRRegClass (MF , MI, ST, OpNo);
105+ suppressEGPRRegClass (MRI , MI, ST, OpNo);
114106 LLVM_DEBUG (dbgs () << " to:\n " << MI << " \n " );
115107 }
116108 };
@@ -133,6 +125,7 @@ static bool handleInstructionWithEGPR(MachineFunction &MF,
133125 case X86::MOV32rm:
134126 case X86::MOV64rm: {
135127 suppressEGPRInInstrWithReloc (MI, {0 });
128+ suppressEGPRRegClassInRegUses (MRI, ST, MI.getOperand (0 ).getReg ());
136129 break ;
137130 }
138131 case X86::ADC32rm:
@@ -150,6 +143,7 @@ static bool handleInstructionWithEGPR(MachineFunction &MF,
150143 case X86::SUB64rm:
151144 case X86::XOR64rm: {
152145 suppressEGPRInInstrWithReloc (MI, {0 , 1 });
146+ suppressEGPRRegClassInRegUses (MRI, ST, MI.getOperand (0 ).getReg ());
153147 break ;
154148 }
155149 }
@@ -195,7 +189,8 @@ static bool handleNDDOrNFInstructions(MachineFunction &MF,
195189 MI.getOperand (1 ).setReg (Reg);
196190 const MCInstrDesc &NewDesc = TII->get (X86::ADD64rm);
197191 MI.setDesc (NewDesc);
198- suppressEGPRRegClass (MF, MI, ST, 0 );
192+ suppressEGPRRegClass (MRI, MI, ST, 0 );
193+ suppressEGPRRegClassInRegUses (MRI, ST, MI.getOperand (0 ).getReg ());
199194 MI.tieOperands (0 , 1 );
200195 LLVM_DEBUG (dbgs () << " to:\n " << *CopyMIB << " \n " );
201196 LLVM_DEBUG (dbgs () << " " << MI << " \n " );
@@ -208,7 +203,8 @@ static bool handleNDDOrNFInstructions(MachineFunction &MF,
208203 if (MO.getTargetFlags () == X86II::MO_GOTTPOFF) {
209204 LLVM_DEBUG (dbgs () << " Transform instruction with relocation type:\n "
210205 << MI);
211- suppressEGPRRegClass (MF, MI, ST, 0 );
206+ suppressEGPRRegClass (MRI, MI, ST, 0 );
207+ suppressEGPRRegClassInRegUses (MRI, ST, MI.getOperand (0 ).getReg ());
212208 Register Reg = MRI->createVirtualRegister (&X86::GR64_NOREX2RegClass);
213209 [[maybe_unused]] MachineInstrBuilder CopyMIB =
214210 BuildMI (MBB, MI, MI.getDebugLoc (), TII->get (TargetOpcode::COPY),
0 commit comments