@@ -557,10 +557,19 @@ void AIE2PInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
557
557
558
558
if (AIE2P::mMvSclSrcRegClass .contains (SrcReg) &&
559
559
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
+ }
564
573
} else if ((AIE2P::eLRegClass.contains (SrcReg)) &&
565
574
(AIE2P::eLRegClass.contains (DstReg))) {
566
575
BuildMI (MBB, MBBI, DL, get (AIE2P::MOV_alu_mv_mv_mv_scl),
@@ -1138,11 +1147,15 @@ unsigned AIE2PInstrInfo::getConstantMovOpcode(MachineRegisterInfo &MRI,
1138
1147
unsigned int ImmSize = Val.getSignificantBits ();
1139
1148
1140
1149
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
+ }
1146
1159
assert (DstRegClass != nullptr && " RC cannot be null" );
1147
1160
if (ImmSize <= 11 ) {
1148
1161
if (regClassMatches (AIE2P::mAluCgRegClass , DstRegClass, Reg))
0 commit comments