67#define DEBUG_TYPE "twoaddressinstruction"
69STATISTIC(NumTwoAddressInstrs,
"Number of two-address instructions");
70STATISTIC(NumCommuted ,
"Number of instructions commuted to coalesce");
71STATISTIC(NumAggrCommuted ,
"Number of instructions aggressively commuted");
72STATISTIC(NumConvertedTo3Addr,
"Number of instructions promoted to 3-address");
73STATISTIC(NumReSchedUps,
"Number of instructions re-scheduled up");
74STATISTIC(NumReSchedDowns,
"Number of instructions re-scheduled down");
79 cl::desc(
"Coalesce copies by rescheduling (default=true)"),
83 "twoaddr-analyze-revcopy-tied",
84 cl::desc(
"Analyze tied operands when looking for reversed copy chain"),
91 cl::desc(
"Maximum number of dataflow edges to traverse when evaluating "
92 "the benefit of commuting operands"));
96class TwoAddressInstructionImpl {
129 bool noUseAfterLastDef(
Register Reg,
unsigned Dist,
unsigned &LastDef);
132 bool &IsSrcPhys,
bool &IsDstPhys)
const;
142 bool &IsDstPhys)
const;
157 unsigned RegBIdx,
unsigned RegCIdx,
unsigned Dist);
174 unsigned SrcIdx,
unsigned DstIdx,
175 unsigned &Dist,
bool shouldOnlyCommute);
190 void processTiedPairs(
MachineInstr *
MI, TiedPairList&,
unsigned &Dist);
192 bool processStatepoint(
MachineInstr *
MI, TiedOperandMap &TiedOperands);
207 TwoAddressInstructionLegacyPass() : MachineFunctionPass(ID) {}
211 TwoAddressInstructionImpl Impl(MF,
this);
215 Impl.setOptLevel(CodeGenOptLevel::None);
219 void getAnalysisUsage(AnalysisUsage &AU)
const override {
238 TwoAddressInstructionImpl Impl(MF, MFAM, LIS);
259char TwoAddressInstructionLegacyPass::ID = 0;
264 "Two-Address instruction pass",
false,
false)
266TwoAddressInstructionImpl::TwoAddressInstructionImpl(
269 : MF(&Func),
TII(Func.getSubtarget().getInstrInfo()),
270 TRI(Func.getSubtarget().getRegisterInfo()),
271 InstrItins(Func.getSubtarget().getInstrItineraryData()),
272 MRI(&Func.getRegInfo()),
274 OptLevel(Func.getTarget().getOptLevel()) {}
276TwoAddressInstructionImpl::TwoAddressInstructionImpl(
MachineFunction &Func,
278 : MF(&
Func),
TII(
Func.getSubtarget().getInstrInfo()),
279 TRI(
Func.getSubtarget().getRegisterInfo()),
280 InstrItins(
Func.getSubtarget().getInstrItineraryData()),
281 MRI(&
Func.getRegInfo()), OptLevel(
Func.getTarget().getOptLevel()) {
283 LV = LVWrapper ? &LVWrapper->
getLV() :
nullptr;
285 LIS = LISWrapper ? &LISWrapper->
getLIS() :
nullptr;
290TwoAddressInstructionImpl::getSingleDef(
Register Reg,
292 MachineInstr *Ret =
nullptr;
294 if (
DefMI.getParent() != BB ||
DefMI.isDebugValue())
298 else if (Ret != &
DefMI)
306 int DefRegIdx =
MI->findRegisterDefOperandIdx(DefReg,
TRI);
309 return MI->isRegTiedToUseOperand(DefRegIdx, &TiedOpIdx);
319bool TwoAddressInstructionImpl::isRevCopyChain(
Register FromReg,
Register ToReg,
322 for (
int i = 0; i < Maxlen; i++) {
323 MachineInstr *
Def = getSingleDef(TmpReg,
MBB);
328 TmpReg =
Def->getOperand(1).getReg();
329 else if (
unsigned TiedOpIdx;
331 Register TiedUseReg =
Def->getOperand(TiedOpIdx).getReg();
334 if (TiedUseReg == TmpReg)
350bool TwoAddressInstructionImpl::noUseAfterLastDef(
Register Reg,
unsigned Dist,
353 unsigned LastUse = Dist;
355 MachineInstr *
MI = MO.getParent();
356 if (
MI->getParent() !=
MBB ||
MI->isDebugValue())
358 auto DI = DistanceMap.
find(
MI);
359 if (DI == DistanceMap.
end())
361 if (MO.isUse() && DI->second < LastUse)
362 LastUse = DI->second;
363 if (MO.isDef() && DI->second > LastDef)
364 LastDef = DI->second;
367 return !(LastUse > LastDef && LastUse < Dist);
373bool TwoAddressInstructionImpl::isCopyToReg(MachineInstr &
MI,
Register &SrcReg,
375 bool &IsDstPhys)
const {
378 if (
MI.isCopy() ||
MI.isSubregToReg()) {
379 DstReg =
MI.getOperand(0).getReg();
380 SrcReg =
MI.getOperand(1).getReg();
381 }
else if (
MI.isInsertSubreg()) {
382 DstReg =
MI.getOperand(0).getReg();
383 SrcReg =
MI.getOperand(2).getReg();
393bool TwoAddressInstructionImpl::isPlainlyKilled(
const MachineInstr *
MI,
400 LiveInterval::const_iterator
I = LR.
find(useIdx);
401 assert(
I != LR.
end() &&
"Reg must be live-in to use.");
407bool TwoAddressInstructionImpl::isPlainlyKilled(
const MachineInstr *
MI,
422 return isPlainlyKilled(MI, LIS->getRegUnit(U));
426 return MI->killsRegister(
Reg,
nullptr);
431bool TwoAddressInstructionImpl::isPlainlyKilled(
432 const MachineOperand &MO)
const {
453bool TwoAddressInstructionImpl::isKilled(MachineInstr &
MI,
Register Reg,
454 bool allowFalsePositives)
const {
467 if (std::next(Begin) != MRI->
def_end())
470 bool IsSrcPhys, IsDstPhys;
474 if (!isCopyToReg(*
DefMI, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
483 for (
unsigned i = 0,
NumOps =
MI.getNumOperands(); i !=
NumOps; ++i) {
488 if (
MI.isRegTiedToDefOperand(i, &ti)) {
489 DstReg =
MI.getOperand(ti).getReg();
498MachineInstr *TwoAddressInstructionImpl::findOnlyInterestingUse(
500 bool &IsDstPhys)
const {
501 MachineOperand *UseOp =
nullptr;
507 if (
MI->getParent() !=
MBB)
509 if (isPlainlyKilled(
MI,
Reg))
518 if (isCopyToReg(
UseMI, SrcReg, DstReg, IsSrcPhys, IsDstPhys)) {
527 if (
UseMI.isCommutable()) {
530 if (
TII->findCommutedOpIndices(
UseMI, Src1, Src2)) {
531 MachineOperand &MO =
UseMI.getOperand(Src1);
546 while (
Reg.isVirtual()) {
548 if (
SI == RegMap.
end())
552 if (
Reg.isPhysical())
558bool TwoAddressInstructionImpl::regsAreCompatible(
Register RegA,
564 return TRI->regsOverlap(RegA, RegB);
568void TwoAddressInstructionImpl::removeMapRegEntry(
569 const MachineOperand &MO, DenseMap<Register, Register> &RegMap)
const {
572 "removeMapRegEntry must be called with a register or regmask operand.");
575 for (
auto SI : RegMap) {
582 if (
TRI->regsOverlap(ToReg,
Reg))
588 for (
auto SrcReg : Srcs)
589 RegMap.erase(SrcReg);
600void TwoAddressInstructionImpl::removeClobberedSrcRegMap(MachineInstr *
MI) {
613 if (!Dst || Dst.isVirtual())
617 if (regsAreCompatible(Dst,
getMappedReg(Src, SrcRegMap)))
621 for (
const MachineOperand &MO :
MI->operands()) {
623 removeMapRegEntry(MO, SrcRegMap);
631 removeMapRegEntry(MO, SrcRegMap);
636bool TwoAddressInstructionImpl::regOverlapsSet(
637 const SmallVectorImpl<Register> &Set,
Register Reg)
const {
639 if (
TRI->regsOverlap(R,
Reg))
647bool TwoAddressInstructionImpl::isProfitableToCommute(
Register RegA,
652 if (OptLevel == CodeGenOptLevel::None)
673 if (!isPlainlyKilled(
MI, RegC))
690 bool CompB = FromRegB && regsAreCompatible(FromRegB, ToRegA);
691 bool CompC = FromRegC && regsAreCompatible(FromRegC, ToRegA);
697 if ((!FromRegB && CompC) || (FromRegB && !CompB && (!FromRegC || CompC)))
703 if ((!FromRegC && CompB) || (FromRegC && !CompC && (!FromRegB || CompB)))
709 unsigned LastDefC = 0;
710 if (!noUseAfterLastDef(RegC, Dist, LastDefC))
715 unsigned LastDefB = 0;
716 if (!noUseAfterLastDef(RegB, Dist, LastDefB))
742 if (
TII->hasCommutePreference(*
MI, Commute))
747 return LastDefB && LastDefC && LastDefC > LastDefB;
752bool TwoAddressInstructionImpl::commuteInstruction(MachineInstr *
MI,
757 Register RegC =
MI->getOperand(RegCIdx).getReg();
759 MachineInstr *NewMI =
TII->commuteInstruction(*
MI,
false, RegBIdx, RegCIdx);
761 if (NewMI ==
nullptr) {
768 "TargetInstrInfo::commuteInstruction() should not return a new "
769 "instruction unless it was requested.");
774 Register RegA =
MI->getOperand(DstIdx).getReg();
775 SrcRegMap[RegA] = FromRegC;
783bool TwoAddressInstructionImpl::isProfitableToConv3Addr(
Register RegA,
795 return (ToRegA && !regsAreCompatible(FromRegB, ToRegA));
800bool TwoAddressInstructionImpl::convertInstTo3Addr(
803 MachineInstrSpan MIS(mi,
MBB);
804 MachineInstr *NewMI =
TII->convertToThreeAddress(*mi, LV, LIS);
808 for (MachineInstr &
MI : MIS)
809 DistanceMap.
insert(std::make_pair(&
MI, Dist++));
812 LLVM_DEBUG(
dbgs() <<
"2addr: CONVERTED IN-PLACE TO 3-ADDR: " << *mi);
815 dbgs() <<
"2addr: CONVERTING 2-ADDR: " << *mi;
816 dbgs() <<
"2addr: TO 3-ADDR: " << *NewMI;
820 if (
auto OldInstrNum = mi->peekDebugInstrNum()) {
821 assert(mi->getNumExplicitDefs() == 1);
825 unsigned OldIdx = mi->defs().begin()->getOperandNo();
826 unsigned NewIdx = NewMI->
defs().
begin()->getOperandNo();
831 std::make_pair(NewInstrNum, NewIdx));
842 SrcRegMap.
erase(RegA);
843 DstRegMap.
erase(RegB);
849void TwoAddressInstructionImpl::scanUses(
Register DstReg) {
855 while (MachineInstr *
UseMI =
856 findOnlyInterestingUse(
Reg,
MBB, IsCopy, NewReg, IsDstPhys)) {
857 if (IsCopy && !Processed.insert(
UseMI).second)
861 if (DI != DistanceMap.
end())
869 SrcRegMap[NewReg] =
Reg;
874 if (!VirtRegPairs.
empty()) {
876 while (!VirtRegPairs.
empty()) {
878 bool isNew = DstRegMap.
insert(std::make_pair(FromReg, ToReg)).second;
880 assert(DstRegMap[FromReg] == ToReg &&
"Can't map to two dst registers!");
883 bool isNew = DstRegMap.
insert(std::make_pair(DstReg, ToReg)).second;
885 assert(DstRegMap[DstReg] == ToReg &&
"Can't map to two dst registers!");
901void TwoAddressInstructionImpl::processCopy(MachineInstr *
MI) {
902 if (Processed.count(
MI))
905 bool IsSrcPhys, IsDstPhys;
907 if (!isCopyToReg(*
MI, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
910 if (IsDstPhys && !IsSrcPhys) {
911 DstRegMap.
insert(std::make_pair(SrcReg, DstReg));
912 }
else if (!IsDstPhys && IsSrcPhys) {
913 bool isNew = SrcRegMap.
insert(std::make_pair(DstReg, SrcReg)).second;
915 assert(SrcRegMap[DstReg] == SrcReg &&
916 "Can't map to two src physical registers!");
921 Processed.insert(
MI);
927bool TwoAddressInstructionImpl::rescheduleMIBelowKill(
935 MachineInstr *
MI = &*mi;
936 auto DI = DistanceMap.
find(
MI);
937 if (DI == DistanceMap.
end())
941 MachineInstr *KillMI =
nullptr;
945 "Reg should not have empty live interval.");
948 LiveInterval::const_iterator
I = LI.
find(MBBEndIdx);
949 if (
I != LI.
end() &&
I->start < MBBEndIdx)
970 bool SeenStore =
true;
971 if (!
MI->isSafeToMove(SeenStore))
981 for (
const MachineOperand &MO :
MI->operands()) {
990 Uses.push_back(MOReg);
991 if (MOReg !=
Reg && isPlainlyKilled(MO))
1000 while (End !=
MBB->
end()) {
1002 if (End->isCopy() && regOverlapsSet(Defs, End->getOperand(1).getReg()))
1003 Defs.
push_back(End->getOperand(0).getReg());
1010 unsigned NumVisited = 0;
1013 for (MachineInstr &OtherMI :
make_range(End, KillPos)) {
1015 if (OtherMI.isDebugOrPseudoInstr())
1017 if (NumVisited > 10)
1020 if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
1021 OtherMI.isBranch() || OtherMI.isTerminator())
1024 for (
const MachineOperand &MO : OtherMI.operands()) {
1031 if (regOverlapsSet(
Uses, MOReg))
1034 if (!MO.
isDead() && regOverlapsSet(Defs, MOReg))
1040 if (regOverlapsSet(Defs, MOReg))
1042 bool isKill = isPlainlyKilled(MO);
1043 if (MOReg !=
Reg && ((isKill && regOverlapsSet(
Uses, MOReg)) ||
1044 regOverlapsSet(Kills, MOReg)))
1047 if (MOReg ==
Reg && !isKill)
1051 assert((MOReg !=
Reg || &OtherMI == KillMI) &&
1052 "Found multiple kills of a register in a basic block");
1058 while (Begin !=
MBB->
begin() && std::prev(Begin)->isDebugInstr())
1067 auto CopyMI =
MBBI++;
1069 if (!CopyMI->isDebugOrPseudoInstr())
1078 DistanceMap.
erase(DI);
1094bool TwoAddressInstructionImpl::isDefTooClose(
Register Reg,
unsigned Dist,
1102 if (DDI == DistanceMap.
end())
1104 unsigned DefDist = DDI->second;
1105 assert(Dist > DefDist &&
"Visited def already?");
1115bool TwoAddressInstructionImpl::rescheduleKillAboveMI(
1123 MachineInstr *
MI = &*mi;
1124 auto DI = DistanceMap.
find(
MI);
1125 if (DI == DistanceMap.
end())
1129 MachineInstr *KillMI =
nullptr;
1133 "Reg should not have empty live interval.");
1136 LiveInterval::const_iterator
I = LI.
find(MBBEndIdx);
1137 if (
I != LI.
end() &&
I->start < MBBEndIdx)
1145 if (!KillMI ||
MI == KillMI)
1153 bool IsCopySrcPhys, IsCopyDstPhys;
1158 if (!isCopyToReg(*KillMI, CopySrcReg, CopyDstReg, IsCopySrcPhys,
1162 if (CopySrcReg !=
Reg || IsCopySrcPhys || !IsCopyDstPhys)
1170 bool SeenStore =
true;
1178 for (
const MachineOperand &MO : KillMI->
operands()) {
1185 if (isDefTooClose(MOReg, DI->second,
MI))
1187 bool isKill = isPlainlyKilled(MO);
1188 if (MOReg ==
Reg && !isKill)
1190 Uses.push_back(MOReg);
1191 if (isKill && MOReg !=
Reg)
1201 unsigned NumVisited = 0;
1202 for (MachineInstr &OtherMI :
1205 if (OtherMI.isDebugOrPseudoInstr())
1207 if (NumVisited > 10)
1210 if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
1211 OtherMI.isBranch() || OtherMI.isTerminator())
1215 for (
const MachineOperand &MO : OtherMI.operands()) {
1222 if (regOverlapsSet(Defs, MOReg))
1226 if (regOverlapsSet(Kills, MOReg))
1229 if (&OtherMI !=
MI && MOReg ==
Reg && !isPlainlyKilled(MO))
1238 if (regOverlapsSet(
Uses, MOReg))
1240 if (MOReg.
isPhysical() && regOverlapsSet(LiveDefs, MOReg))
1249 while (InsertPos !=
MBB->
begin() && std::prev(InsertPos)->isDebugInstr())
1253 while (std::prev(From)->isDebugInstr())
1257 nmi = std::prev(InsertPos);
1258 DistanceMap.
erase(DI);
1284bool TwoAddressInstructionImpl::tryInstructionCommute(MachineInstr *
MI,
1289 if (!
MI->isCommutable())
1292 bool MadeChange =
false;
1293 Register DstOpReg =
MI->getOperand(DstOpIdx).getReg();
1294 Register BaseOpReg =
MI->getOperand(BaseOpIdx).getReg();
1295 unsigned OpsNum =
MI->getDesc().getNumOperands();
1296 unsigned OtherOpIdx =
MI->getDesc().getNumDefs();
1297 for (; OtherOpIdx < OpsNum; OtherOpIdx++) {
1302 if (OtherOpIdx == BaseOpIdx || !
MI->getOperand(OtherOpIdx).isReg() ||
1303 !
TII->findCommutedOpIndices(*
MI, BaseOpIdx, OtherOpIdx))
1306 Register OtherOpReg =
MI->getOperand(OtherOpIdx).getReg();
1307 bool AggressiveCommute =
false;
1311 bool OtherOpKilled = isKilled(*
MI, OtherOpReg,
false);
1312 bool DoCommute = !BaseOpKilled && OtherOpKilled;
1315 isProfitableToCommute(DstOpReg, BaseOpReg, OtherOpReg,
MI, Dist)) {
1317 AggressiveCommute =
true;
1321 if (DoCommute && commuteInstruction(
MI, DstOpIdx, BaseOpIdx, OtherOpIdx,
1325 if (AggressiveCommute)
1332 BaseOpReg = OtherOpReg;
1333 BaseOpKilled = OtherOpKilled;
1336 OpsNum =
MI->getDesc().getNumOperands();
1349bool TwoAddressInstructionImpl::tryInstructionTransform(
1351 unsigned SrcIdx,
unsigned DstIdx,
unsigned &Dist,
bool shouldOnlyCommute) {
1352 if (OptLevel == CodeGenOptLevel::None)
1355 MachineInstr &
MI = *mi;
1356 Register regA =
MI.getOperand(DstIdx).getReg();
1357 Register regB =
MI.getOperand(SrcIdx).getReg();
1359 assert(regB.
isVirtual() &&
"cannot make instruction into two-address form");
1360 bool regBKilled = isKilled(
MI, regB,
true);
1365 bool Commuted = tryInstructionCommute(&
MI, DstIdx, SrcIdx, regBKilled, Dist);
1378 if (Commuted && !ConvertibleTo3Addr)
1381 if (shouldOnlyCommute)
1394 regB =
MI.getOperand(SrcIdx).getReg();
1395 regBKilled = isKilled(
MI, regB,
true);
1398 if (ConvertibleTo3Addr) {
1401 if (!regBKilled || isProfitableToConv3Addr(regA, regB)) {
1403 if (convertInstTo3Addr(mi, nmi, regA, regB, Dist)) {
1404 ++NumConvertedTo3Addr;
1429 if (
MI.mayLoad() && !regBKilled) {
1431 unsigned LoadRegIndex;
1433 TII->getOpcodeAfterMemoryUnfold(
MI.getOpcode(),
1438 const MCInstrDesc &UnfoldMCID =
TII->get(NewOpc);
1443 TII->getRegClass(UnfoldMCID, LoadRegIndex));
1445 SmallVector<MachineInstr *, 2> NewMIs;
1446 if (!
TII->unfoldMemoryOperand(*MF,
MI,
Reg,
1453 "Unfolded a load into multiple instructions!");
1455 NewMIs[1]->addRegisterKilled(
Reg,
TRI);
1461 DistanceMap.
insert(std::make_pair(NewMIs[0], Dist++));
1462 DistanceMap.
insert(std::make_pair(NewMIs[1], Dist));
1465 <<
"2addr: NEW INST: " << *NewMIs[1]);
1468 unsigned NewDstIdx =
1469 NewMIs[1]->findRegisterDefOperandIdx(regA,
nullptr);
1470 unsigned NewSrcIdx =
1471 NewMIs[1]->findRegisterUseOperandIdx(regB,
nullptr);
1473 bool TransformResult =
1474 tryInstructionTransform(NewMI, mi, NewSrcIdx, NewDstIdx, Dist,
true);
1475 (void)TransformResult;
1476 assert(!TransformResult &&
1477 "tryInstructionTransform() should return false.");
1478 if (NewMIs[1]->getOperand(NewSrcIdx).isKill()) {
1482 for (
const MachineOperand &MO :
MI.operands()) {
1486 if (NewMIs[0]->killsRegister(MO.
getReg(),
nullptr))
1491 "Kill missing after load unfold!");
1496 if (NewMIs[1]->registerDefIsDead(MO.
getReg(),
1502 "Dead flag missing after load unfold!");
1513 for (
const MachineOperand &MO :
MI.operands()) {
1521 MI.eraseFromParent();
1537 NewMIs[0]->eraseFromParent();
1538 NewMIs[1]->eraseFromParent();
1539 DistanceMap.
erase(NewMIs[0]);
1540 DistanceMap.
erase(NewMIs[1]);
1553bool TwoAddressInstructionImpl::collectTiedOperands(
1554 MachineInstr *
MI, TiedOperandMap &TiedOperands) {
1555 bool AnyOps =
false;
1556 unsigned NumOps =
MI->getNumOperands();
1558 for (
unsigned SrcIdx = 0; SrcIdx <
NumOps; ++SrcIdx) {
1559 unsigned DstIdx = 0;
1560 if (!
MI->isRegTiedToDefOperand(SrcIdx, &DstIdx))
1563 MachineOperand &SrcMO =
MI->getOperand(SrcIdx);
1564 MachineOperand &DstMO =
MI->getOperand(DstIdx);
1568 if (SrcReg == DstReg)
1571 assert(SrcReg && SrcMO.
isUse() &&
"two address instruction invalid");
1585 TiedOperands[SrcReg].push_back(std::make_pair(SrcIdx, DstIdx));
1592void TwoAddressInstructionImpl::processTiedPairs(MachineInstr *
MI,
1593 TiedPairList &TiedPairs,
1595 bool IsEarlyClobber =
llvm::any_of(TiedPairs, [
MI](
auto const &TP) {
1596 return MI->getOperand(TP.second).isEarlyClobber();
1599 bool RemovedKillFlag =
false;
1600 bool AllUsesCopied =
true;
1602 SlotIndex LastCopyIdx;
1604 unsigned SubRegB = 0;
1605 for (
auto &TP : TiedPairs) {
1606 unsigned SrcIdx = TP.first;
1607 unsigned DstIdx = TP.second;
1609 const MachineOperand &DstMO =
MI->getOperand(DstIdx);
1614 RegB =
MI->getOperand(SrcIdx).getReg();
1615 SubRegB =
MI->getOperand(SrcIdx).getSubReg();
1621 AllUsesCopied =
false;
1624 LastCopiedReg = RegA;
1626 assert(RegB.
isVirtual() &&
"cannot make instruction into two-address form");
1632 for (
unsigned i = 0; i !=
MI->getNumOperands(); ++i)
1634 !
MI->getOperand(i).isReg() ||
1635 MI->getOperand(i).getReg() != RegA);
1639 MachineInstrBuilder MIB =
BuildMI(*
MI->getParent(),
MI,
MI->getDebugLoc(),
1640 TII->get(TargetOpcode::COPY), RegA);
1643 MIB.
addReg(RegB, {}, SubRegB);
1649 "tied subregister must be a truncation");
1654 &&
"tied subregister must be a truncation");
1661 DistanceMap.
insert(std::make_pair(&*PrevMI, Dist));
1662 DistanceMap[
MI] = ++Dist;
1672 LI.
addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1675 S.addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1678 for (MCRegUnit Unit :
TRI->regunits(RegA)) {
1682 LR->
addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1690 MachineOperand &MO =
MI->getOperand(SrcIdx);
1692 "inconsistent operand info for 2-reg pass");
1693 if (isPlainlyKilled(MO)) {
1695 RemovedKillFlag =
true;
1708 if (
MI->isBundle()) {
1712 "tied subregister uses in bundled instructions not supported");
1719 if (AllUsesCopied) {
1722 for (MachineOperand &MO :
MI->all_uses()) {
1723 if (MO.
getReg() == RegB) {
1724 if (MO.
getSubReg() == SubRegB && !IsEarlyClobber) {
1725 if (isPlainlyKilled(MO)) {
1727 RemovedKillFlag =
true;
1729 MO.
setReg(LastCopiedReg);
1732 RemainingUses |=
TRI->getSubRegIndexLaneMask(MO.
getSubReg());
1738 if (RemovedKillFlag && RemainingUses.
none() && LV &&
1745 if (RemovedKillFlag && RemainingUses.
none())
1746 SrcRegMap[LastCopiedReg] = RegB;
1751 auto Shrink = [=](
LiveRange &LR, LaneBitmask LaneMask) {
1755 if ((LaneMask & RemainingUses).
any())
1759 S->
end = LastCopyIdx;
1764 bool ShrinkLI =
true;
1766 ShrinkLI &= Shrink(S, S.LaneMask);
1770 }
else if (RemovedKillFlag) {
1775 for (MachineOperand &MO :
MI->all_uses()) {
1776 if (MO.
getReg() == RegB) {
1791bool TwoAddressInstructionImpl::processStatepoint(
1792 MachineInstr *
MI, TiedOperandMap &TiedOperands) {
1794 bool NeedCopy =
false;
1795 for (
auto &TO : TiedOperands) {
1797 if (TO.second.size() != 1) {
1802 unsigned SrcIdx = TO.second[0].first;
1803 unsigned DstIdx = TO.second[0].second;
1805 MachineOperand &DstMO =
MI->getOperand(DstIdx);
1808 assert(RegB ==
MI->getOperand(SrcIdx).getReg());
1821 if (DefLI.overlaps(UseLI)) {
1823 <<
" UseLI overlaps with DefLI\n");
1832 <<
" not killed by statepoint\n");
1839 <<
" to register class of " <<
printReg(RegA,
TRI, 0)
1851 for (
const VNInfo *VNI :
Other.valnos) {
1855 for (
auto &S :
Other) {
1856 VNInfo *VNI = NewVNIs[S.
valno->
id];
1857 LiveRange::Segment NewSeg(S.
start, S.
end, VNI);
1864 if (
MI->getOperand(SrcIdx).isKill())
1866 LiveVariables::VarInfo &SrcInfo = LV->
getVarInfo(RegB);
1867 LiveVariables::VarInfo &DstInfo = LV->
getVarInfo(RegA);
1870 for (
auto *KillMI : DstInfo.
Kills)
1878bool TwoAddressInstructionImpl::run() {
1879 bool MadeChange =
false;
1881 LLVM_DEBUG(
dbgs() <<
"********** REWRITING TWO-ADDR INSTRS **********\n");
1890 TiedOperandMap TiedOperands;
1891 for (MachineBasicBlock &
MBBI : *MF) {
1894 DistanceMap.
clear();
1902 if (mi->isDebugInstr()) {
1909 if (mi->isRegSequence()) {
1910 eliminateRegSequence(mi);
1914 DistanceMap.
insert(std::make_pair(&*mi, ++Dist));
1920 if (!collectTiedOperands(&*mi, TiedOperands)) {
1921 removeClobberedSrcRegMap(&*mi);
1926 ++NumTwoAddressInstrs;
1933 if (TiedOperands.size() == 1) {
1934 SmallVectorImpl<std::pair<unsigned, unsigned>> &TiedPairs
1935 = TiedOperands.begin()->second;
1936 if (TiedPairs.
size() == 1) {
1937 unsigned SrcIdx = TiedPairs[0].first;
1938 unsigned DstIdx = TiedPairs[0].second;
1939 Register SrcReg = mi->getOperand(SrcIdx).getReg();
1940 Register DstReg = mi->getOperand(DstIdx).getReg();
1941 if (SrcReg != DstReg &&
1942 tryInstructionTransform(mi, nmi, SrcIdx, DstIdx, Dist,
false)) {
1945 TiedOperands.clear();
1946 removeClobberedSrcRegMap(&*mi);
1953 if (mi->getOpcode() == TargetOpcode::STATEPOINT &&
1954 processStatepoint(&*mi, TiedOperands)) {
1955 TiedOperands.clear();
1962 for (
auto &TO : TiedOperands) {
1963 processTiedPairs(&*mi, TO.second, Dist);
1968 if (mi->isInsertSubreg()) {
1971 unsigned SubIdx = mi->getOperand(3).getImm();
1972 mi->removeOperand(3);
1973 assert(mi->getOperand(0).getSubReg() == 0 &&
"Unexpected subreg idx");
1974 mi->getOperand(0).setSubReg(SubIdx);
1975 mi->getOperand(0).setIsUndef(mi->getOperand(1).isUndef());
1976 mi->removeOperand(1);
1977 mi->setDesc(
TII->get(TargetOpcode::COPY));
1987 LaneBitmask LaneMask =
1988 TRI->getSubRegIndexLaneMask(mi->getOperand(0).getSubReg());
1991 if ((S.LaneMask & LaneMask).none()) {
1992 LiveRange::iterator DefSeg = S.FindSegmentContaining(Idx);
1993 if (mi->getOperand(0).isUndef()) {
1994 S.removeValNo(DefSeg->valno);
1996 LiveRange::iterator UseSeg = std::prev(DefSeg);
1997 S.MergeValueNumberInto(DefSeg->valno, UseSeg->valno);
2015 TiedOperands.clear();
2016 removeClobberedSrcRegMap(&*mi);
2034void TwoAddressInstructionImpl::eliminateRegSequence(
2036 MachineInstr &
MI = *
MBBI;
2040 VNInfo *DefVN =
nullptr;
2043 for (
unsigned i = 1, e =
MI.getNumOperands(); i < e; i += 2)
2057 if (
unsigned SubReg =
Use.getSubReg())
2058 UsedLanes |=
TRI->getSubRegIndexLaneMask(SubReg);
2063 bool DefEmitted =
false;
2064 for (
unsigned i = 1, e =
MI.getNumOperands(); i < e; i += 2) {
2065 MachineOperand &UseMO =
MI.getOperand(i);
2067 unsigned SubIdx =
MI.getOperand(i+1).getImm();
2072 LaneBitmask LaneMask =
TRI->getSubRegIndexLaneMask(SubIdx);
2073 if (LIS || (UsedLanes & LaneMask).
none()) {
2074 UndefLanes |= LaneMask;
2081 bool isKill = UseMO.
isKill();
2083 for (
unsigned j = i + 2;
j <
e;
j += 2)
2084 if (
MI.getOperand(j).getReg() == SrcReg) {
2085 MI.getOperand(j).setIsKill();
2092 MachineInstr *CopyMI =
BuildMI(*
MI.getParent(),
MI,
MI.getDebugLoc(),
2093 TII->get(TargetOpcode::COPY))
2094 .
addReg(DstReg, RegState::Define, SubIdx)
2118 MI.setDesc(
TII->get(TargetOpcode::IMPLICIT_DEF));
2119 for (
int j =
MI.getNumOperands() - 1, ee = 0; j > ee; --j)
2120 MI.removeOperand(j);
2128 for (MachineOperand &UseOp : MRI->
use_operands(DstReg)) {
2130 if (UseOp.
isUndef() || !SubReg)
2136 LaneBitmask LaneMask =
TRI->getSubRegIndexLaneMask(SubReg);
2137 if ((UndefLanes & LaneMask).
any())
2146 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 repairIntervalsInRange(MachineBasicBlock *MBB, MachineBasicBlock::iterator Begin, MachineBasicBlock::iterator End, ArrayRef< Register > OrigRegs)
Update live intervals for instructions in a range of iterators.
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.
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().
LLVM_ABI void replaceKillInstruction(Register Reg, MachineInstr &OldMI, MachineInstr &NewMI)
replaceKillInstruction - Update register kill info by replacing a kill instruction with a new one.
bool removeVirtualRegisterDead(Register Reg, MachineInstr &MI)
removeVirtualRegisterDead - Remove the specified kill of the virtual register from the live variable ...
bool removeVirtualRegisterKilled(Register Reg, MachineInstr &MI)
removeVirtualRegisterKilled - Remove the specified kill of the virtual register from the live variabl...
void addVirtualRegisterDead(Register IncomingReg, MachineInstr &MI, bool AddIfNotFound=false)
addVirtualRegisterDead - Add information about the fact that the specified register is dead after bei...
void addVirtualRegisterKilled(Register IncomingReg, MachineInstr &MI, bool AddIfNotFound=false)
addVirtualRegisterKilled - Add information about the fact that the specified register is killed after...
LLVM_ABI VarInfo & getVarInfo(Register Reg)
getVarInfo - Return the VarInfo structure for the specified VIRTUAL register.
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.
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)
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.
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)
DXILDebugInfoMap run(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.
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 removeKill(MachineInstr &MI)
removeKill - Delete a kill corresponding to the specified machine instruction.
std::vector< MachineInstr * > Kills
Kills - List of MachineInstruction's which are the last use of this virtual register (kill it) in the...
SparseBitVector AliveBlocks
AliveBlocks - Set of blocks in which this value is alive completely through.
LLVM_ABI MachineInstr * findKill(const MachineBasicBlock *MBB) const
findKill - Find a kill instruction in MBB. Return NULL if none is found.