@@ -557,10 +557,19 @@ void AIE2PInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
557557
558558 if (AIE2P::mMvSclSrcRegClass .contains (SrcReg) &&
559559 AIE2P::mMvSclDstRegClass .contains (DstReg)) {
560- // Build MultiSlotPseudo in preference
561- const unsigned MOVSclOpcode = getScalarMovOpcode (DstReg, SrcReg);
562- BuildMI (MBB, MBBI, DL, get (MOVSclOpcode), DstReg)
563- .addReg (SrcReg, getKillRegState (KillSrc));
560+ if (MachineInstr *MI = MRI.getUniqueVRegDef (SrcReg);
561+ MI && MI->isMoveImmediate ()) {
562+ // Try modifying scalar move to pseudo immediate move.
563+ const int64_t Imm = MI->getOperand (1 ).getImm ();
564+ APInt ImmVal = APInt (64 , Imm);
565+ auto OpCode = getConstantMovOpcode (MRI, DstReg, ImmVal);
566+ BuildMI (MBB, MBBI, DL, get (OpCode), DstReg).addImm (Imm);
567+ } else {
568+ // Build MultiSlotPseudo in preference
569+ const unsigned MOVSclOpcode = getScalarMovOpcode (DstReg, SrcReg);
570+ BuildMI (MBB, MBBI, DL, get (MOVSclOpcode), DstReg)
571+ .addReg (SrcReg, getKillRegState (KillSrc));
572+ }
564573 } else if ((AIE2P::eLRegClass.contains (SrcReg)) &&
565574 (AIE2P::eLRegClass.contains (DstReg))) {
566575 BuildMI (MBB, MBBI, DL, get (AIE2P::MOV_alu_mv_mv_mv_scl),
@@ -1138,11 +1147,15 @@ unsigned AIE2PInstrInfo::getConstantMovOpcode(MachineRegisterInfo &MRI,
11381147 unsigned int ImmSize = Val.getSignificantBits ();
11391148
11401149 const TargetRegisterClass *DstRegClass = nullptr ;
1141- const RegClassOrRegBank &RCB = MRI.getRegClassOrRegBank (Reg);
1142- if (const RegisterBank *RB = RCB.dyn_cast <const RegisterBank *>())
1143- DstRegClass = &TRI->getMinClassForRegBank (*RB, MRI.getType (Reg));
1144- if (auto *TRC = RCB.dyn_cast <const TargetRegisterClass *>())
1145- DstRegClass = TRC;
1150+ if (Register::isVirtualRegister (Reg)) {
1151+ const RegClassOrRegBank &RCB = MRI.getRegClassOrRegBank (Reg);
1152+ if (const RegisterBank *RB = RCB.dyn_cast <const RegisterBank *>())
1153+ DstRegClass = &TRI->getMinClassForRegBank (*RB, MRI.getType (Reg));
1154+ if (auto *TRC = RCB.dyn_cast <const TargetRegisterClass *>())
1155+ DstRegClass = TRC;
1156+ } else {
1157+ DstRegClass = TRI->getMinimalPhysRegClass (Reg);
1158+ }
11461159 assert (DstRegClass != nullptr && " RC cannot be null" );
11471160 if (ImmSize <= 11 ) {
11481161 if (regClassMatches (AIE2P::mAluCgRegClass , DstRegClass, Reg))
0 commit comments