1717#include " AIE2PRegisterBankInfo.h"
1818#include " AIE2PSubtarget.h"
1919#include " MCTargetDesc/aie2p/AIE2PMCTargetDesc.h"
20+ #include " Utils/AIELoopUtils.h"
21+ #include " llvm/CodeGen/LiveIntervals.h"
2022#include " llvm/CodeGen/MachineFrameInfo.h"
2123#include " llvm/CodeGen/MachineFunction.h"
2224#include " llvm/CodeGen/MachineInstrBuilder.h"
@@ -34,6 +36,11 @@ using namespace llvm;
3436
3537extern cl::opt<bool > SimplifyCRSRRegs;
3638
39+ cl::opt<bool > EnableCoalescingForWideCopy (
40+ " aie-enable-widen-copy-coalescing" ,
41+ cl::desc (" Enable register coalescing for widening Copy" ), cl::init(false ),
42+ cl::Hidden);
43+
3744extern llvm::cl::opt<unsigned > ReservedGPRs;
3845
3946AIE2PRegisterInfo::AIE2PRegisterInfo (unsigned HwMode)
@@ -603,3 +610,34 @@ bool AIE2PRegisterInfo::isFifoPhysReg(const Register Reg) const {
603610 return Reg.isPhysical () && (AIE2P::FIFO512RegClass.contains (Reg) ||
604611 AIE2P::FIFO1024RegClass.contains (Reg));
605612}
613+
614+ bool AIE2PRegisterInfo::shouldCoalesce (
615+ MachineInstr *MI, const TargetRegisterClass *SrcRC, unsigned SubReg,
616+ const TargetRegisterClass *DstRC, unsigned DstSubReg,
617+ const TargetRegisterClass *NewRC, LiveIntervals &LIS) const {
618+
619+ const unsigned SrcSize = getRegSizeInBits (*SrcRC);
620+ const unsigned DstSize = getRegSizeInBits (*DstRC);
621+ MachineFunction *MF = MI->getMF ();
622+ const AIEBaseInstrInfo *TII =
623+ static_cast <const AIEBaseInstrInfo *>(MF->getSubtarget ().getInstrInfo ());
624+ const unsigned BasicVectorSize = TII->getBasicVecRegSize ();
625+ // Should not coalesce if copying from bigger source.
626+ if (!EnableCoalescingForWideCopy && SrcSize < DstSize &&
627+ (SrcSize >= BasicVectorSize || DstSize >= BasicVectorSize)) {
628+ MachineBasicBlock *MBB = MI->getParent ();
629+ LiveInterval &LI = LIS.getInterval (MI->getOperand (1 ).getReg ());
630+ const MachineInstr *FirstMI =
631+ LI.empty () ? nullptr : LIS.getInstructionFromIndex (LI.beginIndex ());
632+ const MachineInstr *LastMI =
633+ LI.empty () ? nullptr : LIS.getInstructionFromIndex (LI.endIndex ());
634+ // Coalescing inside the same basic block found beneficial. So, check that
635+ // the LiveInterval is not just local to MBB.
636+ if (!FirstMI || FirstMI->getParent () != MBB || !LastMI ||
637+ LastMI->getParent () != MBB)
638+ return false ;
639+ }
640+
641+ return TargetRegisterInfo::shouldCoalesce (MI, SrcRC, SubReg, DstRC, DstSubReg,
642+ NewRC, LIS);
643+ }
0 commit comments