66#define DEBUG_TYPE "twoaddressinstruction"
68STATISTIC(NumTwoAddressInstrs,
"Number of two-address instructions");
69STATISTIC(NumCommuted ,
"Number of instructions commuted to coalesce");
70STATISTIC(NumAggrCommuted ,
"Number of instructions aggressively commuted");
71STATISTIC(NumConvertedTo3Addr,
"Number of instructions promoted to 3-address");
72STATISTIC(NumReSchedUps,
"Number of instructions re-scheduled up");
73STATISTIC(NumReSchedDowns,
"Number of instructions re-scheduled down");
78 cl::desc(
"Coalesce copies by rescheduling (default=true)"),
82 "twoaddr-analyze-revcopy-tied",
83 cl::desc(
"Analyze tied operands when looking for reversed copy chain"),
90 cl::desc(
"Maximum number of dataflow edges to traverse when evaluating "
91 "the benefit of commuting operands"));
95class TwoAddressInstructionImpl {
127 bool noUseAfterLastDef(
Register Reg,
unsigned Dist,
unsigned &LastDef);
130 bool &IsSrcPhys,
bool &IsDstPhys)
const;
140 bool &IsDstPhys)
const;
155 unsigned RegBIdx,
unsigned RegCIdx,
unsigned Dist);
172 unsigned SrcIdx,
unsigned DstIdx,
173 unsigned &Dist,
bool shouldOnlyCommute);
188 void processTiedPairs(
MachineInstr *
MI, TiedPairList&,
unsigned &Dist);
190 bool processStatepoint(
MachineInstr *
MI, TiedOperandMap &TiedOperands);
205 TwoAddressInstructionLegacyPass() : MachineFunctionPass(ID) {}
209 TwoAddressInstructionImpl Impl(MF,
this);
213 Impl.setOptLevel(CodeGenOptLevel::None);
217 void getAnalysisUsage(AnalysisUsage &AU)
const override {
235 TwoAddressInstructionImpl Impl(MF, MFAM, LIS);
256char TwoAddressInstructionLegacyPass::ID = 0;
261 "Two-Address instruction pass",
false,
false)
263TwoAddressInstructionImpl::TwoAddressInstructionImpl(
266 : MF(&Func),
TII(Func.getSubtarget().getInstrInfo()),
267 TRI(Func.getSubtarget().getRegisterInfo()),
268 InstrItins(Func.getSubtarget().getInstrItineraryData()),
269 MRI(&Func.getRegInfo()), LIS(LIS),
270 OptLevel(Func.getTarget().getOptLevel()) {}
272TwoAddressInstructionImpl::TwoAddressInstructionImpl(
MachineFunction &Func,
274 : MF(&
Func),
TII(
Func.getSubtarget().getInstrInfo()),
275 TRI(
Func.getSubtarget().getRegisterInfo()),
276 InstrItins(
Func.getSubtarget().getInstrItineraryData()),
277 MRI(&
Func.getRegInfo()), OptLevel(
Func.getTarget().getOptLevel()) {
279 LIS = LISWrapper ? &LISWrapper->
getLIS() :
nullptr;
284TwoAddressInstructionImpl::getSingleDef(
Register Reg,
286 MachineInstr *Ret =
nullptr;
288 if (
DefMI.getParent() != BB ||
DefMI.isDebugValue())
292 else if (Ret != &
DefMI)
300 int DefRegIdx =
MI->findRegisterDefOperandIdx(DefReg,
TRI);
303 return MI->isRegTiedToUseOperand(DefRegIdx, &TiedOpIdx);
313bool TwoAddressInstructionImpl::isRevCopyChain(
Register FromReg,
Register ToReg,
316 for (
int i = 0; i < Maxlen; i++) {
317 MachineInstr *
Def = getSingleDef(TmpReg,
MBB);
322 TmpReg =
Def->getOperand(1).getReg();
323 else if (
unsigned TiedOpIdx;
325 Register TiedUseReg =
Def->getOperand(TiedOpIdx).getReg();
328 if (TiedUseReg == TmpReg)
344bool TwoAddressInstructionImpl::noUseAfterLastDef(
Register Reg,
unsigned Dist,
347 unsigned LastUse = Dist;
349 MachineInstr *
MI = MO.getParent();
350 if (
MI->getParent() !=
MBB ||
MI->isDebugValue())
352 auto DI = DistanceMap.
find(
MI);
353 if (DI == DistanceMap.
end())
355 if (MO.isUse() && DI->second < LastUse)
356 LastUse = DI->second;
357 if (MO.isDef() && DI->second > LastDef)
358 LastDef = DI->second;
361 return !(LastUse > LastDef && LastUse < Dist);
367bool TwoAddressInstructionImpl::isCopyToReg(MachineInstr &
MI,
Register &SrcReg,
369 bool &IsDstPhys)
const {
372 if (
MI.isCopy() ||
MI.isSubregToReg()) {
373 DstReg =
MI.getOperand(0).getReg();
374 SrcReg =
MI.getOperand(1).getReg();
375 }
else if (
MI.isInsertSubreg()) {
376 DstReg =
MI.getOperand(0).getReg();
377 SrcReg =
MI.getOperand(2).getReg();
387bool TwoAddressInstructionImpl::isPlainlyKilled(
const MachineInstr *
MI,
394 LiveInterval::const_iterator
I = LR.
find(useIdx);
402bool TwoAddressInstructionImpl::isPlainlyKilled(
const MachineInstr *
MI,
417 return isPlainlyKilled(MI, LIS->getRegUnit(U));
421 return MI->killsRegister(
Reg,
nullptr);
426bool TwoAddressInstructionImpl::isPlainlyKilled(
427 const MachineOperand &MO)
const {
448bool TwoAddressInstructionImpl::isKilled(MachineInstr &
MI,
Register Reg,
449 bool allowFalsePositives)
const {
462 if (std::next(Begin) != MRI->
def_end())
465 bool IsSrcPhys, IsDstPhys;
469 if (!isCopyToReg(*
DefMI, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
478 for (
unsigned i = 0,
NumOps =
MI.getNumOperands(); i !=
NumOps; ++i) {
483 if (
MI.isRegTiedToDefOperand(i, &ti)) {
484 DstReg =
MI.getOperand(ti).getReg();
493MachineInstr *TwoAddressInstructionImpl::findOnlyInterestingUse(
495 bool &IsDstPhys)
const {
496 MachineOperand *UseOp =
nullptr;
502 if (
MI->getParent() !=
MBB)
504 if (isPlainlyKilled(
MI,
Reg))
513 if (isCopyToReg(
UseMI, SrcReg, DstReg, IsSrcPhys, IsDstPhys)) {
522 if (
UseMI.isCommutable()) {
525 if (
TII->findCommutedOpIndices(
UseMI, Src1, Src2)) {
526 MachineOperand &MO =
UseMI.getOperand(Src1);
541 while (
Reg.isVirtual()) {
543 if (
SI == RegMap.
end())
547 if (
Reg.isPhysical())
553bool TwoAddressInstructionImpl::regsAreCompatible(
Register RegA,
559 return TRI->regsOverlap(RegA, RegB);
563void TwoAddressInstructionImpl::removeMapRegEntry(
564 const MachineOperand &MO, DenseMap<Register, Register> &RegMap)
const {
567 "removeMapRegEntry must be called with a register or regmask operand.");
570 for (
auto SI : RegMap) {
577 if (
TRI->regsOverlap(ToReg,
Reg))
583 for (
auto SrcReg : Srcs)
584 RegMap.erase(SrcReg);
595void TwoAddressInstructionImpl::removeClobberedSrcRegMap(MachineInstr *
MI) {
608 if (!Dst || Dst.isVirtual())
612 if (regsAreCompatible(Dst,
getMappedReg(Src, SrcRegMap)))
616 for (
const MachineOperand &MO :
MI->operands()) {
618 removeMapRegEntry(MO, SrcRegMap);
626 removeMapRegEntry(MO, SrcRegMap);
631bool TwoAddressInstructionImpl::regOverlapsSet(
632 const SmallVectorImpl<Register> &Set,
Register Reg)
const {
634 if (
TRI->regsOverlap(R,
Reg))
642bool TwoAddressInstructionImpl::isProfitableToCommute(
Register RegA,
647 if (OptLevel == CodeGenOptLevel::None)
668 if (!isPlainlyKilled(
MI, RegC))
685 bool CompB = FromRegB && regsAreCompatible(FromRegB, ToRegA);
686 bool CompC = FromRegC && regsAreCompatible(FromRegC, ToRegA);
692 if ((!FromRegB && CompC) || (FromRegB && !CompB && (!FromRegC || CompC)))
698 if ((!FromRegC && CompB) || (FromRegC && !CompC && (!FromRegB || CompB)))
704 unsigned LastDefC = 0;
705 if (!noUseAfterLastDef(RegC, Dist, LastDefC))
710 unsigned LastDefB = 0;
711 if (!noUseAfterLastDef(RegB, Dist, LastDefB))
737 if (
TII->hasCommutePreference(*
MI, Commute))
742 return LastDefB && LastDefC && LastDefC > LastDefB;
747bool TwoAddressInstructionImpl::commuteInstruction(MachineInstr *
MI,
752 Register RegC =
MI->getOperand(RegCIdx).getReg();
754 MachineInstr *NewMI =
TII->commuteInstruction(*
MI,
false, RegBIdx, RegCIdx);
756 if (NewMI ==
nullptr) {
763 "TargetInstrInfo::commuteInstruction() should not return a new "
764 "instruction unless it was requested.");
769 Register RegA =
MI->getOperand(DstIdx).getReg();
770 SrcRegMap[RegA] = FromRegC;
778bool TwoAddressInstructionImpl::isProfitableToConv3Addr(
Register RegA,
790 return (ToRegA && !regsAreCompatible(FromRegB, ToRegA));
795bool TwoAddressInstructionImpl::convertInstTo3Addr(
798 MachineInstrSpan MIS(mi,
MBB);
799 MachineInstr *NewMI =
TII->convertToThreeAddress(*mi, LIS);
803 for (MachineInstr &
MI : MIS)
804 DistanceMap.
insert(std::make_pair(&
MI, Dist++));
807 LLVM_DEBUG(
dbgs() <<
"2addr: CONVERTED IN-PLACE TO 3-ADDR: " << *mi);
810 dbgs() <<
"2addr: CONVERTING 2-ADDR: " << *mi;
811 dbgs() <<
"2addr: TO 3-ADDR: " << *NewMI;
815 if (
auto OldInstrNum = mi->peekDebugInstrNum()) {
816 assert(mi->getNumExplicitDefs() == 1);
820 unsigned OldIdx = mi->defs().begin()->getOperandNo();
821 unsigned NewIdx = NewMI->
defs().
begin()->getOperandNo();
826 std::make_pair(NewInstrNum, NewIdx));
837 SrcRegMap.
erase(RegA);
838 DstRegMap.
erase(RegB);
844void TwoAddressInstructionImpl::scanUses(
Register DstReg) {
850 while (MachineInstr *
UseMI =
851 findOnlyInterestingUse(
Reg,
MBB, IsCopy, NewReg, IsDstPhys)) {
852 if (IsCopy && !Processed.insert(
UseMI).second)
856 if (DI != DistanceMap.
end())
864 SrcRegMap[NewReg] =
Reg;
869 if (!VirtRegPairs.
empty()) {
871 while (!VirtRegPairs.
empty()) {
873 bool isNew = DstRegMap.
insert(std::make_pair(FromReg, ToReg)).second;
875 assert(DstRegMap[FromReg] == ToReg &&
"Can't map to two dst registers!");
878 bool isNew = DstRegMap.
insert(std::make_pair(DstReg, ToReg)).second;
880 assert(DstRegMap[DstReg] == ToReg &&
"Can't map to two dst registers!");
896void TwoAddressInstructionImpl::processCopy(MachineInstr *
MI) {
897 if (Processed.count(
MI))
900 bool IsSrcPhys, IsDstPhys;
902 if (!isCopyToReg(*
MI, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
905 if (IsDstPhys && !IsSrcPhys) {
906 DstRegMap.
insert(std::make_pair(SrcReg, DstReg));
907 }
else if (!IsDstPhys && IsSrcPhys) {
908 bool isNew = SrcRegMap.
insert(std::make_pair(DstReg, SrcReg)).second;
910 assert(SrcRegMap[DstReg] == SrcReg &&
911 "Can't map to two src physical registers!");
916 Processed.insert(
MI);
922bool TwoAddressInstructionImpl::rescheduleMIBelowKill(
930 MachineInstr *
MI = &*mi;
931 auto DI = DistanceMap.
find(
MI);
932 if (DI == DistanceMap.
end())
937 assert(LI.
end() != LI.
begin() &&
"Reg should not have empty live interval.");
940 LiveInterval::const_iterator
I = LI.
find(MBBEndIdx);
941 if (
I != LI.
end() &&
I->start < MBBEndIdx)
959 bool SeenStore =
true;
960 if (!
MI->isSafeToMove(SeenStore))
970 for (
const MachineOperand &MO :
MI->operands()) {
979 Uses.push_back(MOReg);
980 if (MOReg !=
Reg && isPlainlyKilled(MO))
989 while (End !=
MBB->
end()) {
991 if (End->isCopy() && regOverlapsSet(Defs, End->getOperand(1).getReg()))
992 Defs.
push_back(End->getOperand(0).getReg());
999 unsigned NumVisited = 0;
1002 for (MachineInstr &OtherMI :
make_range(End, KillPos)) {
1004 if (OtherMI.isDebugOrPseudoInstr())
1006 if (NumVisited > 10)
1009 if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
1010 OtherMI.isBranch() || OtherMI.isTerminator())
1013 for (
const MachineOperand &MO : OtherMI.operands()) {
1020 if (regOverlapsSet(
Uses, MOReg))
1023 if (!MO.
isDead() && regOverlapsSet(Defs, MOReg))
1029 if (regOverlapsSet(Defs, MOReg))
1031 bool isKill = isPlainlyKilled(MO);
1032 if (MOReg !=
Reg && ((isKill && regOverlapsSet(
Uses, MOReg)) ||
1033 regOverlapsSet(Kills, MOReg)))
1036 if (MOReg ==
Reg && !isKill)
1040 assert((MOReg !=
Reg || &OtherMI == KillMI) &&
1041 "Found multiple kills of a register in a basic block");
1047 while (Begin !=
MBB->
begin() && std::prev(Begin)->isDebugInstr())
1059 if (!CopyMI.isDebugOrPseudoInstr())
1061 InsertPos = &CopyMI;
1068 DistanceMap.
erase(DI);
1079bool TwoAddressInstructionImpl::isDefTooClose(
Register Reg,
unsigned Dist,
1087 if (DDI == DistanceMap.
end())
1089 unsigned DefDist = DDI->second;
1090 assert(Dist > DefDist &&
"Visited def already?");
1100bool TwoAddressInstructionImpl::rescheduleKillAboveMI(
1108 MachineInstr *
MI = &*mi;
1109 auto DI = DistanceMap.
find(
MI);
1110 if (DI == DistanceMap.
end())
1115 assert(LI.
end() != LI.
begin() &&
"Reg should not have empty live interval.");
1118 LiveInterval::const_iterator
I = LI.
find(MBBEndIdx);
1119 if (
I != LI.
end() &&
I->start < MBBEndIdx)
1124 if (!KillMI ||
MI == KillMI)
1132 bool IsCopySrcPhys, IsCopyDstPhys;
1137 if (!isCopyToReg(*KillMI, CopySrcReg, CopyDstReg, IsCopySrcPhys,
1141 if (CopySrcReg !=
Reg || IsCopySrcPhys || !IsCopyDstPhys)
1149 bool SeenStore =
true;
1157 for (
const MachineOperand &MO : KillMI->
operands()) {
1164 if (isDefTooClose(MOReg, DI->second,
MI))
1166 bool isKill = isPlainlyKilled(MO);
1167 if (MOReg ==
Reg && !isKill)
1169 Uses.push_back(MOReg);
1170 if (isKill && MOReg !=
Reg)
1180 unsigned NumVisited = 0;
1181 for (MachineInstr &OtherMI :
1184 if (OtherMI.isDebugOrPseudoInstr())
1186 if (NumVisited > 10)
1189 if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
1190 OtherMI.isBranch() || OtherMI.isTerminator())
1194 for (
const MachineOperand &MO : OtherMI.operands()) {
1201 if (regOverlapsSet(Defs, MOReg))
1205 if (regOverlapsSet(Kills, MOReg))
1208 if (&OtherMI !=
MI && MOReg ==
Reg && !isPlainlyKilled(MO))
1217 if (regOverlapsSet(
Uses, MOReg))
1219 if (MOReg.
isPhysical() && regOverlapsSet(LiveDefs, MOReg))
1228 while (InsertPos !=
MBB->
begin() && std::prev(InsertPos)->isDebugInstr())
1232 while (std::prev(From)->isDebugInstr())
1236 nmi = std::prev(InsertPos);
1237 DistanceMap.
erase(DI);
1258bool TwoAddressInstructionImpl::tryInstructionCommute(MachineInstr *
MI,
1263 if (!
MI->isCommutable())
1266 bool MadeChange =
false;
1267 Register DstOpReg =
MI->getOperand(DstOpIdx).getReg();
1268 Register BaseOpReg =
MI->getOperand(BaseOpIdx).getReg();
1269 unsigned OpsNum =
MI->getDesc().getNumOperands();
1270 unsigned OtherOpIdx =
MI->getDesc().getNumDefs();
1271 for (; OtherOpIdx < OpsNum; OtherOpIdx++) {
1276 if (OtherOpIdx == BaseOpIdx || !
MI->getOperand(OtherOpIdx).isReg() ||
1277 !
TII->findCommutedOpIndices(*
MI, BaseOpIdx, OtherOpIdx))
1280 Register OtherOpReg =
MI->getOperand(OtherOpIdx).getReg();
1281 bool AggressiveCommute =
false;
1285 bool OtherOpKilled = isKilled(*
MI, OtherOpReg,
false);
1286 bool DoCommute = !BaseOpKilled && OtherOpKilled;
1289 isProfitableToCommute(DstOpReg, BaseOpReg, OtherOpReg,
MI, Dist)) {
1291 AggressiveCommute =
true;
1295 if (DoCommute && commuteInstruction(
MI, DstOpIdx, BaseOpIdx, OtherOpIdx,
1299 if (AggressiveCommute)
1306 BaseOpReg = OtherOpReg;
1307 BaseOpKilled = OtherOpKilled;
1310 OpsNum =
MI->getDesc().getNumOperands();
1323bool TwoAddressInstructionImpl::tryInstructionTransform(
1325 unsigned SrcIdx,
unsigned DstIdx,
unsigned &Dist,
bool shouldOnlyCommute) {
1326 if (OptLevel == CodeGenOptLevel::None)
1329 MachineInstr &
MI = *mi;
1330 Register regA =
MI.getOperand(DstIdx).getReg();
1331 Register regB =
MI.getOperand(SrcIdx).getReg();
1333 assert(regB.
isVirtual() &&
"cannot make instruction into two-address form");
1334 bool regBKilled = isKilled(
MI, regB,
true);
1339 bool Commuted = tryInstructionCommute(&
MI, DstIdx, SrcIdx, regBKilled, Dist);
1352 if (Commuted && !ConvertibleTo3Addr)
1355 if (shouldOnlyCommute)
1368 regB =
MI.getOperand(SrcIdx).getReg();
1369 regBKilled = isKilled(
MI, regB,
true);
1372 if (ConvertibleTo3Addr) {
1375 if (!regBKilled || isProfitableToConv3Addr(regA, regB)) {
1377 if (convertInstTo3Addr(mi, nmi, regA, regB, Dist)) {
1378 ++NumConvertedTo3Addr;
1403 if (
MI.mayLoad() && !regBKilled) {
1405 unsigned LoadRegIndex;
1407 TII->getOpcodeAfterMemoryUnfold(
MI.getOpcode(),
1412 const MCInstrDesc &UnfoldMCID =
TII->get(NewOpc);
1417 TII->getRegClass(UnfoldMCID, LoadRegIndex));
1419 SmallVector<MachineInstr *, 2> NewMIs;
1420 if (!
TII->unfoldMemoryOperand(*MF,
MI,
Reg,
1427 "Unfolded a load into multiple instructions!");
1429 NewMIs[1]->addRegisterKilled(
Reg,
TRI);
1435 DistanceMap.
insert(std::make_pair(NewMIs[0], Dist++));
1436 DistanceMap.
insert(std::make_pair(NewMIs[1], Dist));
1439 <<
"2addr: NEW INST: " << *NewMIs[1]);
1442 unsigned NewDstIdx =
1443 NewMIs[1]->findRegisterDefOperandIdx(regA,
nullptr);
1444 unsigned NewSrcIdx =
1445 NewMIs[1]->findRegisterUseOperandIdx(regB,
nullptr);
1447 bool TransformResult =
1448 tryInstructionTransform(NewMI, mi, NewSrcIdx, NewDstIdx, Dist,
true);
1449 (void)TransformResult;
1450 assert(!TransformResult &&
1451 "tryInstructionTransform() should return false.");
1452 if (NewMIs[1]->getOperand(NewSrcIdx).isKill()) {
1457 for (
const MachineOperand &MO :
MI.operands()) {
1465 MI.eraseFromParent();
1489 NewMIs[0]->eraseFromParent();
1490 NewMIs[1]->eraseFromParent();
1491 DistanceMap.
erase(NewMIs[0]);
1492 DistanceMap.
erase(NewMIs[1]);
1505bool TwoAddressInstructionImpl::collectTiedOperands(
1506 MachineInstr *
MI, TiedOperandMap &TiedOperands) {
1507 bool AnyOps =
false;
1508 unsigned NumOps =
MI->getNumOperands();
1510 for (
unsigned SrcIdx = 0; SrcIdx <
NumOps; ++SrcIdx) {
1511 unsigned DstIdx = 0;
1512 if (!
MI->isRegTiedToDefOperand(SrcIdx, &DstIdx))
1515 MachineOperand &SrcMO =
MI->getOperand(SrcIdx);
1516 MachineOperand &DstMO =
MI->getOperand(DstIdx);
1520 if (SrcReg == DstReg)
1523 assert(SrcReg && SrcMO.
isUse() &&
"two address instruction invalid");
1537 TiedOperands[SrcReg].push_back(std::make_pair(SrcIdx, DstIdx));
1544void TwoAddressInstructionImpl::processTiedPairs(MachineInstr *
MI,
1545 TiedPairList &TiedPairs,
1547 bool IsEarlyClobber =
llvm::any_of(TiedPairs, [
MI](
auto const &TP) {
1548 return MI->getOperand(TP.second).isEarlyClobber();
1551 bool RemovedKillFlag =
false;
1552 bool AllUsesCopied =
true;
1554 SlotIndex LastCopyIdx;
1556 unsigned SubRegB = 0;
1557 for (
auto &TP : TiedPairs) {
1558 unsigned SrcIdx = TP.first;
1559 unsigned DstIdx = TP.second;
1561 const MachineOperand &DstMO =
MI->getOperand(DstIdx);
1566 RegB =
MI->getOperand(SrcIdx).getReg();
1567 SubRegB =
MI->getOperand(SrcIdx).getSubReg();
1573 AllUsesCopied =
false;
1576 LastCopiedReg = RegA;
1578 assert(RegB.
isVirtual() &&
"cannot make instruction into two-address form");
1584 for (
unsigned i = 0; i !=
MI->getNumOperands(); ++i)
1586 !
MI->getOperand(i).isReg() ||
1587 MI->getOperand(i).getReg() != RegA);
1591 MachineInstrBuilder MIB =
BuildMI(*
MI->getParent(),
MI,
MI->getDebugLoc(),
1592 TII->get(TargetOpcode::COPY), RegA);
1595 MIB.
addReg(RegB, {}, SubRegB);
1601 "tied subregister must be a truncation");
1606 &&
"tied subregister must be a truncation");
1613 DistanceMap.
insert(std::make_pair(&*PrevMI, Dist));
1614 DistanceMap[
MI] = ++Dist;
1624 LI.
addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1627 S.addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1630 for (MCRegUnit Unit :
TRI->regunits(RegA)) {
1634 LR->
addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1642 MachineOperand &MO =
MI->getOperand(SrcIdx);
1644 "inconsistent operand info for 2-reg pass");
1645 if (isPlainlyKilled(MO)) {
1647 RemovedKillFlag =
true;
1660 if (
MI->isBundle()) {
1664 "tied subregister uses in bundled instructions not supported");
1671 if (AllUsesCopied) {
1674 for (MachineOperand &MO :
MI->all_uses()) {
1675 if (MO.
getReg() == RegB) {
1676 if (MO.
getSubReg() == SubRegB && !IsEarlyClobber) {
1677 if (isPlainlyKilled(MO)) {
1679 RemovedKillFlag =
true;
1681 MO.
setReg(LastCopiedReg);
1684 RemainingUses |=
TRI->getSubRegIndexLaneMask(MO.
getSubReg());
1689 if (RemovedKillFlag && RemainingUses.
none())
1690 SrcRegMap[LastCopiedReg] = RegB;
1695 auto Shrink = [=](
LiveRange &LR, LaneBitmask LaneMask) {
1699 if ((LaneMask & RemainingUses).
any())
1703 S->
end = LastCopyIdx;
1708 bool ShrinkLI =
true;
1710 ShrinkLI &= Shrink(S, S.LaneMask);
1714 }
else if (RemovedKillFlag) {
1719 for (MachineOperand &MO :
MI->all_uses()) {
1720 if (MO.
getReg() == RegB) {
1735bool TwoAddressInstructionImpl::processStatepoint(
1736 MachineInstr *
MI, TiedOperandMap &TiedOperands) {
1738 bool NeedCopy =
false;
1739 for (
auto &TO : TiedOperands) {
1741 if (TO.second.size() != 1) {
1746 unsigned DstIdx = TO.second[0].second;
1748 MachineOperand &DstMO =
MI->getOperand(DstIdx);
1751 assert(RegB ==
MI->getOperand(TO.second[0].first).getReg());
1764 if (DefLI.overlaps(UseLI)) {
1766 <<
" UseLI overlaps with DefLI\n");
1774 <<
" to register class of " <<
printReg(RegA,
TRI, 0)
1786 for (
const VNInfo *VNI :
Other.valnos) {
1790 for (
auto &S :
Other) {
1791 VNInfo *VNI = NewVNIs[S.
valno->
id];
1792 LiveRange::Segment NewSeg(S.
start, S.
end, VNI);
1802bool TwoAddressInstructionImpl::run() {
1803 bool MadeChange =
false;
1805 LLVM_DEBUG(
dbgs() <<
"********** REWRITING TWO-ADDR INSTRS **********\n");
1814 TiedOperandMap TiedOperands;
1815 for (MachineBasicBlock &
MBBI : *MF) {
1818 DistanceMap.
clear();
1826 if (mi->isDebugInstr()) {
1833 if (mi->isRegSequence()) {
1834 eliminateRegSequence(mi);
1838 DistanceMap.
insert(std::make_pair(&*mi, ++Dist));
1844 if (!collectTiedOperands(&*mi, TiedOperands)) {
1845 removeClobberedSrcRegMap(&*mi);
1850 ++NumTwoAddressInstrs;
1857 if (TiedOperands.size() == 1) {
1858 SmallVectorImpl<std::pair<unsigned, unsigned>> &TiedPairs
1859 = TiedOperands.begin()->second;
1860 if (TiedPairs.
size() == 1) {
1861 unsigned SrcIdx = TiedPairs[0].first;
1862 unsigned DstIdx = TiedPairs[0].second;
1863 Register SrcReg = mi->getOperand(SrcIdx).getReg();
1864 Register DstReg = mi->getOperand(DstIdx).getReg();
1865 if (SrcReg != DstReg &&
1866 tryInstructionTransform(mi, nmi, SrcIdx, DstIdx, Dist,
false)) {
1869 TiedOperands.clear();
1870 removeClobberedSrcRegMap(&*mi);
1877 if (mi->getOpcode() == TargetOpcode::STATEPOINT &&
1878 processStatepoint(&*mi, TiedOperands)) {
1879 TiedOperands.clear();
1886 for (
auto &TO : TiedOperands) {
1887 processTiedPairs(&*mi, TO.second, Dist);
1892 if (mi->isInsertSubreg()) {
1895 unsigned SubIdx = mi->getOperand(3).getImm();
1897 LaneBitmask LaneMask =
TRI->getSubRegIndexLaneMask(SubIdx);
1909 mi->removeOperand(3);
1910 assert(mi->getOperand(0).getSubReg() == 0 &&
"Unexpected subreg idx");
1911 mi->getOperand(0).setSubReg(SubIdx);
1912 mi->getOperand(0).setIsUndef(mi->getOperand(1).isUndef());
1913 mi->removeOperand(1);
1914 mi->setDesc(
TII->get(TargetOpcode::COPY));
1924 if ((S.LaneMask & LaneMask).none()) {
1925 LiveRange::iterator DefSeg = S.FindSegmentContaining(Idx);
1926 if (mi->getOperand(0).isUndef()) {
1927 S.removeValNo(DefSeg->valno);
1929 LiveRange::iterator UseSeg = std::prev(DefSeg);
1930 S.MergeValueNumberInto(DefSeg->valno, UseSeg->valno);
1948 TiedOperands.clear();
1949 removeClobberedSrcRegMap(&*mi);
1967void TwoAddressInstructionImpl::eliminateRegSequence(
1969 MachineInstr &
MI = *
MBBI;
1973 VNInfo *DefVN =
nullptr;
1976 for (
unsigned i = 1, e =
MI.getNumOperands(); i < e; i += 2)
1989 unsigned SubReg =
Use.getSubReg();
1991 (!LIS ||
Use.getParent()->hasTiedAndOtherReadOf(DstReg, SubReg)))
1992 KeepLanes |=
TRI->getSubRegIndexLaneMask(SubReg);
1996 bool DefEmitted =
false;
1997 for (
unsigned i = 1, e =
MI.getNumOperands(); i < e; i += 2) {
1998 MachineOperand &UseMO =
MI.getOperand(i);
2000 unsigned SubIdx =
MI.getOperand(i+1).getImm();
2003 LaneBitmask LaneMask =
TRI->getSubRegIndexLaneMask(SubIdx);
2004 if ((KeepLanes & LaneMask).
none()) {
2005 UndefLanes |= LaneMask;
2012 bool isKill = UseMO.
isKill();
2014 for (
unsigned j = i + 2;
j <
e;
j += 2)
2015 if (
MI.getOperand(j).getReg() == SrcReg) {
2016 MI.getOperand(j).setIsKill();
2023 MachineInstr *CopyMI =
BuildMI(*
MI.getParent(),
MI,
MI.getDebugLoc(),
2024 TII->get(TargetOpcode::COPY))
2025 .
addReg(DstReg, RegState::Define, SubIdx)
2045 MI.setDesc(
TII->get(TargetOpcode::IMPLICIT_DEF));
2046 for (
int j =
MI.getNumOperands() - 1, ee = 0; j > ee; --j)
2047 MI.removeOperand(j);
2059 for (MachineOperand &UseOp : MRI->
use_operands(DstReg)) {
2061 if (UseOp.
isUndef() || !SubReg)
2067 LaneBitmask LaneMask =
TRI->getSubRegIndexLaneMask(SubReg);
2068 if ((UndefLanes & LaneMask).
any())
2077 MI.eraseFromParent();
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator MBBI
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This file defines the DenseMap class.
const HexagonInstrInfo * TII
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
Register const TargetRegisterInfo * TRI
Promote Memory to Register
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Remove Loads Into Fake Uses
SI Optimize VGPR LiveRange
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
static bool isTwoAddrUse(MachineInstr &MI, Register Reg, Register &DstReg)
Return true if the specified MI uses the specified register as a two-address use.
static bool getTiedUse(Register DefReg, MachineInstr *MI, const TargetRegisterInfo *TRI, unsigned &TiedOpIdx)
static MCRegister getMappedReg(Register Reg, DenseMap< Register, Register > &RegMap)
Return the physical register the specified virtual register might be mapped to.
static cl::opt< bool > EnableRescheduling("twoaddr-reschedule", cl::desc("Coalesce copies by rescheduling (default=true)"), cl::init(true), cl::Hidden)
static cl::opt< bool > AnalyzeRevCopyTied("twoaddr-analyze-revcopy-tied", cl::desc("Analyze tied operands when looking for reversed copy chain"), cl::init(true), cl::Hidden)
static cl::opt< unsigned > MaxDataFlowEdge("dataflow-edge-limit", cl::Hidden, cl::init(10), cl::desc("Maximum number of dataflow edges to traverse when evaluating " "the benefit of commuting operands"))
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
AnalysisUsage & addUsedIfAvailable()
Add the specified Pass class to the set of analyses used by this pass.
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
Represents analyses that only rely on functions' control flow.
iterator find(const_arg_type_t< KeyT > Val)
bool erase(const KeyT &Val)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
bool hasOptNone() const
Do not optimize this function (-O0).
unsigned getInstrLatency(const InstrItineraryData *ItinData, const MachineInstr &MI, unsigned *PredCost=nullptr) const override
Compute the instruction latency of a given instruction.
Itinerary data supplied by a subtarget to be used by a target.
bool hasSubRanges() const
Returns true if subregister liveness information is available.
iterator_range< subrange_iterator > subranges()
LLVM_ABI void refineSubRanges(BumpPtrAllocator &Allocator, LaneBitmask LaneMask, std::function< void(LiveInterval::SubRange &)> Apply, const SlotIndexes &Indexes, const TargetRegisterInfo &TRI, unsigned ComposeSubRegIdx=0)
Refines the subranges to support LaneMask.
LLVM_ABI void repairIntervalsInRange(MachineBasicBlock *MBB, MachineBasicBlock::iterator Begin, MachineBasicBlock::iterator End, ArrayRef< Register > OrigRegs)
Update live intervals for instructions in a range of iterators.
void removeAllRegUnitsForPhysReg(MCRegister Reg)
Remove associated live ranges for the register units associated with Reg.
bool hasInterval(Register Reg) const
MachineInstr * getInstructionFromIndex(SlotIndex index) const
Returns the instruction associated with the given index.
SlotIndex InsertMachineInstrInMaps(MachineInstr &MI)
LLVM_ABI void handleMove(MachineInstr &MI, bool UpdateFlags=false)
Call this method to notify LiveIntervals that instruction MI has been moved within a basic block.
SlotIndexes * getSlotIndexes() const
SlotIndex getInstructionIndex(const MachineInstr &Instr) const
Returns the base index of the given instruction.
void RemoveMachineInstrFromMaps(MachineInstr &MI)
VNInfo::Allocator & getVNInfoAllocator()
SlotIndex getMBBEndIdx(const MachineBasicBlock *mbb) const
Return the last index in the given basic block.
LiveInterval & getInterval(Register Reg)
void removeInterval(Register Reg)
Interval removal.
bool isNotInMIMap(const MachineInstr &Instr) const
Returns true if the specified machine instr has been removed or was never entered in the map.
LiveRange * getCachedRegUnit(MCRegUnit Unit)
Return the live range for register unit Unit if it has already been computed, or nullptr if it hasn't...
LLVM_ABI bool shrinkToUses(LiveInterval *li, SmallVectorImpl< MachineInstr * > *dead=nullptr)
After removing some uses of a register, shrink its live range to just the remaining uses.
LiveInterval & createAndComputeVirtRegInterval(Register Reg)
VNInfo * valueOut() const
Return the value leaving the instruction, if any.
This class represents the liveness of a register, stack slot, etc.
LLVM_ABI iterator addSegment(Segment S)
Add the specified Segment to this range, merging segments as appropriate.
const Segment * getSegmentContaining(SlotIndex Idx) const
Return the segment that contains the specified index, or null if there is none.
VNInfo * createValueCopy(const VNInfo *orig, VNInfo::Allocator &VNInfoAllocator)
Create a copy of the given value.
LiveQueryResult Query(SlotIndex Idx) const
Query Liveness at Idx.
bool hasAtLeastOneValue() const
VNInfo * getNextValue(SlotIndex Def, VNInfo::Allocator &VNInfoAllocator)
getNextValue - Create a new value number and return it.
VNInfo * getVNInfoAt(SlotIndex Idx) const
getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.
LLVM_ABI iterator find(SlotIndex Pos)
find - Return an iterator pointing to the first segment that ends after Pos, or end().
unsigned getNumDefs() const
Return the number of MachineOperands that are register definitions.
Wrapper class representing physical registers. Should be passed by value.
An RAII based helper class to modify MachineFunctionProperties when running pass.
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
MachineInstrBundleIterator< MachineInstr, true > reverse_iterator
LLVM_ABI instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
MachineInstrBundleIterator< MachineInstr > iterator
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
void makeDebugValueSubstitution(DebugInstrOperandPair, DebugInstrOperandPair, unsigned SubReg=0)
Create a substitution between one <instr,operand> value to a different, new value.
Function & getFunction()
Return the LLVM function that this machine code represents.
const MachineFunctionProperties & getProperties() const
Get the function properties.
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & add(const MachineOperand &MO) const
Representation of each machine instruction.
mop_range defs()
Returns all explicit operands that are register definitions.
bool isTerminator(QueryType Type=AnyInBundle) const
Returns true if this instruction part of the terminator for a basic block.
bool isCopyLike() const
Return true if the instruction behaves like a copy.
bool isCall(QueryType Type=AnyInBundle) const
LLVM_ABI bool isSafeToMove(bool &SawStore) const
Return true if it is safe to move this instruction.
bool isBranch(QueryType Type=AnyInBundle) const
Returns true if this is a conditional, unconditional, or indirect branch.
LLVM_ABI bool hasUnmodeledSideEffects() const
Return true if this instruction has side effects that are not modeled by mayLoad / mayStore,...
LLVM_ABI unsigned getNumExplicitDefs() const
Returns the number of non-implicit definitions.
LLVM_ABI unsigned getDebugInstrNum()
Fetch the instruction number of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
MachineOperand class - Representation of each machine instruction operand.
void setSubReg(unsigned subReg)
unsigned getSubReg() const
LLVM_ABI unsigned getOperandNo() const
Returns the index of this operand in the instruction that it belongs to.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
bool isRegMask() const
isRegMask - Tests if this is a MO_RegisterMask operand.
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
void setIsKill(bool Val=true)
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
void setIsUndef(bool Val=true)
bool isEarlyClobber() const
Register getReg() const
getReg - Returns the register number.
static bool clobbersPhysReg(const uint32_t *RegMask, MCRegister PhysReg)
clobbersPhysReg - Returns true if this RegMask clobbers PhysReg.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
iterator_range< reg_iterator > reg_operands(Register Reg) const
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
iterator_range< def_instr_iterator > def_instructions(Register Reg) const
iterator_range< use_nodbg_iterator > use_nodbg_operands(Register Reg) const
bool isReserved(MCRegister PhysReg) const
isReserved - Returns true when PhysReg is a reserved register.
def_iterator def_begin(Register RegNo) const
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
bool hasOneUse(Register RegNo) const
hasOneUse - Return true if there is exactly one instruction using the specified register.
bool shouldTrackSubRegLiveness(const TargetRegisterClass &RC) const
Returns true if liveness for register class RC should be tracked at the subregister level.
defusechain_iterator< false, true, false, true, false > def_iterator
def_iterator/def_begin/def_end - Walk all defs of the specified register.
static def_iterator def_end()
LLVM_ABI const TargetRegisterClass * constrainRegClass(Register Reg, const TargetRegisterClass *RC, unsigned MinNumRegs=0)
constrainRegClass - Constrain the register class of the specified virtual register to be a common sub...
iterator_range< use_iterator > use_operands(Register Reg) const
LLVM_ABI void replaceRegWith(Register FromReg, Register ToReg)
replaceRegWith - Replace all instances of FromReg with ToReg in the machine function.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Wrapper class representing virtual and physical registers.
MCRegister asMCReg() const
Utility to check-convert this value to a MCRegister.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
static bool isSameInstr(SlotIndex A, SlotIndex B)
isSameInstr - Return true if A and B refer to the same instruction.
SlotIndex getBaseIndex() const
Returns the base index for associated with this index.
SlotIndex getPrevSlot() const
Returns the previous slot in the index list.
SlotIndex getRegSlot(bool EC=false) const
Returns the register use/def slot in the current instruction for a normal or early-clobber def.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
TargetInstrInfo - Interface to description of machine instruction set.
static const unsigned CommuteAnyOperandIndex
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
BumpPtrAllocator Allocator
unsigned id
The ID number of this value.
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
constexpr bool any(E Val)
initializer< Ty > init(const Ty &Val)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
NodeAddr< DefNode * > Def
NodeAddr< UseNode * > Use
NodeAddr< FuncNode * > Func
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
IterT skipDebugInstructionsForward(IterT It, IterT End, bool SkipPseudoOp=true)
Increment It until it points to a non-debug instruction or to End and return the resulting iterator.
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
CodeGenOptLevel
Code generation optimization level.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
iterator_range< MIBundleOperands > mi_bundle_ops(MachineInstr &MI)
LLVM_ABI char & TwoAddressInstructionPassID
TwoAddressInstruction - This pass reduces two-address instructions to use two operands.
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
MCRegisterClass TargetRegisterClass
static constexpr LaneBitmask getAll()
constexpr bool none() const
constexpr bool any() const
static constexpr LaneBitmask getNone()
bool shouldSkipOptimizationForOptBisect(IRUnitRef IR)