70#define DEBUG_TYPE "twoaddressinstruction"
72STATISTIC(NumTwoAddressInstrs,
"Number of two-address instructions");
73STATISTIC(NumCommuted ,
"Number of instructions commuted to coalesce");
74STATISTIC(NumAggrCommuted ,
"Number of instructions aggressively commuted");
75STATISTIC(NumConvertedTo3Addr,
"Number of instructions promoted to 3-address");
76STATISTIC(NumReSchedUps,
"Number of instructions re-scheduled up");
77STATISTIC(NumReSchedDowns,
"Number of instructions re-scheduled down");
82 cl::desc(
"Coalesce copies by rescheduling (default=true)"),
86 "twoaddr-analyze-revcopy-tied",
87 cl::desc(
"Analyze tied operands when looking for reversed copy chain"),
94 cl::desc(
"Maximum number of dataflow edges to traverse when evaluating "
95 "the benefit of commuting operands"));
99class TwoAddressInstructionImpl {
132 bool noUseAfterLastDef(
Register Reg,
unsigned Dist,
unsigned &LastDef);
135 bool &IsSrcPhys,
bool &IsDstPhys)
const;
145 bool &IsDstPhys)
const;
160 unsigned RegBIdx,
unsigned RegCIdx,
unsigned Dist);
177 unsigned SrcIdx,
unsigned DstIdx,
178 unsigned &Dist,
bool shouldOnlyCommute);
193 void processTiedPairs(
MachineInstr *
MI, TiedPairList&,
unsigned &Dist);
195 bool processStatepoint(
MachineInstr *
MI, TiedOperandMap &TiedOperands);
210 TwoAddressInstructionLegacyPass() : MachineFunctionPass(ID) {}
213 bool runOnMachineFunction(MachineFunction &MF)
override {
214 TwoAddressInstructionImpl Impl(MF,
this);
218 Impl.setOptLevel(CodeGenOptLevel::None);
222 void getAnalysisUsage(AnalysisUsage &AU)
const override {
241 TwoAddressInstructionImpl Impl(MF, MFAM, LIS);
262char TwoAddressInstructionLegacyPass::ID = 0;
267 "Two-Address instruction pass",
false,
false)
269TwoAddressInstructionImpl::TwoAddressInstructionImpl(
272 : MF(&Func),
TII(Func.getSubtarget().getInstrInfo()),
273 TRI(Func.getSubtarget().getRegisterInfo()),
274 InstrItins(Func.getSubtarget().getInstrItineraryData()),
275 MRI(&Func.getRegInfo()),
277 OptLevel(Func.getTarget().getOptLevel()) {}
279TwoAddressInstructionImpl::TwoAddressInstructionImpl(
MachineFunction &Func,
281 : MF(&
Func),
TII(
Func.getSubtarget().getInstrInfo()),
282 TRI(
Func.getSubtarget().getRegisterInfo()),
283 InstrItins(
Func.getSubtarget().getInstrItineraryData()),
284 MRI(&
Func.getRegInfo()), OptLevel(
Func.getTarget().getOptLevel()) {
286 LV = LVWrapper ? &LVWrapper->
getLV() :
nullptr;
288 LIS = LISWrapper ? &LISWrapper->
getLIS() :
nullptr;
293TwoAddressInstructionImpl::getSingleDef(
Register Reg,
295 MachineInstr *Ret =
nullptr;
297 if (
DefMI.getParent() != BB ||
DefMI.isDebugValue())
301 else if (Ret != &
DefMI)
309 int DefRegIdx =
MI->findRegisterDefOperandIdx(DefReg,
TRI);
312 return MI->isRegTiedToUseOperand(DefRegIdx, &TiedOpIdx);
322bool TwoAddressInstructionImpl::isRevCopyChain(
Register FromReg,
Register ToReg,
325 for (
int i = 0; i < Maxlen; i++) {
326 MachineInstr *
Def = getSingleDef(TmpReg,
MBB);
331 TmpReg =
Def->getOperand(1).getReg();
332 else if (
unsigned TiedOpIdx;
334 Register TiedUseReg =
Def->getOperand(TiedOpIdx).getReg();
337 if (TiedUseReg == TmpReg)
353bool TwoAddressInstructionImpl::noUseAfterLastDef(
Register Reg,
unsigned Dist,
356 unsigned LastUse = Dist;
358 MachineInstr *
MI = MO.getParent();
359 if (
MI->getParent() !=
MBB ||
MI->isDebugValue())
361 auto DI = DistanceMap.
find(
MI);
362 if (DI == DistanceMap.
end())
364 if (MO.isUse() && DI->second < LastUse)
365 LastUse = DI->second;
366 if (MO.isDef() && DI->second > LastDef)
367 LastDef = DI->second;
370 return !(LastUse > LastDef && LastUse < Dist);
376bool TwoAddressInstructionImpl::isCopyToReg(MachineInstr &
MI,
Register &SrcReg,
378 bool &IsDstPhys)
const {
381 if (
MI.isCopy() ||
MI.isSubregToReg()) {
382 DstReg =
MI.getOperand(0).getReg();
383 SrcReg =
MI.getOperand(1).getReg();
384 }
else if (
MI.isInsertSubreg()) {
385 DstReg =
MI.getOperand(0).getReg();
386 SrcReg =
MI.getOperand(2).getReg();
396bool TwoAddressInstructionImpl::isPlainlyKilled(
const MachineInstr *
MI,
403 LiveInterval::const_iterator
I = LR.
find(useIdx);
404 assert(
I != LR.
end() &&
"Reg must be live-in to use.");
410bool TwoAddressInstructionImpl::isPlainlyKilled(
const MachineInstr *
MI,
425 return isPlainlyKilled(MI, LIS->getRegUnit(U));
429 return MI->killsRegister(
Reg,
nullptr);
434bool TwoAddressInstructionImpl::isPlainlyKilled(
435 const MachineOperand &MO)
const {
456bool TwoAddressInstructionImpl::isKilled(MachineInstr &
MI,
Register Reg,
457 bool allowFalsePositives)
const {
470 if (std::next(Begin) != MRI->
def_end())
473 bool IsSrcPhys, IsDstPhys;
477 if (!isCopyToReg(*
DefMI, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
486 for (
unsigned i = 0,
NumOps =
MI.getNumOperands(); i !=
NumOps; ++i) {
491 if (
MI.isRegTiedToDefOperand(i, &ti)) {
492 DstReg =
MI.getOperand(ti).getReg();
501MachineInstr *TwoAddressInstructionImpl::findOnlyInterestingUse(
503 bool &IsDstPhys)
const {
504 MachineOperand *UseOp =
nullptr;
510 if (
MI->getParent() !=
MBB)
512 if (isPlainlyKilled(
MI,
Reg))
521 if (isCopyToReg(
UseMI, SrcReg, DstReg, IsSrcPhys, IsDstPhys)) {
530 if (
UseMI.isCommutable()) {
533 if (
TII->findCommutedOpIndices(
UseMI, Src1, Src2)) {
534 MachineOperand &MO =
UseMI.getOperand(Src1);
549 while (
Reg.isVirtual()) {
551 if (
SI == RegMap.
end())
555 if (
Reg.isPhysical())
561bool TwoAddressInstructionImpl::regsAreCompatible(
Register RegA,
567 return TRI->regsOverlap(RegA, RegB);
571void TwoAddressInstructionImpl::removeMapRegEntry(
572 const MachineOperand &MO, DenseMap<Register, Register> &RegMap)
const {
575 "removeMapRegEntry must be called with a register or regmask operand.");
578 for (
auto SI : RegMap) {
585 if (
TRI->regsOverlap(ToReg,
Reg))
591 for (
auto SrcReg : Srcs)
592 RegMap.erase(SrcReg);
603void TwoAddressInstructionImpl::removeClobberedSrcRegMap(MachineInstr *
MI) {
616 if (!Dst || Dst.isVirtual())
620 if (regsAreCompatible(Dst,
getMappedReg(Src, SrcRegMap)))
624 for (
const MachineOperand &MO :
MI->operands()) {
626 removeMapRegEntry(MO, SrcRegMap);
634 removeMapRegEntry(MO, SrcRegMap);
639bool TwoAddressInstructionImpl::regOverlapsSet(
640 const SmallVectorImpl<Register> &Set,
Register Reg)
const {
642 if (
TRI->regsOverlap(R,
Reg))
650bool TwoAddressInstructionImpl::isProfitableToCommute(
Register RegA,
655 if (OptLevel == CodeGenOptLevel::None)
676 if (!isPlainlyKilled(
MI, RegC))
693 bool CompB = FromRegB && regsAreCompatible(FromRegB, ToRegA);
694 bool CompC = FromRegC && regsAreCompatible(FromRegC, ToRegA);
700 if ((!FromRegB && CompC) || (FromRegB && !CompB && (!FromRegC || CompC)))
706 if ((!FromRegC && CompB) || (FromRegC && !CompC && (!FromRegB || CompB)))
712 unsigned LastDefC = 0;
713 if (!noUseAfterLastDef(RegC, Dist, LastDefC))
718 unsigned LastDefB = 0;
719 if (!noUseAfterLastDef(RegB, Dist, LastDefB))
745 if (
TII->hasCommutePreference(*
MI, Commute))
750 return LastDefB && LastDefC && LastDefC > LastDefB;
755bool TwoAddressInstructionImpl::commuteInstruction(MachineInstr *
MI,
760 Register RegC =
MI->getOperand(RegCIdx).getReg();
762 MachineInstr *NewMI =
TII->commuteInstruction(*
MI,
false, RegBIdx, RegCIdx);
764 if (NewMI ==
nullptr) {
771 "TargetInstrInfo::commuteInstruction() should not return a new "
772 "instruction unless it was requested.");
777 Register RegA =
MI->getOperand(DstIdx).getReg();
778 SrcRegMap[RegA] = FromRegC;
786bool TwoAddressInstructionImpl::isProfitableToConv3Addr(
Register RegA,
798 return (ToRegA && !regsAreCompatible(FromRegB, ToRegA));
803bool TwoAddressInstructionImpl::convertInstTo3Addr(
806 MachineInstrSpan MIS(mi,
MBB);
807 MachineInstr *NewMI =
TII->convertToThreeAddress(*mi, LV, LIS);
811 for (MachineInstr &
MI : MIS)
812 DistanceMap.
insert(std::make_pair(&
MI, Dist++));
815 LLVM_DEBUG(
dbgs() <<
"2addr: CONVERTED IN-PLACE TO 3-ADDR: " << *mi);
818 dbgs() <<
"2addr: CONVERTING 2-ADDR: " << *mi;
819 dbgs() <<
"2addr: TO 3-ADDR: " << *NewMI;
823 if (
auto OldInstrNum = mi->peekDebugInstrNum()) {
824 assert(mi->getNumExplicitDefs() == 1);
828 unsigned OldIdx = mi->defs().begin()->getOperandNo();
829 unsigned NewIdx = NewMI->
defs().
begin()->getOperandNo();
834 std::make_pair(NewInstrNum, NewIdx));
845 SrcRegMap.
erase(RegA);
846 DstRegMap.
erase(RegB);
852void TwoAddressInstructionImpl::scanUses(
Register DstReg) {
858 while (MachineInstr *
UseMI =
859 findOnlyInterestingUse(
Reg,
MBB, IsCopy, NewReg, IsDstPhys)) {
860 if (IsCopy && !Processed.insert(
UseMI).second)
864 if (DI != DistanceMap.
end())
872 SrcRegMap[NewReg] =
Reg;
877 if (!VirtRegPairs.
empty()) {
879 while (!VirtRegPairs.
empty()) {
881 bool isNew = DstRegMap.
insert(std::make_pair(FromReg, ToReg)).second;
883 assert(DstRegMap[FromReg] == ToReg &&
"Can't map to two dst registers!");
886 bool isNew = DstRegMap.
insert(std::make_pair(DstReg, ToReg)).second;
888 assert(DstRegMap[DstReg] == ToReg &&
"Can't map to two dst registers!");
904void TwoAddressInstructionImpl::processCopy(MachineInstr *
MI) {
905 if (Processed.count(
MI))
908 bool IsSrcPhys, IsDstPhys;
910 if (!isCopyToReg(*
MI, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
913 if (IsDstPhys && !IsSrcPhys) {
914 DstRegMap.
insert(std::make_pair(SrcReg, DstReg));
915 }
else if (!IsDstPhys && IsSrcPhys) {
916 bool isNew = SrcRegMap.
insert(std::make_pair(DstReg, SrcReg)).second;
918 assert(SrcRegMap[DstReg] == SrcReg &&
919 "Can't map to two src physical registers!");
924 Processed.insert(
MI);
930bool TwoAddressInstructionImpl::rescheduleMIBelowKill(
938 MachineInstr *
MI = &*mi;
939 auto DI = DistanceMap.
find(
MI);
940 if (DI == DistanceMap.
end())
944 MachineInstr *KillMI =
nullptr;
948 "Reg should not have empty live interval.");
951 LiveInterval::const_iterator
I = LI.
find(MBBEndIdx);
952 if (
I != LI.
end() &&
I->start < MBBEndIdx)
973 bool SeenStore =
true;
974 if (!
MI->isSafeToMove(SeenStore))
984 for (
const MachineOperand &MO :
MI->operands()) {
993 Uses.push_back(MOReg);
994 if (MOReg !=
Reg && isPlainlyKilled(MO))
1003 while (End !=
MBB->
end()) {
1005 if (End->isCopy() && regOverlapsSet(Defs, End->getOperand(1).getReg()))
1006 Defs.
push_back(End->getOperand(0).getReg());
1013 unsigned NumVisited = 0;
1016 for (MachineInstr &OtherMI :
make_range(End, KillPos)) {
1018 if (OtherMI.isDebugOrPseudoInstr())
1020 if (NumVisited > 10)
1023 if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
1024 OtherMI.isBranch() || OtherMI.isTerminator())
1027 for (
const MachineOperand &MO : OtherMI.operands()) {
1034 if (regOverlapsSet(
Uses, MOReg))
1037 if (!MO.
isDead() && regOverlapsSet(Defs, MOReg))
1043 if (regOverlapsSet(Defs, MOReg))
1045 bool isKill = isPlainlyKilled(MO);
1046 if (MOReg !=
Reg && ((isKill && regOverlapsSet(
Uses, MOReg)) ||
1047 regOverlapsSet(Kills, MOReg)))
1050 if (MOReg ==
Reg && !isKill)
1054 assert((MOReg !=
Reg || &OtherMI == KillMI) &&
1055 "Found multiple kills of a register in a basic block");
1061 while (Begin !=
MBB->
begin() && std::prev(Begin)->isDebugInstr())
1070 auto CopyMI =
MBBI++;
1072 if (!CopyMI->isDebugOrPseudoInstr())
1081 DistanceMap.
erase(DI);
1097bool TwoAddressInstructionImpl::isDefTooClose(
Register Reg,
unsigned Dist,
1105 if (DDI == DistanceMap.
end())
1107 unsigned DefDist = DDI->second;
1108 assert(Dist > DefDist &&
"Visited def already?");
1118bool TwoAddressInstructionImpl::rescheduleKillAboveMI(
1126 MachineInstr *
MI = &*mi;
1127 auto DI = DistanceMap.
find(
MI);
1128 if (DI == DistanceMap.
end())
1132 MachineInstr *KillMI =
nullptr;
1136 "Reg should not have empty live interval.");
1139 LiveInterval::const_iterator
I = LI.
find(MBBEndIdx);
1140 if (
I != LI.
end() &&
I->start < MBBEndIdx)
1148 if (!KillMI ||
MI == KillMI)
1156 bool IsCopySrcPhys, IsCopyDstPhys;
1161 if (!isCopyToReg(*KillMI, CopySrcReg, CopyDstReg, IsCopySrcPhys,
1165 if (CopySrcReg !=
Reg || IsCopySrcPhys || !IsCopyDstPhys)
1173 bool SeenStore =
true;
1181 for (
const MachineOperand &MO : KillMI->
operands()) {
1188 if (isDefTooClose(MOReg, DI->second,
MI))
1190 bool isKill = isPlainlyKilled(MO);
1191 if (MOReg ==
Reg && !isKill)
1193 Uses.push_back(MOReg);
1194 if (isKill && MOReg !=
Reg)
1204 unsigned NumVisited = 0;
1205 for (MachineInstr &OtherMI :
1208 if (OtherMI.isDebugOrPseudoInstr())
1210 if (NumVisited > 10)
1213 if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
1214 OtherMI.isBranch() || OtherMI.isTerminator())
1218 for (
const MachineOperand &MO : OtherMI.operands()) {
1225 if (regOverlapsSet(Defs, MOReg))
1229 if (regOverlapsSet(Kills, MOReg))
1232 if (&OtherMI !=
MI && MOReg ==
Reg && !isPlainlyKilled(MO))
1241 if (regOverlapsSet(
Uses, MOReg))
1243 if (MOReg.
isPhysical() && regOverlapsSet(LiveDefs, MOReg))
1252 while (InsertPos !=
MBB->
begin() && std::prev(InsertPos)->isDebugInstr())
1256 while (std::prev(From)->isDebugInstr())
1260 nmi = std::prev(InsertPos);
1261 DistanceMap.
erase(DI);
1287bool TwoAddressInstructionImpl::tryInstructionCommute(MachineInstr *
MI,
1292 if (!
MI->isCommutable())
1295 bool MadeChange =
false;
1296 Register DstOpReg =
MI->getOperand(DstOpIdx).getReg();
1297 Register BaseOpReg =
MI->getOperand(BaseOpIdx).getReg();
1298 unsigned OpsNum =
MI->getDesc().getNumOperands();
1299 unsigned OtherOpIdx =
MI->getDesc().getNumDefs();
1300 for (; OtherOpIdx < OpsNum; OtherOpIdx++) {
1305 if (OtherOpIdx == BaseOpIdx || !
MI->getOperand(OtherOpIdx).isReg() ||
1306 !
TII->findCommutedOpIndices(*
MI, BaseOpIdx, OtherOpIdx))
1309 Register OtherOpReg =
MI->getOperand(OtherOpIdx).getReg();
1310 bool AggressiveCommute =
false;
1314 bool OtherOpKilled = isKilled(*
MI, OtherOpReg,
false);
1315 bool DoCommute = !BaseOpKilled && OtherOpKilled;
1318 isProfitableToCommute(DstOpReg, BaseOpReg, OtherOpReg,
MI, Dist)) {
1320 AggressiveCommute =
true;
1324 if (DoCommute && commuteInstruction(
MI, DstOpIdx, BaseOpIdx, OtherOpIdx,
1328 if (AggressiveCommute)
1335 BaseOpReg = OtherOpReg;
1336 BaseOpKilled = OtherOpKilled;
1339 OpsNum =
MI->getDesc().getNumOperands();
1352bool TwoAddressInstructionImpl::tryInstructionTransform(
1354 unsigned SrcIdx,
unsigned DstIdx,
unsigned &Dist,
bool shouldOnlyCommute) {
1355 if (OptLevel == CodeGenOptLevel::None)
1358 MachineInstr &
MI = *mi;
1359 Register regA =
MI.getOperand(DstIdx).getReg();
1360 Register regB =
MI.getOperand(SrcIdx).getReg();
1362 assert(regB.
isVirtual() &&
"cannot make instruction into two-address form");
1363 bool regBKilled = isKilled(
MI, regB,
true);
1368 bool Commuted = tryInstructionCommute(&
MI, DstIdx, SrcIdx, regBKilled, Dist);
1381 if (Commuted && !ConvertibleTo3Addr)
1384 if (shouldOnlyCommute)
1397 regB =
MI.getOperand(SrcIdx).getReg();
1398 regBKilled = isKilled(
MI, regB,
true);
1401 if (ConvertibleTo3Addr) {
1404 if (!regBKilled || isProfitableToConv3Addr(regA, regB)) {
1406 if (convertInstTo3Addr(mi, nmi, regA, regB, Dist)) {
1407 ++NumConvertedTo3Addr;
1432 if (
MI.mayLoad() && !regBKilled) {
1434 unsigned LoadRegIndex;
1436 TII->getOpcodeAfterMemoryUnfold(
MI.getOpcode(),
1441 const MCInstrDesc &UnfoldMCID =
TII->get(NewOpc);
1446 TII->getRegClass(UnfoldMCID, LoadRegIndex));
1448 SmallVector<MachineInstr *, 2> NewMIs;
1449 if (!
TII->unfoldMemoryOperand(*MF,
MI,
Reg,
1456 "Unfolded a load into multiple instructions!");
1458 NewMIs[1]->addRegisterKilled(
Reg,
TRI);
1464 DistanceMap.
insert(std::make_pair(NewMIs[0], Dist++));
1465 DistanceMap.
insert(std::make_pair(NewMIs[1], Dist));
1468 <<
"2addr: NEW INST: " << *NewMIs[1]);
1471 unsigned NewDstIdx =
1472 NewMIs[1]->findRegisterDefOperandIdx(regA,
nullptr);
1473 unsigned NewSrcIdx =
1474 NewMIs[1]->findRegisterUseOperandIdx(regB,
nullptr);
1476 bool TransformResult =
1477 tryInstructionTransform(NewMI, mi, NewSrcIdx, NewDstIdx, Dist,
true);
1478 (void)TransformResult;
1479 assert(!TransformResult &&
1480 "tryInstructionTransform() should return false.");
1481 if (NewMIs[1]->getOperand(NewSrcIdx).isKill()) {
1485 for (
const MachineOperand &MO :
MI.operands()) {
1489 if (NewMIs[0]->killsRegister(MO.
getReg(),
nullptr))
1494 "Kill missing after load unfold!");
1499 if (NewMIs[1]->registerDefIsDead(MO.
getReg(),
1505 "Dead flag missing after load unfold!");
1516 for (
const MachineOperand &MO :
MI.operands()) {
1524 MI.eraseFromParent();
1540 NewMIs[0]->eraseFromParent();
1541 NewMIs[1]->eraseFromParent();
1542 DistanceMap.
erase(NewMIs[0]);
1543 DistanceMap.
erase(NewMIs[1]);
1556bool TwoAddressInstructionImpl::collectTiedOperands(
1557 MachineInstr *
MI, TiedOperandMap &TiedOperands) {
1558 bool AnyOps =
false;
1559 unsigned NumOps =
MI->getNumOperands();
1561 for (
unsigned SrcIdx = 0; SrcIdx <
NumOps; ++SrcIdx) {
1562 unsigned DstIdx = 0;
1563 if (!
MI->isRegTiedToDefOperand(SrcIdx, &DstIdx))
1566 MachineOperand &SrcMO =
MI->getOperand(SrcIdx);
1567 MachineOperand &DstMO =
MI->getOperand(DstIdx);
1571 if (SrcReg == DstReg)
1574 assert(SrcReg && SrcMO.
isUse() &&
"two address instruction invalid");
1588 TiedOperands[SrcReg].push_back(std::make_pair(SrcIdx, DstIdx));
1595void TwoAddressInstructionImpl::processTiedPairs(MachineInstr *
MI,
1596 TiedPairList &TiedPairs,
1598 bool IsEarlyClobber =
llvm::any_of(TiedPairs, [
MI](
auto const &TP) {
1599 return MI->getOperand(TP.second).isEarlyClobber();
1602 bool RemovedKillFlag =
false;
1603 bool AllUsesCopied =
true;
1605 SlotIndex LastCopyIdx;
1607 unsigned SubRegB = 0;
1608 for (
auto &TP : TiedPairs) {
1609 unsigned SrcIdx = TP.first;
1610 unsigned DstIdx = TP.second;
1612 const MachineOperand &DstMO =
MI->getOperand(DstIdx);
1617 RegB =
MI->getOperand(SrcIdx).getReg();
1618 SubRegB =
MI->getOperand(SrcIdx).getSubReg();
1624 AllUsesCopied =
false;
1627 LastCopiedReg = RegA;
1629 assert(RegB.
isVirtual() &&
"cannot make instruction into two-address form");
1635 for (
unsigned i = 0; i !=
MI->getNumOperands(); ++i)
1637 !
MI->getOperand(i).isReg() ||
1638 MI->getOperand(i).getReg() != RegA);
1642 MachineInstrBuilder MIB =
BuildMI(*
MI->getParent(),
MI,
MI->getDebugLoc(),
1643 TII->get(TargetOpcode::COPY), RegA);
1646 MIB.
addReg(RegB, {}, SubRegB);
1652 "tied subregister must be a truncation");
1657 &&
"tied subregister must be a truncation");
1664 DistanceMap.
insert(std::make_pair(&*PrevMI, Dist));
1665 DistanceMap[
MI] = ++Dist;
1675 LI.
addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1678 S.addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1681 for (MCRegUnit Unit :
TRI->regunits(RegA)) {
1685 LR->
addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1693 MachineOperand &MO =
MI->getOperand(SrcIdx);
1695 "inconsistent operand info for 2-reg pass");
1696 if (isPlainlyKilled(MO)) {
1698 RemovedKillFlag =
true;
1711 if (
MI->isBundle()) {
1715 "tied subregister uses in bundled instructions not supported");
1722 if (AllUsesCopied) {
1725 for (MachineOperand &MO :
MI->all_uses()) {
1726 if (MO.
getReg() == RegB) {
1727 if (MO.
getSubReg() == SubRegB && !IsEarlyClobber) {
1728 if (isPlainlyKilled(MO)) {
1730 RemovedKillFlag =
true;
1732 MO.
setReg(LastCopiedReg);
1735 RemainingUses |=
TRI->getSubRegIndexLaneMask(MO.
getSubReg());
1741 if (RemovedKillFlag && RemainingUses.
none() && LV &&
1748 if (RemovedKillFlag && RemainingUses.
none())
1749 SrcRegMap[LastCopiedReg] = RegB;
1754 auto Shrink = [=](
LiveRange &LR, LaneBitmask LaneMask) {
1758 if ((LaneMask & RemainingUses).
any())
1762 S->
end = LastCopyIdx;
1767 bool ShrinkLI =
true;
1769 ShrinkLI &= Shrink(S, S.LaneMask);
1773 }
else if (RemovedKillFlag) {
1778 for (MachineOperand &MO :
MI->all_uses()) {
1779 if (MO.
getReg() == RegB) {
1794bool TwoAddressInstructionImpl::processStatepoint(
1795 MachineInstr *
MI, TiedOperandMap &TiedOperands) {
1797 bool NeedCopy =
false;
1798 for (
auto &TO : TiedOperands) {
1800 if (TO.second.size() != 1) {
1805 unsigned SrcIdx = TO.second[0].first;
1806 unsigned DstIdx = TO.second[0].second;
1808 MachineOperand &DstMO =
MI->getOperand(DstIdx);
1811 assert(RegB ==
MI->getOperand(SrcIdx).getReg());
1824 if (DefLI.overlaps(UseLI)) {
1826 <<
" UseLI overlaps with DefLI\n");
1835 <<
" not killed by statepoint\n");
1842 <<
" to register class of " <<
printReg(RegA,
TRI, 0)
1854 for (
const VNInfo *VNI :
Other.valnos) {
1858 for (
auto &S :
Other) {
1859 VNInfo *VNI = NewVNIs[S.
valno->
id];
1860 LiveRange::Segment NewSeg(S.
start, S.
end, VNI);
1867 if (
MI->getOperand(SrcIdx).isKill())
1869 LiveVariables::VarInfo &SrcInfo = LV->
getVarInfo(RegB);
1870 LiveVariables::VarInfo &DstInfo = LV->
getVarInfo(RegA);
1873 for (
auto *KillMI : DstInfo.
Kills)
1881bool TwoAddressInstructionImpl::run() {
1882 bool MadeChange =
false;
1884 LLVM_DEBUG(
dbgs() <<
"********** REWRITING TWO-ADDR INSTRS **********\n");
1893 TiedOperandMap TiedOperands;
1894 for (MachineBasicBlock &
MBBI : *MF) {
1897 DistanceMap.
clear();
1905 if (mi->isDebugInstr()) {
1912 if (mi->isRegSequence()) {
1913 eliminateRegSequence(mi);
1917 DistanceMap.
insert(std::make_pair(&*mi, ++Dist));
1923 if (!collectTiedOperands(&*mi, TiedOperands)) {
1924 removeClobberedSrcRegMap(&*mi);
1929 ++NumTwoAddressInstrs;
1936 if (TiedOperands.size() == 1) {
1937 SmallVectorImpl<std::pair<unsigned, unsigned>> &TiedPairs
1938 = TiedOperands.begin()->second;
1939 if (TiedPairs.
size() == 1) {
1940 unsigned SrcIdx = TiedPairs[0].first;
1941 unsigned DstIdx = TiedPairs[0].second;
1942 Register SrcReg = mi->getOperand(SrcIdx).getReg();
1943 Register DstReg = mi->getOperand(DstIdx).getReg();
1944 if (SrcReg != DstReg &&
1945 tryInstructionTransform(mi, nmi, SrcIdx, DstIdx, Dist,
false)) {
1948 TiedOperands.clear();
1949 removeClobberedSrcRegMap(&*mi);
1956 if (mi->getOpcode() == TargetOpcode::STATEPOINT &&
1957 processStatepoint(&*mi, TiedOperands)) {
1958 TiedOperands.clear();
1965 for (
auto &TO : TiedOperands) {
1966 processTiedPairs(&*mi, TO.second, Dist);
1971 if (mi->isInsertSubreg()) {
1974 unsigned SubIdx = mi->getOperand(3).getImm();
1975 mi->removeOperand(3);
1976 assert(mi->getOperand(0).getSubReg() == 0 &&
"Unexpected subreg idx");
1977 mi->getOperand(0).setSubReg(SubIdx);
1978 mi->getOperand(0).setIsUndef(mi->getOperand(1).isUndef());
1979 mi->removeOperand(1);
1980 mi->setDesc(
TII->get(TargetOpcode::COPY));
1990 LaneBitmask LaneMask =
1991 TRI->getSubRegIndexLaneMask(mi->getOperand(0).getSubReg());
1994 if ((S.LaneMask & LaneMask).none()) {
1995 LiveRange::iterator DefSeg = S.FindSegmentContaining(Idx);
1996 if (mi->getOperand(0).isUndef()) {
1997 S.removeValNo(DefSeg->valno);
1999 LiveRange::iterator UseSeg = std::prev(DefSeg);
2000 S.MergeValueNumberInto(DefSeg->valno, UseSeg->valno);
2018 TiedOperands.clear();
2019 removeClobberedSrcRegMap(&*mi);
2037void TwoAddressInstructionImpl::eliminateRegSequence(
2039 MachineInstr &
MI = *
MBBI;
2043 VNInfo *DefVN =
nullptr;
2046 for (
unsigned i = 1, e =
MI.getNumOperands(); i < e; i += 2)
2060 if (
unsigned SubReg =
Use.getSubReg())
2061 UsedLanes |=
TRI->getSubRegIndexLaneMask(SubReg);
2066 bool DefEmitted =
false;
2067 for (
unsigned i = 1, e =
MI.getNumOperands(); i < e; i += 2) {
2068 MachineOperand &UseMO =
MI.getOperand(i);
2070 unsigned SubIdx =
MI.getOperand(i+1).getImm();
2075 LaneBitmask LaneMask =
TRI->getSubRegIndexLaneMask(SubIdx);
2076 if (LIS || (UsedLanes & LaneMask).
none()) {
2077 UndefLanes |= LaneMask;
2084 bool isKill = UseMO.
isKill();
2086 for (
unsigned j = i + 2;
j <
e;
j += 2)
2087 if (
MI.getOperand(j).getReg() == SrcReg) {
2088 MI.getOperand(j).setIsKill();
2095 MachineInstr *CopyMI =
BuildMI(*
MI.getParent(),
MI,
MI.getDebugLoc(),
2096 TII->get(TargetOpcode::COPY))
2097 .
addReg(DstReg, RegState::Define, SubIdx)
2121 MI.setDesc(
TII->get(TargetOpcode::IMPLICIT_DEF));
2122 for (
int j =
MI.getNumOperands() - 1, ee = 0; j > ee; --j)
2123 MI.removeOperand(j);
2131 for (MachineOperand &UseOp : MRI->
use_operands(DstReg)) {
2133 if (UseOp.
isUndef() || !SubReg)
2139 LaneBitmask LaneMask =
TRI->getSubRegIndexLaneMask(SubReg);
2140 if ((UndefLanes & LaneMask).
any())
2149 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.