@@ -9180,18 +9180,29 @@ void AArch64InstrInfo::buildClearRegister(Register Reg, MachineBasicBlock &MBB,
91809180
91819181std::optional<DestSourcePair>
91829182AArch64InstrInfo::isCopyInstrImpl (const MachineInstr &MI) const {
9183-
91849183 // AArch64::ORRWrs and AArch64::ORRXrs with WZR/XZR reg
91859184 // and zero immediate operands used as an alias for mov instruction.
9186- if (MI.getOpcode () == AArch64::ORRWrs &&
9187- MI.getOperand (1 ).getReg () == AArch64::WZR &&
9188- MI.getOperand (3 ).getImm () == 0x0 ) {
9185+ bool OpIsORRWrs = MI.getOpcode () == AArch64::ORRWrs;
9186+ bool OpIsORRXrs = MI.getOpcode () == AArch64::ORRXrs;
9187+ if (!(OpIsORRWrs || OpIsORRXrs) || MI.getOperand (3 ).getImm () != 0x0 )
9188+ return std::nullopt ;
9189+ Register Reg1 = MI.getOperand (1 ).getReg ();
9190+
9191+ if (OpIsORRWrs && Reg1 == AArch64::WZR) {
9192+ Register Reg0 = MI.getOperand (0 ).getReg ();
9193+ if (Reg0.isPhysical ()) {
9194+ const MachineFunction *MF = MI.getMF ();
9195+ const TargetRegisterInfo *TRI = MF->getSubtarget ().getRegisterInfo ();
9196+ for (const MachineOperand &MO : MI.implicit_operands ())
9197+ if (MO.isDef () && MO.isImplicit () &&
9198+ TRI->isSubRegister (MO.getReg (), Reg0)) {
9199+ return std::nullopt ;
9200+ }
9201+ }
91899202 return DestSourcePair{MI.getOperand (0 ), MI.getOperand (2 )};
91909203 }
91919204
9192- if (MI.getOpcode () == AArch64::ORRXrs &&
9193- MI.getOperand (1 ).getReg () == AArch64::XZR &&
9194- MI.getOperand (3 ).getImm () == 0x0 ) {
9205+ if (OpIsORRXrs && Reg1 == AArch64::XZR) {
91959206 return DestSourcePair{MI.getOperand (0 ), MI.getOperand (2 )};
91969207 }
91979208
0 commit comments