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);
260char TwoAddressInstructionLegacyPass::ID = 0;
265 "Two-Address instruction pass",
false,
false)
267TwoAddressInstructionImpl::TwoAddressInstructionImpl(
270 : MF(&Func),
TII(Func.getSubtarget().getInstrInfo()),
271 TRI(Func.getSubtarget().getRegisterInfo()),
272 InstrItins(Func.getSubtarget().getInstrItineraryData()),
273 MRI(&Func.getRegInfo()),
275 OptLevel(Func.getTarget().getOptLevel()) {}
277TwoAddressInstructionImpl::TwoAddressInstructionImpl(
MachineFunction &Func,
279 : MF(&
Func),
TII(
Func.getSubtarget().getInstrInfo()),
280 TRI(
Func.getSubtarget().getRegisterInfo()),
281 InstrItins(
Func.getSubtarget().getInstrItineraryData()),
282 MRI(&
Func.getRegInfo()), OptLevel(
Func.getTarget().getOptLevel()) {
284 LV = LVWrapper ? &LVWrapper->
getLV() :
nullptr;
286 LIS = LISWrapper ? &LISWrapper->
getLIS() :
nullptr;
291TwoAddressInstructionImpl::getSingleDef(
Register Reg,
293 MachineInstr *Ret =
nullptr;
295 if (
DefMI.getParent() != BB ||
DefMI.isDebugValue())
299 else if (Ret != &
DefMI)
307 int DefRegIdx =
MI->findRegisterDefOperandIdx(DefReg,
TRI);
310 return MI->isRegTiedToUseOperand(DefRegIdx, &TiedOpIdx);
320bool TwoAddressInstructionImpl::isRevCopyChain(
Register FromReg,
Register ToReg,
323 for (
int i = 0; i < Maxlen; i++) {
324 MachineInstr *
Def = getSingleDef(TmpReg,
MBB);
329 TmpReg =
Def->getOperand(1).getReg();
330 else if (
unsigned TiedOpIdx;
332 Register TiedUseReg =
Def->getOperand(TiedOpIdx).getReg();
335 if (TiedUseReg == TmpReg)
351bool TwoAddressInstructionImpl::noUseAfterLastDef(
Register Reg,
unsigned Dist,
354 unsigned LastUse = Dist;
356 MachineInstr *
MI = MO.getParent();
357 if (
MI->getParent() !=
MBB ||
MI->isDebugValue())
359 auto DI = DistanceMap.
find(
MI);
360 if (DI == DistanceMap.
end())
362 if (MO.isUse() && DI->second < LastUse)
363 LastUse = DI->second;
364 if (MO.isDef() && DI->second > LastDef)
365 LastDef = DI->second;
368 return !(LastUse > LastDef && LastUse < Dist);
374bool TwoAddressInstructionImpl::isCopyToReg(MachineInstr &
MI,
Register &SrcReg,
376 bool &IsDstPhys)
const {
379 if (
MI.isCopy() ||
MI.isSubregToReg()) {
380 DstReg =
MI.getOperand(0).getReg();
381 SrcReg =
MI.getOperand(1).getReg();
382 }
else if (
MI.isInsertSubreg()) {
383 DstReg =
MI.getOperand(0).getReg();
384 SrcReg =
MI.getOperand(2).getReg();
394bool TwoAddressInstructionImpl::isPlainlyKilled(
const MachineInstr *
MI,
401 LiveInterval::const_iterator
I = LR.
find(useIdx);
402 assert(
I != LR.
end() &&
"Reg must be live-in to use.");
408bool TwoAddressInstructionImpl::isPlainlyKilled(
const MachineInstr *
MI,
423 return isPlainlyKilled(MI, LIS->getRegUnit(U));
427 return MI->killsRegister(
Reg,
nullptr);
432bool TwoAddressInstructionImpl::isPlainlyKilled(
433 const MachineOperand &MO)
const {
454bool TwoAddressInstructionImpl::isKilled(MachineInstr &
MI,
Register Reg,
455 bool allowFalsePositives)
const {
468 if (std::next(Begin) != MRI->
def_end())
471 bool IsSrcPhys, IsDstPhys;
475 if (!isCopyToReg(*
DefMI, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
484 for (
unsigned i = 0,
NumOps =
MI.getNumOperands(); i !=
NumOps; ++i) {
489 if (
MI.isRegTiedToDefOperand(i, &ti)) {
490 DstReg =
MI.getOperand(ti).getReg();
499MachineInstr *TwoAddressInstructionImpl::findOnlyInterestingUse(
501 bool &IsDstPhys)
const {
502 MachineOperand *UseOp =
nullptr;
508 if (
MI->getParent() !=
MBB)
510 if (isPlainlyKilled(
MI,
Reg))
519 if (isCopyToReg(
UseMI, SrcReg, DstReg, IsSrcPhys, IsDstPhys)) {
528 if (
UseMI.isCommutable()) {
531 if (
TII->findCommutedOpIndices(
UseMI, Src1, Src2)) {
532 MachineOperand &MO =
UseMI.getOperand(Src1);
547 while (
Reg.isVirtual()) {
549 if (
SI == RegMap.
end())
553 if (
Reg.isPhysical())
559bool TwoAddressInstructionImpl::regsAreCompatible(
Register RegA,
565 return TRI->regsOverlap(RegA, RegB);
569void TwoAddressInstructionImpl::removeMapRegEntry(
570 const MachineOperand &MO, DenseMap<Register, Register> &RegMap)
const {
573 "removeMapRegEntry must be called with a register or regmask operand.");
576 for (
auto SI : RegMap) {
583 if (
TRI->regsOverlap(ToReg,
Reg))
589 for (
auto SrcReg : Srcs)
590 RegMap.erase(SrcReg);
601void TwoAddressInstructionImpl::removeClobberedSrcRegMap(MachineInstr *
MI) {
614 if (!Dst || Dst.isVirtual())
618 if (regsAreCompatible(Dst,
getMappedReg(Src, SrcRegMap)))
622 for (
const MachineOperand &MO :
MI->operands()) {
624 removeMapRegEntry(MO, SrcRegMap);
632 removeMapRegEntry(MO, SrcRegMap);
637bool TwoAddressInstructionImpl::regOverlapsSet(
638 const SmallVectorImpl<Register> &Set,
Register Reg)
const {
640 if (
TRI->regsOverlap(R,
Reg))
648bool TwoAddressInstructionImpl::isProfitableToCommute(
Register RegA,
653 if (OptLevel == CodeGenOptLevel::None)
674 if (!isPlainlyKilled(
MI, RegC))
691 bool CompB = FromRegB && regsAreCompatible(FromRegB, ToRegA);
692 bool CompC = FromRegC && regsAreCompatible(FromRegC, ToRegA);
698 if ((!FromRegB && CompC) || (FromRegB && !CompB && (!FromRegC || CompC)))
704 if ((!FromRegC && CompB) || (FromRegC && !CompC && (!FromRegB || CompB)))
710 unsigned LastDefC = 0;
711 if (!noUseAfterLastDef(RegC, Dist, LastDefC))
716 unsigned LastDefB = 0;
717 if (!noUseAfterLastDef(RegB, Dist, LastDefB))
743 if (
TII->hasCommutePreference(*
MI, Commute))
748 return LastDefB && LastDefC && LastDefC > LastDefB;
753bool TwoAddressInstructionImpl::commuteInstruction(MachineInstr *
MI,
758 Register RegC =
MI->getOperand(RegCIdx).getReg();
760 MachineInstr *NewMI =
TII->commuteInstruction(*
MI,
false, RegBIdx, RegCIdx);
762 if (NewMI ==
nullptr) {
769 "TargetInstrInfo::commuteInstruction() should not return a new "
770 "instruction unless it was requested.");
775 Register RegA =
MI->getOperand(DstIdx).getReg();
776 SrcRegMap[RegA] = FromRegC;
784bool TwoAddressInstructionImpl::isProfitableToConv3Addr(
Register RegA,
796 return (ToRegA && !regsAreCompatible(FromRegB, ToRegA));
801bool TwoAddressInstructionImpl::convertInstTo3Addr(
804 MachineInstrSpan MIS(mi,
MBB);
805 MachineInstr *NewMI =
TII->convertToThreeAddress(*mi, LV, LIS);
809 for (MachineInstr &
MI : MIS)
810 DistanceMap.
insert(std::make_pair(&
MI, Dist++));
813 LLVM_DEBUG(
dbgs() <<
"2addr: CONVERTED IN-PLACE TO 3-ADDR: " << *mi);
816 dbgs() <<
"2addr: CONVERTING 2-ADDR: " << *mi;
817 dbgs() <<
"2addr: TO 3-ADDR: " << *NewMI;
821 if (
auto OldInstrNum = mi->peekDebugInstrNum()) {
822 assert(mi->getNumExplicitDefs() == 1);
826 unsigned OldIdx = mi->defs().begin()->getOperandNo();
827 unsigned NewIdx = NewMI->
defs().
begin()->getOperandNo();
832 std::make_pair(NewInstrNum, NewIdx));
843 SrcRegMap.
erase(RegA);
844 DstRegMap.
erase(RegB);
850void TwoAddressInstructionImpl::scanUses(
Register DstReg) {
856 while (MachineInstr *
UseMI =
857 findOnlyInterestingUse(
Reg,
MBB, IsCopy, NewReg, IsDstPhys)) {
858 if (IsCopy && !Processed.insert(
UseMI).second)
862 if (DI != DistanceMap.
end())
870 SrcRegMap[NewReg] =
Reg;
875 if (!VirtRegPairs.
empty()) {
877 while (!VirtRegPairs.
empty()) {
879 bool isNew = DstRegMap.
insert(std::make_pair(FromReg, ToReg)).second;
881 assert(DstRegMap[FromReg] == ToReg &&
"Can't map to two dst registers!");
884 bool isNew = DstRegMap.
insert(std::make_pair(DstReg, ToReg)).second;
886 assert(DstRegMap[DstReg] == ToReg &&
"Can't map to two dst registers!");
902void TwoAddressInstructionImpl::processCopy(MachineInstr *
MI) {
903 if (Processed.count(
MI))
906 bool IsSrcPhys, IsDstPhys;
908 if (!isCopyToReg(*
MI, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
911 if (IsDstPhys && !IsSrcPhys) {
912 DstRegMap.
insert(std::make_pair(SrcReg, DstReg));
913 }
else if (!IsDstPhys && IsSrcPhys) {
914 bool isNew = SrcRegMap.
insert(std::make_pair(DstReg, SrcReg)).second;
916 assert(SrcRegMap[DstReg] == SrcReg &&
917 "Can't map to two src physical registers!");
922 Processed.insert(
MI);
928bool TwoAddressInstructionImpl::rescheduleMIBelowKill(
936 MachineInstr *
MI = &*mi;
937 auto DI = DistanceMap.
find(
MI);
938 if (DI == DistanceMap.
end())
942 MachineInstr *KillMI =
nullptr;
946 "Reg should not have empty live interval.");
949 LiveInterval::const_iterator
I = LI.
find(MBBEndIdx);
950 if (
I != LI.
end() &&
I->start < MBBEndIdx)
971 bool SeenStore =
true;
972 if (!
MI->isSafeToMove(SeenStore))
982 for (
const MachineOperand &MO :
MI->operands()) {
991 Uses.push_back(MOReg);
992 if (MOReg !=
Reg && isPlainlyKilled(MO))
1001 while (End !=
MBB->
end()) {
1003 if (End->isCopy() && regOverlapsSet(Defs, End->getOperand(1).getReg()))
1004 Defs.
push_back(End->getOperand(0).getReg());
1011 unsigned NumVisited = 0;
1014 for (MachineInstr &OtherMI :
make_range(End, KillPos)) {
1016 if (OtherMI.isDebugOrPseudoInstr())
1018 if (NumVisited > 10)
1021 if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
1022 OtherMI.isBranch() || OtherMI.isTerminator())
1025 for (
const MachineOperand &MO : OtherMI.operands()) {
1032 if (regOverlapsSet(
Uses, MOReg))
1035 if (!MO.
isDead() && regOverlapsSet(Defs, MOReg))
1041 if (regOverlapsSet(Defs, MOReg))
1043 bool isKill = isPlainlyKilled(MO);
1044 if (MOReg !=
Reg && ((isKill && regOverlapsSet(
Uses, MOReg)) ||
1045 regOverlapsSet(Kills, MOReg)))
1048 if (MOReg ==
Reg && !isKill)
1052 assert((MOReg !=
Reg || &OtherMI == KillMI) &&
1053 "Found multiple kills of a register in a basic block");
1059 while (Begin !=
MBB->
begin() && std::prev(Begin)->isDebugInstr())
1068 auto CopyMI =
MBBI++;
1070 if (!CopyMI->isDebugOrPseudoInstr())
1079 DistanceMap.
erase(DI);
1095bool TwoAddressInstructionImpl::isDefTooClose(
Register Reg,
unsigned Dist,
1103 if (DDI == DistanceMap.
end())
1105 unsigned DefDist = DDI->second;
1106 assert(Dist > DefDist &&
"Visited def already?");
1116bool TwoAddressInstructionImpl::rescheduleKillAboveMI(
1124 MachineInstr *
MI = &*mi;
1125 auto DI = DistanceMap.
find(
MI);
1126 if (DI == DistanceMap.
end())
1130 MachineInstr *KillMI =
nullptr;
1134 "Reg should not have empty live interval.");
1137 LiveInterval::const_iterator
I = LI.
find(MBBEndIdx);
1138 if (
I != LI.
end() &&
I->start < MBBEndIdx)
1146 if (!KillMI ||
MI == KillMI)
1154 bool IsCopySrcPhys, IsCopyDstPhys;
1159 if (!isCopyToReg(*KillMI, CopySrcReg, CopyDstReg, IsCopySrcPhys,
1163 if (CopySrcReg !=
Reg || IsCopySrcPhys || !IsCopyDstPhys)
1171 bool SeenStore =
true;
1179 for (
const MachineOperand &MO : KillMI->
operands()) {
1186 if (isDefTooClose(MOReg, DI->second,
MI))
1188 bool isKill = isPlainlyKilled(MO);
1189 if (MOReg ==
Reg && !isKill)
1191 Uses.push_back(MOReg);
1192 if (isKill && MOReg !=
Reg)
1202 unsigned NumVisited = 0;
1203 for (MachineInstr &OtherMI :
1206 if (OtherMI.isDebugOrPseudoInstr())
1208 if (NumVisited > 10)
1211 if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
1212 OtherMI.isBranch() || OtherMI.isTerminator())
1216 for (
const MachineOperand &MO : OtherMI.operands()) {
1223 if (regOverlapsSet(Defs, MOReg))
1227 if (regOverlapsSet(Kills, MOReg))
1230 if (&OtherMI !=
MI && MOReg ==
Reg && !isPlainlyKilled(MO))
1239 if (regOverlapsSet(
Uses, MOReg))
1241 if (MOReg.
isPhysical() && regOverlapsSet(LiveDefs, MOReg))
1250 while (InsertPos !=
MBB->
begin() && std::prev(InsertPos)->isDebugInstr())
1254 while (std::prev(From)->isDebugInstr())
1258 nmi = std::prev(InsertPos);
1259 DistanceMap.
erase(DI);
1285bool TwoAddressInstructionImpl::tryInstructionCommute(MachineInstr *
MI,
1290 if (!
MI->isCommutable())
1293 bool MadeChange =
false;
1294 Register DstOpReg =
MI->getOperand(DstOpIdx).getReg();
1295 Register BaseOpReg =
MI->getOperand(BaseOpIdx).getReg();
1296 unsigned OpsNum =
MI->getDesc().getNumOperands();
1297 unsigned OtherOpIdx =
MI->getDesc().getNumDefs();
1298 for (; OtherOpIdx < OpsNum; OtherOpIdx++) {
1303 if (OtherOpIdx == BaseOpIdx || !
MI->getOperand(OtherOpIdx).isReg() ||
1304 !
TII->findCommutedOpIndices(*
MI, BaseOpIdx, OtherOpIdx))
1307 Register OtherOpReg =
MI->getOperand(OtherOpIdx).getReg();
1308 bool AggressiveCommute =
false;
1312 bool OtherOpKilled = isKilled(*
MI, OtherOpReg,
false);
1313 bool DoCommute = !BaseOpKilled && OtherOpKilled;
1316 isProfitableToCommute(DstOpReg, BaseOpReg, OtherOpReg,
MI, Dist)) {
1318 AggressiveCommute =
true;
1322 if (DoCommute && commuteInstruction(
MI, DstOpIdx, BaseOpIdx, OtherOpIdx,
1326 if (AggressiveCommute)
1333 BaseOpReg = OtherOpReg;
1334 BaseOpKilled = OtherOpKilled;
1337 OpsNum =
MI->getDesc().getNumOperands();
1350bool TwoAddressInstructionImpl::tryInstructionTransform(
1352 unsigned SrcIdx,
unsigned DstIdx,
unsigned &Dist,
bool shouldOnlyCommute) {
1353 if (OptLevel == CodeGenOptLevel::None)
1356 MachineInstr &
MI = *mi;
1357 Register regA =
MI.getOperand(DstIdx).getReg();
1358 Register regB =
MI.getOperand(SrcIdx).getReg();
1360 assert(regB.
isVirtual() &&
"cannot make instruction into two-address form");
1361 bool regBKilled = isKilled(
MI, regB,
true);
1366 bool Commuted = tryInstructionCommute(&
MI, DstIdx, SrcIdx, regBKilled, Dist);
1379 if (Commuted && !ConvertibleTo3Addr)
1382 if (shouldOnlyCommute)
1395 regB =
MI.getOperand(SrcIdx).getReg();
1396 regBKilled = isKilled(
MI, regB,
true);
1399 if (ConvertibleTo3Addr) {
1402 if (!regBKilled || isProfitableToConv3Addr(regA, regB)) {
1404 if (convertInstTo3Addr(mi, nmi, regA, regB, Dist)) {
1405 ++NumConvertedTo3Addr;
1430 if (
MI.mayLoad() && !regBKilled) {
1432 unsigned LoadRegIndex;
1434 TII->getOpcodeAfterMemoryUnfold(
MI.getOpcode(),
1439 const MCInstrDesc &UnfoldMCID =
TII->get(NewOpc);
1444 TII->getRegClass(UnfoldMCID, LoadRegIndex));
1446 SmallVector<MachineInstr *, 2> NewMIs;
1447 if (!
TII->unfoldMemoryOperand(*MF,
MI,
Reg,
1454 "Unfolded a load into multiple instructions!");
1456 NewMIs[1]->addRegisterKilled(
Reg,
TRI);
1462 DistanceMap.
insert(std::make_pair(NewMIs[0], Dist++));
1463 DistanceMap.
insert(std::make_pair(NewMIs[1], Dist));
1466 <<
"2addr: NEW INST: " << *NewMIs[1]);
1469 unsigned NewDstIdx =
1470 NewMIs[1]->findRegisterDefOperandIdx(regA,
nullptr);
1471 unsigned NewSrcIdx =
1472 NewMIs[1]->findRegisterUseOperandIdx(regB,
nullptr);
1474 bool TransformResult =
1475 tryInstructionTransform(NewMI, mi, NewSrcIdx, NewDstIdx, Dist,
true);
1476 (void)TransformResult;
1477 assert(!TransformResult &&
1478 "tryInstructionTransform() should return false.");
1479 if (NewMIs[1]->getOperand(NewSrcIdx).isKill()) {
1483 for (
const MachineOperand &MO :
MI.operands()) {
1487 if (NewMIs[0]->killsRegister(MO.
getReg(),
nullptr))
1492 "Kill missing after load unfold!");
1497 if (NewMIs[1]->registerDefIsDead(MO.
getReg(),
1503 "Dead flag missing after load unfold!");
1514 for (
const MachineOperand &MO :
MI.operands()) {
1522 MI.eraseFromParent();
1538 NewMIs[0]->eraseFromParent();
1539 NewMIs[1]->eraseFromParent();
1540 DistanceMap.
erase(NewMIs[0]);
1541 DistanceMap.
erase(NewMIs[1]);
1554bool TwoAddressInstructionImpl::collectTiedOperands(
1555 MachineInstr *
MI, TiedOperandMap &TiedOperands) {
1556 bool AnyOps =
false;
1557 unsigned NumOps =
MI->getNumOperands();
1559 for (
unsigned SrcIdx = 0; SrcIdx <
NumOps; ++SrcIdx) {
1560 unsigned DstIdx = 0;
1561 if (!
MI->isRegTiedToDefOperand(SrcIdx, &DstIdx))
1564 MachineOperand &SrcMO =
MI->getOperand(SrcIdx);
1565 MachineOperand &DstMO =
MI->getOperand(DstIdx);
1569 if (SrcReg == DstReg)
1572 assert(SrcReg && SrcMO.
isUse() &&
"two address instruction invalid");
1586 TiedOperands[SrcReg].push_back(std::make_pair(SrcIdx, DstIdx));
1593void TwoAddressInstructionImpl::processTiedPairs(MachineInstr *
MI,
1594 TiedPairList &TiedPairs,
1596 bool IsEarlyClobber =
llvm::any_of(TiedPairs, [
MI](
auto const &TP) {
1597 return MI->getOperand(TP.second).isEarlyClobber();
1600 bool RemovedKillFlag =
false;
1601 bool AllUsesCopied =
true;
1603 SlotIndex LastCopyIdx;
1605 unsigned SubRegB = 0;
1606 for (
auto &TP : TiedPairs) {
1607 unsigned SrcIdx = TP.first;
1608 unsigned DstIdx = TP.second;
1610 const MachineOperand &DstMO =
MI->getOperand(DstIdx);
1615 RegB =
MI->getOperand(SrcIdx).getReg();
1616 SubRegB =
MI->getOperand(SrcIdx).getSubReg();
1622 AllUsesCopied =
false;
1625 LastCopiedReg = RegA;
1627 assert(RegB.
isVirtual() &&
"cannot make instruction into two-address form");
1633 for (
unsigned i = 0; i !=
MI->getNumOperands(); ++i)
1635 !
MI->getOperand(i).isReg() ||
1636 MI->getOperand(i).getReg() != RegA);
1640 MachineInstrBuilder MIB =
BuildMI(*
MI->getParent(),
MI,
MI->getDebugLoc(),
1641 TII->get(TargetOpcode::COPY), RegA);
1644 MIB.
addReg(RegB, {}, SubRegB);
1650 "tied subregister must be a truncation");
1655 &&
"tied subregister must be a truncation");
1662 DistanceMap.
insert(std::make_pair(&*PrevMI, Dist));
1663 DistanceMap[
MI] = ++Dist;
1673 LI.
addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1676 S.addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1679 for (MCRegUnit Unit :
TRI->regunits(RegA)) {
1683 LR->
addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1691 MachineOperand &MO =
MI->getOperand(SrcIdx);
1693 "inconsistent operand info for 2-reg pass");
1694 if (isPlainlyKilled(MO)) {
1696 RemovedKillFlag =
true;
1709 if (
MI->isBundle()) {
1713 "tied subregister uses in bundled instructions not supported");
1720 if (AllUsesCopied) {
1723 for (MachineOperand &MO :
MI->all_uses()) {
1724 if (MO.
getReg() == RegB) {
1725 if (MO.
getSubReg() == SubRegB && !IsEarlyClobber) {
1726 if (isPlainlyKilled(MO)) {
1728 RemovedKillFlag =
true;
1730 MO.
setReg(LastCopiedReg);
1733 RemainingUses |=
TRI->getSubRegIndexLaneMask(MO.
getSubReg());
1739 if (RemovedKillFlag && RemainingUses.
none() && LV &&
1746 if (RemovedKillFlag && RemainingUses.
none())
1747 SrcRegMap[LastCopiedReg] = RegB;
1752 auto Shrink = [=](
LiveRange &LR, LaneBitmask LaneMask) {
1756 if ((LaneMask & RemainingUses).
any())
1760 S->
end = LastCopyIdx;
1765 bool ShrinkLI =
true;
1767 ShrinkLI &= Shrink(S, S.LaneMask);
1771 }
else if (RemovedKillFlag) {
1776 for (MachineOperand &MO :
MI->all_uses()) {
1777 if (MO.
getReg() == RegB) {
1792bool TwoAddressInstructionImpl::processStatepoint(
1793 MachineInstr *
MI, TiedOperandMap &TiedOperands) {
1795 bool NeedCopy =
false;
1796 for (
auto &TO : TiedOperands) {
1798 if (TO.second.size() != 1) {
1803 unsigned SrcIdx = TO.second[0].first;
1804 unsigned DstIdx = TO.second[0].second;
1806 MachineOperand &DstMO =
MI->getOperand(DstIdx);
1809 assert(RegB ==
MI->getOperand(SrcIdx).getReg());
1822 if (DefLI.overlaps(UseLI)) {
1824 <<
" UseLI overlaps with DefLI\n");
1833 <<
" not killed by statepoint\n");
1840 <<
" to register class of " <<
printReg(RegA,
TRI, 0)
1852 for (
const VNInfo *VNI :
Other.valnos) {
1856 for (
auto &S :
Other) {
1857 VNInfo *VNI = NewVNIs[S.
valno->
id];
1858 LiveRange::Segment NewSeg(S.
start, S.
end, VNI);
1865 if (
MI->getOperand(SrcIdx).isKill())
1867 LiveVariables::VarInfo &SrcInfo = LV->
getVarInfo(RegB);
1868 LiveVariables::VarInfo &DstInfo = LV->
getVarInfo(RegA);
1871 for (
auto *KillMI : DstInfo.
Kills)
1879bool TwoAddressInstructionImpl::run() {
1880 bool MadeChange =
false;
1882 LLVM_DEBUG(
dbgs() <<
"********** REWRITING TWO-ADDR INSTRS **********\n");
1891 TiedOperandMap TiedOperands;
1892 for (MachineBasicBlock &
MBBI : *MF) {
1895 DistanceMap.
clear();
1903 if (mi->isDebugInstr()) {
1910 if (mi->isRegSequence()) {
1911 eliminateRegSequence(mi);
1915 DistanceMap.
insert(std::make_pair(&*mi, ++Dist));
1921 if (!collectTiedOperands(&*mi, TiedOperands)) {
1922 removeClobberedSrcRegMap(&*mi);
1927 ++NumTwoAddressInstrs;
1934 if (TiedOperands.size() == 1) {
1935 SmallVectorImpl<std::pair<unsigned, unsigned>> &TiedPairs
1936 = TiedOperands.begin()->second;
1937 if (TiedPairs.
size() == 1) {
1938 unsigned SrcIdx = TiedPairs[0].first;
1939 unsigned DstIdx = TiedPairs[0].second;
1940 Register SrcReg = mi->getOperand(SrcIdx).getReg();
1941 Register DstReg = mi->getOperand(DstIdx).getReg();
1942 if (SrcReg != DstReg &&
1943 tryInstructionTransform(mi, nmi, SrcIdx, DstIdx, Dist,
false)) {
1946 TiedOperands.clear();
1947 removeClobberedSrcRegMap(&*mi);
1954 if (mi->getOpcode() == TargetOpcode::STATEPOINT &&
1955 processStatepoint(&*mi, TiedOperands)) {
1956 TiedOperands.clear();
1963 for (
auto &TO : TiedOperands) {
1964 processTiedPairs(&*mi, TO.second, Dist);
1969 if (mi->isInsertSubreg()) {
1972 unsigned SubIdx = mi->getOperand(3).getImm();
1973 mi->removeOperand(3);
1974 assert(mi->getOperand(0).getSubReg() == 0 &&
"Unexpected subreg idx");
1975 mi->getOperand(0).setSubReg(SubIdx);
1976 mi->getOperand(0).setIsUndef(mi->getOperand(1).isUndef());
1977 mi->removeOperand(1);
1978 mi->setDesc(
TII->get(TargetOpcode::COPY));
1988 LaneBitmask LaneMask =
1989 TRI->getSubRegIndexLaneMask(mi->getOperand(0).getSubReg());
1992 if ((S.LaneMask & LaneMask).none()) {
1993 LiveRange::iterator DefSeg = S.FindSegmentContaining(Idx);
1994 if (mi->getOperand(0).isUndef()) {
1995 S.removeValNo(DefSeg->valno);
1997 LiveRange::iterator UseSeg = std::prev(DefSeg);
1998 S.MergeValueNumberInto(DefSeg->valno, UseSeg->valno);
2016 TiedOperands.clear();
2017 removeClobberedSrcRegMap(&*mi);
2035void TwoAddressInstructionImpl::eliminateRegSequence(
2037 MachineInstr &
MI = *
MBBI;
2041 VNInfo *DefVN =
nullptr;
2044 for (
unsigned i = 1, e =
MI.getNumOperands(); i < e; i += 2)
2057 unsigned SubReg =
Use.getSubReg();
2059 (!LIS ||
Use.getParent()->hasTiedAndOtherReadOf(DstReg, SubReg)))
2060 KeepLanes |=
TRI->getSubRegIndexLaneMask(SubReg);
2064 bool DefEmitted =
false;
2065 for (
unsigned i = 1, e =
MI.getNumOperands(); i < e; i += 2) {
2066 MachineOperand &UseMO =
MI.getOperand(i);
2068 unsigned SubIdx =
MI.getOperand(i+1).getImm();
2071 LaneBitmask LaneMask =
TRI->getSubRegIndexLaneMask(SubIdx);
2072 if ((KeepLanes & LaneMask).
none()) {
2073 UndefLanes |= LaneMask;
2080 bool isKill = UseMO.
isKill();
2082 for (
unsigned j = i + 2;
j <
e;
j += 2)
2083 if (
MI.getOperand(j).getReg() == SrcReg) {
2084 MI.getOperand(j).setIsKill();
2091 MachineInstr *CopyMI =
BuildMI(*
MI.getParent(),
MI,
MI.getDebugLoc(),
2092 TII->get(TargetOpcode::COPY))
2093 .
addReg(DstReg, RegState::Define, SubIdx)
2117 MI.setDesc(
TII->get(TargetOpcode::IMPLICIT_DEF));
2118 for (
int j =
MI.getNumOperands() - 1, ee = 0; j > ee; --j)
2119 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)
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.
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.
bool shouldSkipOptimizationForOptBisect(IRUnitRef IR)