Lines Matching full:cp
242 bool joinIntervals(CoalescerPair &CP);
245 bool joinVirtRegs(CoalescerPair &CP);
253 bool joinReservedPhysReg(CoalescerPair &CP);
261 LaneBitmask LaneMask, CoalescerPair &CP,
267 LaneBitmask LaneMask, const CoalescerPair &CP);
273 bool adjustCopiesBackFrom(const CoalescerPair &CP, MachineInstr *CopyMI);
288 std::pair<bool, bool> removeCopyByCommutingDef(const CoalescerPair &CP,
292 bool removePartialRedundancy(const CoalescerPair &CP, MachineInstr &CopyMI);
296 bool reMaterializeTrivialDef(const CoalescerPair &CP, MachineInstr *CopyMI,
300 bool canJoinPhys(const CoalescerPair &CP);
368 void checkMergingChangesDbgValues(CoalescerPair &CP, LiveRange &LHS,
612 bool RegisterCoalescer::adjustCopiesBackFrom(const CoalescerPair &CP,
614 assert(!CP.isPartial() && "This doesn't work for partial copies.");
615 assert(!CP.isPhys() && "This doesn't work for physreg copies.");
618 LIS->getInterval(CP.isFlipped() ? CP.getDstReg() : CP.getSrcReg());
620 LIS->getInterval(CP.isFlipped() ? CP.getSrcReg() : CP.getDstReg());
662 if (!CP.isCoalescable(ACopyMI) || !ACopyMI->isFullCopy())
807 RegisterCoalescer::removeCopyByCommutingDef(const CoalescerPair &CP,
809 assert(!CP.isPhys());
812 LIS->getInterval(CP.isFlipped() ? CP.getDstReg() : CP.getSrcReg());
814 LIS->getInterval(CP.isFlipped() ? CP.getSrcReg() : CP.getDstReg());
1090 bool RegisterCoalescer::removePartialRedundancy(const CoalescerPair &CP,
1092 assert(!CP.isPhys());
1106 LIS->getInterval(CP.isFlipped() ? CP.getDstReg() : CP.getSrcReg());
1108 LIS->getInterval(CP.isFlipped() ? CP.getSrcReg() : CP.getDstReg());
1289 bool RegisterCoalescer::reMaterializeTrivialDef(const CoalescerPair &CP,
1293 Register SrcReg = CP.isFlipped() ? CP.getDstReg() : CP.getSrcReg();
1294 unsigned SrcIdx = CP.isFlipped() ? CP.getDstIdx() : CP.getSrcIdx();
1295 Register DstReg = CP.isFlipped() ? CP.getSrcReg() : CP.getDstReg();
1296 unsigned DstIdx = CP.isFlipped() ? CP.getSrcIdx() : CP.getDstIdx();
1351 if (CopyDstReg.isPhysical() && CP.isPartial()) {
1371 unsigned NewDstIdx = TRI->composeSubRegIndices(CP.getSrcIdx(), DefSubIdx);
1405 const TargetRegisterClass *NewRC = CP.getNewRC();
1409 assert(SrcIdx == 0 && CP.isFlipped() &&
1956 bool RegisterCoalescer::canJoinPhys(const CoalescerPair &CP) {
1960 if (!MRI->isReserved(CP.getDstReg())) {
1965 LiveInterval &JoinVInt = LIS->getInterval(CP.getSrcReg());
2023 CoalescerPair CP(*TRI);
2024 if (!CP.setRegisters(CopyMI)) {
2029 if (CP.getNewRC()) {
2030 auto SrcRC = MRI->getRegClass(CP.getSrcReg());
2031 auto DstRC = MRI->getRegClass(CP.getDstReg());
2032 unsigned SrcIdx = CP.getSrcIdx();
2033 unsigned DstIdx = CP.getDstIdx();
2034 if (CP.isFlipped()) {
2039 CP.getNewRC(), *LIS)) {
2048 if (!CP.isPhys() && CopyMI->allDefsAreDead()) {
2056 if (!CP.isPhys()) {
2069 if (CP.getSrcReg() == CP.getDstReg()) {
2070 LiveInterval &LI = LIS->getInterval(CP.getSrcReg());
2104 setUndefOnPrunedSubRegUses(LI, CP.getSrcReg(), PrunedLanes);
2114 if (CP.isPhys()) {
2116 << printReg(CP.getSrcReg(), TRI) << " with "
2117 << printReg(CP.getDstReg(), TRI, CP.getSrcIdx()) << '\n');
2118 if (!canJoinPhys(CP)) {
2122 if (reMaterializeTrivialDef(CP, CopyMI, IsDefCopy))
2130 if (!CP.isPartial() && LIS->getInterval(CP.getSrcReg()).size() >
2131 LIS->getInterval(CP.getDstReg()).size())
2132 CP.flip();
2136 << TRI->getRegClassName(CP.getNewRC()) << " with ";
2137 if (CP.getDstIdx() && CP.getSrcIdx())
2138 dbgs() << printReg(CP.getDstReg()) << " in "
2139 << TRI->getSubRegIndexName(CP.getDstIdx()) << " and "
2140 << printReg(CP.getSrcReg()) << " in "
2141 << TRI->getSubRegIndexName(CP.getSrcIdx()) << '\n';
2143 dbgs() << printReg(CP.getSrcReg(), TRI) << " in "
2144 << printReg(CP.getDstReg(), TRI, CP.getSrcIdx()) << '\n';
2155 if (!joinIntervals(CP)) {
2161 if (reMaterializeTrivialDef(CP, CopyMI, IsDefCopy))
2166 if (!CP.isPartial() && !CP.isPhys()) {
2167 bool Changed = adjustCopiesBackFrom(CP, CopyMI);
2170 std::tie(Changed, Shrink) = removeCopyByCommutingDef(CP, CopyMI);
2174 Register DstReg = CP.isFlipped() ? CP.getSrcReg() : CP.getDstReg();
2186 if (!CP.isPartial() && !CP.isPhys())
2187 if (removePartialRedundancy(CP, *CopyMI))
2198 if (CP.isCrossClass()) {
2200 MRI->setRegClass(CP.getDstReg(), CP.getNewRC());
2205 if (!CP.isPhys() && RegClassInfo.isProperSubClass(CP.getNewRC()))
2206 InflateRegs.push_back(CP.getDstReg());
2217 if (CP.getDstIdx())
2218 updateRegDefsUses(CP.getDstReg(), CP.getDstReg(), CP.getDstIdx());
2219 updateRegDefsUses(CP.getSrcReg(), CP.getDstReg(), CP.getSrcIdx());
2223 LiveInterval &LI = LIS->getInterval(CP.getDstReg());
2235 // CP.getSrcReg()'s live interval has been merged into CP.getDstReg's live
2236 // interval. Since CP.getSrcReg() is in ToBeUpdated set and its live interval
2238 if (ToBeUpdated.count(CP.getSrcReg()))
2242 LiveInterval &LI = LIS->getInterval(CP.getDstReg());
2248 LIS->removeInterval(CP.getSrcReg());
2251 TRI->updateRegAllocHint(CP.getSrcReg(), CP.getDstReg(), *MF);
2254 dbgs() << "\tSuccess: " << printReg(CP.getSrcReg(), TRI, CP.getSrcIdx())
2255 << " -> " << printReg(CP.getDstReg(), TRI, CP.getDstIdx()) << '\n';
2257 if (CP.isPhys())
2258 dbgs() << printReg(CP.getDstReg(), TRI);
2260 dbgs() << LIS->getInterval(CP.getDstReg());
2268 bool RegisterCoalescer::joinReservedPhysReg(CoalescerPair &CP) {
2269 Register DstReg = CP.getDstReg();
2270 Register SrcReg = CP.getSrcReg();
2271 assert(CP.isPhys() && "Must be a physreg copy");
2315 if (CP.isFlipped()) {
2379 MRI->clearKillFlags(CP.getSrcReg());
2462 /// subregister SubIdx in the coalesced register. Either CP.DstIdx or
2463 /// CP.SrcIdx.
2480 const CoalescerPair &CP;
2640 SmallVectorImpl<VNInfo *> &newVNInfo, const CoalescerPair &cp,
2645 NewVNInfo(newVNInfo), CP(cp), LIS(lis), Indexes(LIS->getSlotIndexes()),
2959 if (CP.isCoalescable(DefMI)) {
2976 if (DefMI->isFullCopy() && !CP.isPartial() &&
3549 if (Reg.isVirtual() && Reg != CP.getSrcReg() && Reg != CP.getDstReg())
3566 const CoalescerPair &CP) {
3568 JoinVals RHSVals(RRange, CP.getSrcReg(), CP.getSrcIdx(), LaneMask, NewVNInfo,
3569 CP, LIS, TRI, true, true);
3570 JoinVals LHSVals(LRange, CP.getDstReg(), CP.getDstIdx(), LaneMask, NewVNInfo,
3571 CP, LIS, TRI, true, true);
3629 CoalescerPair &CP,
3634 [this, &Allocator, &ToMerge, &CP](LiveInterval::SubRange &SR) {
3640 joinSubRegRanges(SR, RangeCopy, SR.LaneMask, CP);
3657 bool RegisterCoalescer::joinVirtRegs(CoalescerPair &CP) {
3659 LiveInterval &RHS = LIS->getInterval(CP.getSrcReg());
3660 LiveInterval &LHS = LIS->getInterval(CP.getDstReg());
3661 bool TrackSubRegLiveness = MRI->shouldTrackSubRegLiveness(*CP.getNewRC());
3662 JoinVals RHSVals(RHS, CP.getSrcReg(), CP.getSrcIdx(), LaneBitmask::getNone(),
3663 NewVNInfo, CP, LIS, TRI, false, TrackSubRegLiveness);
3664 JoinVals LHSVals(LHS, CP.getDstReg(), CP.getDstIdx(), LaneBitmask::getNone(),
3665 NewVNInfo, CP, LIS, TRI, false, TrackSubRegLiveness);
3687 unsigned DstIdx = CP.getDstIdx();
3689 LaneBitmask Mask = DstIdx == 0 ? CP.getNewRC()->getLaneMask()
3701 LLVM_DEBUG(dbgs() << "\t\tLHST = " << printReg(CP.getDstReg()) << ' ' << LHS
3705 unsigned SrcIdx = CP.getSrcIdx();
3707 LaneBitmask Mask = SrcIdx == 0 ? CP.getNewRC()->getLaneMask()
3709 mergeSubRangeInto(LHS, RHS, Mask, CP, DstIdx);
3714 mergeSubRangeInto(LHS, R, Mask, CP, DstIdx);
3725 } else if (TrackSubRegLiveness && !CP.getDstIdx() && CP.getSrcIdx()) {
3727 CP.getNewRC()->getLaneMask(), LHS);
3728 mergeSubRangeInto(LHS, RHS, TRI->getSubRegIndexLaneMask(CP.getSrcIdx()), CP,
3729 CP.getDstIdx());
3751 checkMergingChangesDbgValues(CP, LHS, LHSVals, RHS, RHSVals);
3755 auto RegIt = RegToPHIIdx.find(CP.getSrcReg());
3780 if (CP.getSrcIdx() != 0 || CP.getDstIdx() != 0)
3783 if (PHIIt->second.SubReg && PHIIt->second.SubReg != CP.getSrcIdx())
3787 PHIIt->second.Reg = CP.getDstReg();
3791 if (CP.getSrcIdx() != 0)
3792 PHIIt->second.SubReg = CP.getSrcIdx();
3803 RegIt = RegToPHIIdx.find(CP.getDstReg());
3808 RegToPHIIdx.insert({CP.getDstReg(), InstrNums});
3838 bool RegisterCoalescer::joinIntervals(CoalescerPair &CP) {
3839 return CP.isPhys() ? joinReservedPhysReg(CP) : joinVirtRegs(CP);
3886 void RegisterCoalescer::checkMergingChangesDbgValues(CoalescerPair &CP,
3900 ScanForSrcReg(CP.getSrcReg());
3901 ScanForDstReg(CP.getDstReg());