@@ -214,6 +214,24 @@ MachineInstr *TargetInstrInfo::commuteInstructionImpl(MachineInstr &MI,
214
214
Reg1.isPhysical () ? MI.getOperand (Idx1).isRenamable () : false ;
215
215
bool Reg2IsRenamable =
216
216
Reg2.isPhysical () ? MI.getOperand (Idx2).isRenamable () : false ;
217
+
218
+ // For a case like this:
219
+ // %0.sub = INST %0.sub(tied), %1.sub, implicit-def %0
220
+ // we need to update the implicit-def after commuting to result in:
221
+ // %1.sub = INST %1.sub(tied), %0.sub, implicit-def %1
222
+ SmallVector<unsigned > UpdateImplicitDefIdx;
223
+ if (HasDef && MI.hasImplicitDef ()) {
224
+ const TargetRegisterInfo *TRI =
225
+ MI.getMF ()->getSubtarget ().getRegisterInfo ();
226
+ for (auto [OpNo, MO] : llvm::enumerate (MI.implicit_operands ())) {
227
+ Register ImplReg = MO.getReg ();
228
+ if ((ImplReg.isVirtual () && ImplReg == Reg0) ||
229
+ (ImplReg.isPhysical () && Reg0.isPhysical () &&
230
+ TRI->isSubRegisterEq (ImplReg, Reg0)))
231
+ UpdateImplicitDefIdx.push_back (OpNo + MI.getNumExplicitOperands ());
232
+ }
233
+ }
234
+
217
235
// If destination is tied to either of the commuted source register, then
218
236
// it must be updated.
219
237
if (HasDef && Reg0 == Reg1 &&
@@ -238,15 +256,10 @@ MachineInstr *TargetInstrInfo::commuteInstructionImpl(MachineInstr &MI,
238
256
}
239
257
240
258
if (HasDef) {
241
- // Use `substituteRegister` so that for a case like this:
242
- // %0.sub = INST %0.sub(tied), %1.sub, implicit-def %0
243
- // the implicit-def is also updated, to result in:
244
- // %1.sub = INST %1.sub(tied), %0.sub, implicit-def %1
245
- const TargetRegisterInfo &TRI =
246
- *MI.getMF ()->getSubtarget ().getRegisterInfo ();
247
- Register FromReg = CommutedMI->getOperand (0 ).getReg ();
248
- CommutedMI->substituteRegister (FromReg, Reg0, /* SubRegIdx=*/ 0 , TRI);
259
+ CommutedMI->getOperand (0 ).setReg (Reg0);
249
260
CommutedMI->getOperand (0 ).setSubReg (SubReg0);
261
+ for (unsigned Idx : UpdateImplicitDefIdx)
262
+ CommutedMI->getOperand (Idx).setReg (Reg0);
250
263
}
251
264
CommutedMI->getOperand (Idx2).setReg (Reg1);
252
265
CommutedMI->getOperand (Idx1).setReg (Reg2);
0 commit comments