68#define DEBUG_TYPE "twoaddressinstruction"
70STATISTIC(NumTwoAddressInstrs,
"Number of two-address instructions");
71STATISTIC(NumCommuted ,
"Number of instructions commuted to coalesce");
72STATISTIC(NumAggrCommuted ,
"Number of instructions aggressively commuted");
73STATISTIC(NumConvertedTo3Addr,
"Number of instructions promoted to 3-address");
74STATISTIC(NumReSchedUps,
"Number of instructions re-scheduled up");
75STATISTIC(NumReSchedDowns,
"Number of instructions re-scheduled down");
80 cl::desc(
"Coalesce copies by rescheduling (default=true)"),
87 cl::desc(
"Maximum number of dataflow edges to traverse when evaluating "
88 "the benefit of commuting operands"));
92class TwoAddressInstructionImpl {
126 bool noUseAfterLastDef(
Register Reg,
unsigned Dist,
unsigned &LastDef);
129 bool &IsSrcPhys,
bool &IsDstPhys)
const;
139 bool &IsDstPhys)
const;
154 unsigned RegBIdx,
unsigned RegCIdx,
unsigned Dist);
171 unsigned SrcIdx,
unsigned DstIdx,
172 unsigned &Dist,
bool shouldOnlyCommute);
187 void processTiedPairs(
MachineInstr *
MI, TiedPairList&,
unsigned &Dist);
189 bool processStatepoint(
MachineInstr *
MI, TiedOperandMap &TiedOperands);
203 TwoAddressInstructionLegacyPass() : MachineFunctionPass(ID) {
209 bool runOnMachineFunction(MachineFunction &MF)
override {
210 TwoAddressInstructionImpl Impl(MF,
this);
214 Impl.setOptLevel(CodeGenOptLevel::None);
218 void getAnalysisUsage(AnalysisUsage &AU)
const override {
238 TwoAddressInstructionImpl Impl(MF, MFAM);
256char TwoAddressInstructionLegacyPass::ID = 0;
261 "Two-Address instruction pass",
false,
false)
266TwoAddressInstructionImpl::TwoAddressInstructionImpl(
268 : MF(&Func),
TII(Func.getSubtarget().getInstrInfo()),
269 TRI(Func.getSubtarget().getRegisterInfo()),
270 InstrItins(Func.getSubtarget().getInstrItineraryData()),
271 MRI(&Func.getRegInfo()),
274 OptLevel(Func.getTarget().getOptLevel()) {
280TwoAddressInstructionImpl::TwoAddressInstructionImpl(
MachineFunction &Func,
282 : MF(&
Func),
TII(
Func.getSubtarget().getInstrInfo()),
283 TRI(
Func.getSubtarget().getRegisterInfo()),
284 InstrItins(
Func.getSubtarget().getInstrItineraryData()),
285 MRI(&
Func.getRegInfo()), OptLevel(
Func.getTarget().getOptLevel()) {
287 LV = LVWrapper ? &LVWrapper->
getLV() :
nullptr;
289 LIS = LISWrapper ? &LISWrapper->
getLIS() :
nullptr;
291 AA = &AAPass->getAAResults();
298TwoAddressInstructionImpl::getSingleDef(
Register Reg,
300 MachineInstr *
Ret =
nullptr;
301 for (MachineInstr &
DefMI :
MRI->def_instructions(
Reg)) {
302 if (
DefMI.getParent() != BB ||
DefMI.isDebugValue())
306 else if (Ret != &
DefMI)
319bool TwoAddressInstructionImpl::isRevCopyChain(
Register FromReg,
Register ToReg,
322 for (
int i = 0; i < Maxlen; i++) {
323 MachineInstr *
Def = getSingleDef(TmpReg,
MBB);
324 if (!Def || !
Def->isCopy())
327 TmpReg =
Def->getOperand(1).getReg();
339bool TwoAddressInstructionImpl::noUseAfterLastDef(
Register Reg,
unsigned Dist,
342 unsigned LastUse = Dist;
343 for (MachineOperand &MO :
MRI->reg_operands(
Reg)) {
344 MachineInstr *
MI = MO.getParent();
345 if (
MI->getParent() !=
MBB ||
MI->isDebugValue())
347 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.
find(
MI);
348 if (DI == DistanceMap.
end())
350 if (MO.isUse() && DI->second < LastUse)
351 LastUse = DI->second;
352 if (MO.isDef() && DI->second > LastDef)
353 LastDef = DI->second;
356 return !(LastUse > LastDef && LastUse < Dist);
362bool TwoAddressInstructionImpl::isCopyToReg(MachineInstr &
MI,
Register &SrcReg,
364 bool &IsDstPhys)
const {
368 DstReg =
MI.getOperand(0).getReg();
369 SrcReg =
MI.getOperand(1).getReg();
370 }
else if (
MI.isInsertSubreg() ||
MI.isSubregToReg()) {
371 DstReg =
MI.getOperand(0).getReg();
372 SrcReg =
MI.getOperand(2).getReg();
382bool TwoAddressInstructionImpl::isPlainlyKilled(
const MachineInstr *
MI,
389 LiveInterval::const_iterator
I = LR.
find(useIdx);
390 assert(
I != LR.
end() &&
"Reg must be live-in to use.");
396bool TwoAddressInstructionImpl::isPlainlyKilled(
const MachineInstr *
MI,
411 return isPlainlyKilled(MI, LIS->getRegUnit(U));
415 return MI->killsRegister(
Reg,
nullptr);
420bool TwoAddressInstructionImpl::isPlainlyKilled(
421 const MachineOperand &MO)
const {
442bool TwoAddressInstructionImpl::isKilled(MachineInstr &
MI,
Register Reg,
443 bool allowFalsePositives)
const {
456 if (std::next(Begin) !=
MRI->def_end())
459 bool IsSrcPhys, IsDstPhys;
463 if (!isCopyToReg(*
DefMI, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
472 for (
unsigned i = 0,
NumOps =
MI.getNumOperands(); i !=
NumOps; ++i) {
477 if (
MI.isRegTiedToDefOperand(i, &ti)) {
478 DstReg =
MI.getOperand(ti).getReg();
487MachineInstr *TwoAddressInstructionImpl::findOnlyInterestingUse(
489 bool &IsDstPhys)
const {
490 MachineOperand *UseOp =
nullptr;
491 for (MachineOperand &MO :
MRI->use_nodbg_operands(
Reg)) {
496 if (
MI->getParent() !=
MBB)
498 if (isPlainlyKilled(
MI,
Reg))
507 if (isCopyToReg(
UseMI, SrcReg, DstReg, IsSrcPhys, IsDstPhys)) {
516 if (
UseMI.isCommutable()) {
519 if (
TII->findCommutedOpIndices(
UseMI, Src1, Src2)) {
520 MachineOperand &MO =
UseMI.getOperand(Src1);
535 while (
Reg.isVirtual()) {
537 if (
SI == RegMap.
end())
541 if (
Reg.isPhysical())
547bool TwoAddressInstructionImpl::regsAreCompatible(
Register RegA,
553 return TRI->regsOverlap(RegA, RegB);
557void TwoAddressInstructionImpl::removeMapRegEntry(
558 const MachineOperand &MO, DenseMap<Register, Register> &RegMap)
const {
561 "removeMapRegEntry must be called with a register or regmask operand.");
564 for (
auto SI : RegMap) {
571 if (
TRI->regsOverlap(ToReg,
Reg))
577 for (
auto SrcReg : Srcs)
578 RegMap.erase(SrcReg);
589void TwoAddressInstructionImpl::removeClobberedSrcRegMap(MachineInstr *
MI) {
602 if (!Dst || Dst.isVirtual())
606 if (regsAreCompatible(Dst,
getMappedReg(Src, SrcRegMap)))
610 for (
const MachineOperand &MO :
MI->operands()) {
612 removeMapRegEntry(MO, SrcRegMap);
620 removeMapRegEntry(MO, SrcRegMap);
625bool TwoAddressInstructionImpl::regOverlapsSet(
626 const SmallVectorImpl<Register> &Set,
Register Reg)
const {
628 if (
TRI->regsOverlap(R,
Reg))
636bool TwoAddressInstructionImpl::isProfitableToCommute(
Register RegA,
641 if (OptLevel == CodeGenOptLevel::None)
662 if (!isPlainlyKilled(
MI, RegC))
679 bool CompB = FromRegB && regsAreCompatible(FromRegB, ToRegA);
680 bool CompC = FromRegC && regsAreCompatible(FromRegC, ToRegA);
686 if ((!FromRegB && CompC) || (FromRegB && !CompB && (!FromRegC || CompC)))
692 if ((!FromRegC && CompB) || (FromRegC && !CompC && (!FromRegB || CompB)))
698 unsigned LastDefC = 0;
699 if (!noUseAfterLastDef(RegC, Dist, LastDefC))
704 unsigned LastDefB = 0;
705 if (!noUseAfterLastDef(RegB, Dist, LastDefB))
731 if (
TII->hasCommutePreference(*
MI, Commute))
736 return LastDefB && LastDefC && LastDefC > LastDefB;
741bool TwoAddressInstructionImpl::commuteInstruction(MachineInstr *
MI,
746 Register RegC =
MI->getOperand(RegCIdx).getReg();
748 MachineInstr *NewMI =
TII->commuteInstruction(*
MI,
false, RegBIdx, RegCIdx);
750 if (NewMI ==
nullptr) {
757 "TargetInstrInfo::commuteInstruction() should not return a new "
758 "instruction unless it was requested.");
763 Register RegA =
MI->getOperand(DstIdx).getReg();
764 SrcRegMap[RegA] = FromRegC;
772bool TwoAddressInstructionImpl::isProfitableToConv3Addr(
Register RegA,
784 return (ToRegA && !regsAreCompatible(FromRegB, ToRegA));
789bool TwoAddressInstructionImpl::convertInstTo3Addr(
792 MachineInstrSpan MIS(mi,
MBB);
793 MachineInstr *NewMI =
TII->convertToThreeAddress(*mi, LV, LIS);
801 if (
auto OldInstrNum = mi->peekDebugInstrNum()) {
802 assert(mi->getNumExplicitDefs() == 1);
806 unsigned OldIdx = mi->defs().begin()->getOperandNo();
807 unsigned NewIdx = NewMI->
defs().
begin()->getOperandNo();
812 std::make_pair(NewInstrNum, NewIdx));
817 for (MachineInstr &
MI : MIS)
818 DistanceMap.
insert(std::make_pair(&
MI, Dist++));
824 SrcRegMap.
erase(RegA);
825 DstRegMap.
erase(RegB);
831void TwoAddressInstructionImpl::scanUses(
Register DstReg) {
837 while (MachineInstr *
UseMI =
838 findOnlyInterestingUse(
Reg,
MBB, IsCopy, NewReg, IsDstPhys)) {
839 if (IsCopy && !Processed.insert(
UseMI).second)
842 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.
find(
UseMI);
843 if (DI != DistanceMap.
end())
851 SrcRegMap[NewReg] =
Reg;
856 if (!VirtRegPairs.
empty()) {
858 while (!VirtRegPairs.
empty()) {
860 bool isNew = DstRegMap.
insert(std::make_pair(FromReg, ToReg)).second;
862 assert(DstRegMap[FromReg] == ToReg &&
"Can't map to two dst registers!");
865 bool isNew = DstRegMap.
insert(std::make_pair(DstReg, ToReg)).second;
867 assert(DstRegMap[DstReg] == ToReg &&
"Can't map to two dst registers!");
883void TwoAddressInstructionImpl::processCopy(MachineInstr *
MI) {
884 if (Processed.count(
MI))
887 bool IsSrcPhys, IsDstPhys;
889 if (!isCopyToReg(*
MI, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
892 if (IsDstPhys && !IsSrcPhys) {
893 DstRegMap.
insert(std::make_pair(SrcReg, DstReg));
894 }
else if (!IsDstPhys && IsSrcPhys) {
895 bool isNew = SrcRegMap.
insert(std::make_pair(DstReg, SrcReg)).second;
897 assert(SrcRegMap[DstReg] == SrcReg &&
898 "Can't map to two src physical registers!");
903 Processed.insert(
MI);
909bool TwoAddressInstructionImpl::rescheduleMIBelowKill(
917 MachineInstr *
MI = &*mi;
918 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.
find(
MI);
919 if (DI == DistanceMap.
end())
923 MachineInstr *KillMI =
nullptr;
927 "Reg should not have empty live interval.");
930 LiveInterval::const_iterator
I = LI.
find(MBBEndIdx);
931 if (
I != LI.
end() &&
I->start < MBBEndIdx)
952 bool SeenStore =
true;
953 if (!
MI->isSafeToMove(SeenStore))
963 for (
const MachineOperand &MO :
MI->operands()) {
972 Uses.push_back(MOReg);
973 if (MOReg !=
Reg && isPlainlyKilled(MO))
982 while (End !=
MBB->
end()) {
984 if (End->isCopy() && regOverlapsSet(Defs, End->getOperand(1).getReg()))
985 Defs.
push_back(End->getOperand(0).getReg());
992 unsigned NumVisited = 0;
995 for (MachineInstr &OtherMI :
make_range(End, KillPos)) {
997 if (OtherMI.isDebugOrPseudoInstr())
1002 if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
1003 OtherMI.isBranch() || OtherMI.isTerminator())
1006 for (
const MachineOperand &MO : OtherMI.operands()) {
1013 if (regOverlapsSet(
Uses, MOReg))
1016 if (!MO.
isDead() && regOverlapsSet(Defs, MOReg))
1022 if (regOverlapsSet(Defs, MOReg))
1024 bool isKill = isPlainlyKilled(MO);
1025 if (MOReg !=
Reg && ((isKill && regOverlapsSet(
Uses, MOReg)) ||
1026 regOverlapsSet(Kills, MOReg)))
1029 if (MOReg ==
Reg && !isKill)
1033 assert((MOReg !=
Reg || &OtherMI == KillMI) &&
1034 "Found multiple kills of a register in a basic block");
1040 while (Begin !=
MBB->
begin() && std::prev(Begin)->isDebugInstr())
1049 auto CopyMI =
MBBI++;
1051 if (!CopyMI->isDebugOrPseudoInstr())
1060 DistanceMap.
erase(DI);
1076bool TwoAddressInstructionImpl::isDefTooClose(
Register Reg,
unsigned Dist,
1078 for (MachineInstr &
DefMI :
MRI->def_instructions(
Reg)) {
1083 DenseMap<MachineInstr*, unsigned>::iterator DDI = DistanceMap.
find(&
DefMI);
1084 if (DDI == DistanceMap.
end())
1086 unsigned DefDist = DDI->second;
1087 assert(Dist > DefDist &&
"Visited def already?");
1097bool TwoAddressInstructionImpl::rescheduleKillAboveMI(
1105 MachineInstr *
MI = &*mi;
1106 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.
find(
MI);
1107 if (DI == DistanceMap.
end())
1111 MachineInstr *KillMI =
nullptr;
1115 "Reg should not have empty live interval.");
1118 LiveInterval::const_iterator
I = LI.
find(MBBEndIdx);
1119 if (
I != LI.
end() &&
I->start < MBBEndIdx)
1135 bool SeenStore =
true;
1143 for (
const MachineOperand &MO : KillMI->
operands()) {
1150 if (isDefTooClose(MOReg, DI->second,
MI))
1152 bool isKill = isPlainlyKilled(MO);
1153 if (MOReg ==
Reg && !isKill)
1155 Uses.push_back(MOReg);
1156 if (isKill && MOReg !=
Reg)
1166 unsigned NumVisited = 0;
1167 for (MachineInstr &OtherMI :
1170 if (OtherMI.isDebugOrPseudoInstr())
1172 if (NumVisited > 10)
1175 if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
1176 OtherMI.isBranch() || OtherMI.isTerminator())
1180 for (
const MachineOperand &MO : OtherMI.operands()) {
1187 if (regOverlapsSet(Defs, MOReg))
1191 if (regOverlapsSet(Kills, MOReg))
1194 if (&OtherMI !=
MI && MOReg ==
Reg && !isPlainlyKilled(MO))
1203 if (regOverlapsSet(
Uses, MOReg))
1205 if (MOReg.
isPhysical() && regOverlapsSet(LiveDefs, MOReg))
1214 while (InsertPos !=
MBB->
begin() && std::prev(InsertPos)->isDebugInstr())
1218 while (std::prev(From)->isDebugInstr())
1222 nmi = std::prev(InsertPos);
1223 DistanceMap.
erase(DI);
1249bool TwoAddressInstructionImpl::tryInstructionCommute(MachineInstr *
MI,
1254 if (!
MI->isCommutable())
1257 bool MadeChange =
false;
1258 Register DstOpReg =
MI->getOperand(DstOpIdx).getReg();
1259 Register BaseOpReg =
MI->getOperand(BaseOpIdx).getReg();
1260 unsigned OpsNum =
MI->getDesc().getNumOperands();
1261 unsigned OtherOpIdx =
MI->getDesc().getNumDefs();
1262 for (; OtherOpIdx < OpsNum; OtherOpIdx++) {
1267 if (OtherOpIdx == BaseOpIdx || !
MI->getOperand(OtherOpIdx).isReg() ||
1268 !
TII->findCommutedOpIndices(*
MI, BaseOpIdx, OtherOpIdx))
1271 Register OtherOpReg =
MI->getOperand(OtherOpIdx).getReg();
1272 bool AggressiveCommute =
false;
1276 bool OtherOpKilled = isKilled(*
MI, OtherOpReg,
false);
1277 bool DoCommute = !BaseOpKilled && OtherOpKilled;
1280 isProfitableToCommute(DstOpReg, BaseOpReg, OtherOpReg,
MI, Dist)) {
1282 AggressiveCommute =
true;
1286 if (DoCommute && commuteInstruction(
MI, DstOpIdx, BaseOpIdx, OtherOpIdx,
1290 if (AggressiveCommute)
1297 BaseOpReg = OtherOpReg;
1298 BaseOpKilled = OtherOpKilled;
1301 OpsNum =
MI->getDesc().getNumOperands();
1314bool TwoAddressInstructionImpl::tryInstructionTransform(
1316 unsigned SrcIdx,
unsigned DstIdx,
unsigned &Dist,
bool shouldOnlyCommute) {
1317 if (OptLevel == CodeGenOptLevel::None)
1320 MachineInstr &
MI = *mi;
1321 Register regA =
MI.getOperand(DstIdx).getReg();
1322 Register regB =
MI.getOperand(SrcIdx).getReg();
1324 assert(regB.
isVirtual() &&
"cannot make instruction into two-address form");
1325 bool regBKilled = isKilled(
MI, regB,
true);
1330 bool Commuted = tryInstructionCommute(&
MI, DstIdx, SrcIdx, regBKilled, Dist);
1340 if (Commuted && !
MI.isConvertibleTo3Addr())
1343 if (shouldOnlyCommute)
1356 regB =
MI.getOperand(SrcIdx).getReg();
1357 regBKilled = isKilled(
MI, regB,
true);
1360 if (
MI.isConvertibleTo3Addr()) {
1363 if (!regBKilled || isProfitableToConv3Addr(regA, regB)) {
1365 if (convertInstTo3Addr(mi, nmi, regA, regB, Dist)) {
1366 ++NumConvertedTo3Addr;
1391 if (
MI.mayLoad() && !regBKilled) {
1393 unsigned LoadRegIndex;
1395 TII->getOpcodeAfterMemoryUnfold(
MI.getOpcode(),
1400 const MCInstrDesc &UnfoldMCID =
TII->get(NewOpc);
1404 const TargetRegisterClass *RC =
TRI->getAllocatableClass(
1405 TII->getRegClass(UnfoldMCID, LoadRegIndex,
TRI));
1407 SmallVector<MachineInstr *, 2> NewMIs;
1408 if (!
TII->unfoldMemoryOperand(*MF,
MI,
Reg,
1415 "Unfolded a load into multiple instructions!");
1417 NewMIs[1]->addRegisterKilled(
Reg,
TRI);
1423 DistanceMap.
insert(std::make_pair(NewMIs[0], Dist++));
1424 DistanceMap.
insert(std::make_pair(NewMIs[1], Dist));
1427 <<
"2addr: NEW INST: " << *NewMIs[1]);
1430 unsigned NewDstIdx =
1431 NewMIs[1]->findRegisterDefOperandIdx(regA,
nullptr);
1432 unsigned NewSrcIdx =
1433 NewMIs[1]->findRegisterUseOperandIdx(regB,
nullptr);
1435 bool TransformResult =
1436 tryInstructionTransform(NewMI, mi, NewSrcIdx, NewDstIdx, Dist,
true);
1437 (void)TransformResult;
1438 assert(!TransformResult &&
1439 "tryInstructionTransform() should return false.");
1440 if (NewMIs[1]->getOperand(NewSrcIdx).isKill()) {
1444 for (
const MachineOperand &MO :
MI.operands()) {
1448 if (NewMIs[0]->killsRegister(MO.
getReg(),
nullptr))
1453 "Kill missing after load unfold!");
1458 if (NewMIs[1]->registerDefIsDead(MO.
getReg(),
1464 "Dead flag missing after load unfold!");
1475 for (
const MachineOperand &MO :
MI.operands()) {
1483 MI.eraseFromParent();
1499 NewMIs[0]->eraseFromParent();
1500 NewMIs[1]->eraseFromParent();
1501 DistanceMap.
erase(NewMIs[0]);
1502 DistanceMap.
erase(NewMIs[1]);
1515bool TwoAddressInstructionImpl::collectTiedOperands(
1516 MachineInstr *
MI, TiedOperandMap &TiedOperands) {
1517 bool AnyOps =
false;
1518 unsigned NumOps =
MI->getNumOperands();
1520 for (
unsigned SrcIdx = 0; SrcIdx <
NumOps; ++SrcIdx) {
1521 unsigned DstIdx = 0;
1522 if (!
MI->isRegTiedToDefOperand(SrcIdx, &DstIdx))
1525 MachineOperand &SrcMO =
MI->getOperand(SrcIdx);
1526 MachineOperand &DstMO =
MI->getOperand(DstIdx);
1530 if (SrcReg == DstReg)
1533 assert(SrcReg && SrcMO.
isUse() &&
"two address instruction invalid");
1539 const TargetRegisterClass *RC =
MRI->getRegClass(SrcReg);
1540 MRI->constrainRegClass(DstReg, RC);
1547 TiedOperands[SrcReg].push_back(std::make_pair(SrcIdx, DstIdx));
1554void TwoAddressInstructionImpl::processTiedPairs(MachineInstr *
MI,
1555 TiedPairList &TiedPairs,
1557 bool IsEarlyClobber =
llvm::any_of(TiedPairs, [
MI](
auto const &TP) {
1558 return MI->getOperand(TP.second).isEarlyClobber();
1561 bool RemovedKillFlag =
false;
1562 bool AllUsesCopied =
true;
1564 SlotIndex LastCopyIdx;
1566 unsigned SubRegB = 0;
1567 for (
auto &TP : TiedPairs) {
1568 unsigned SrcIdx = TP.first;
1569 unsigned DstIdx = TP.second;
1571 const MachineOperand &DstMO =
MI->getOperand(DstIdx);
1576 RegB =
MI->getOperand(SrcIdx).getReg();
1577 SubRegB =
MI->getOperand(SrcIdx).getSubReg();
1583 AllUsesCopied =
false;
1586 LastCopiedReg = RegA;
1588 assert(RegB.
isVirtual() &&
"cannot make instruction into two-address form");
1594 for (
unsigned i = 0; i !=
MI->getNumOperands(); ++i)
1596 !
MI->getOperand(i).isReg() ||
1597 MI->getOperand(i).getReg() != RegA);
1601 MachineInstrBuilder MIB =
BuildMI(*
MI->getParent(),
MI,
MI->getDebugLoc(),
1602 TII->get(TargetOpcode::COPY), RegA);
1605 MIB.
addReg(RegB, 0, SubRegB);
1606 const TargetRegisterClass *RC =
MRI->getRegClass(RegB);
1609 assert(
TRI->getMatchingSuperRegClass(RC,
MRI->getRegClass(RegA),
1611 "tied subregister must be a truncation");
1615 assert(
TRI->getMatchingSuperReg(RegA, SubRegB,
MRI->getRegClass(RegB))
1616 &&
"tied subregister must be a truncation");
1623 DistanceMap.
insert(std::make_pair(&*PrevMI, Dist));
1624 DistanceMap[
MI] = ++Dist;
1634 LI.
addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1637 S.addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1644 LR->
addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1652 MachineOperand &MO =
MI->getOperand(SrcIdx);
1654 "inconsistent operand info for 2-reg pass");
1655 if (isPlainlyKilled(MO)) {
1657 RemovedKillFlag =
true;
1662 MRI->constrainRegClass(RegA, RC);
1670 if (AllUsesCopied) {
1673 for (MachineOperand &MO :
MI->all_uses()) {
1674 if (MO.
getReg() == RegB) {
1675 if (MO.
getSubReg() == SubRegB && !IsEarlyClobber) {
1676 if (isPlainlyKilled(MO)) {
1678 RemovedKillFlag =
true;
1680 MO.
setReg(LastCopiedReg);
1683 RemainingUses |=
TRI->getSubRegIndexLaneMask(MO.
getSubReg());
1689 if (RemovedKillFlag && RemainingUses.
none() && LV &&
1696 if (RemovedKillFlag && RemainingUses.
none())
1697 SrcRegMap[LastCopiedReg] = RegB;
1702 auto Shrink = [=](
LiveRange &LR, LaneBitmask LaneMask) {
1706 if ((LaneMask & RemainingUses).
any())
1710 S->
end = LastCopyIdx;
1715 bool ShrinkLI =
true;
1717 ShrinkLI &= Shrink(S, S.LaneMask);
1721 }
else if (RemovedKillFlag) {
1726 for (MachineOperand &MO :
MI->all_uses()) {
1727 if (MO.
getReg() == RegB) {
1742bool TwoAddressInstructionImpl::processStatepoint(
1743 MachineInstr *
MI, TiedOperandMap &TiedOperands) {
1745 bool NeedCopy =
false;
1746 for (
auto &TO : TiedOperands) {
1748 if (TO.second.size() != 1) {
1753 unsigned SrcIdx = TO.second[0].first;
1754 unsigned DstIdx = TO.second[0].second;
1756 MachineOperand &DstMO =
MI->getOperand(DstIdx);
1759 assert(RegB ==
MI->getOperand(SrcIdx).getReg());
1772 if (DefLI.overlaps(UseLI)) {
1774 <<
" UseLI overlaps with DefLI\n");
1783 <<
" not killed by statepoint\n");
1788 if (!
MRI->constrainRegClass(RegB,
MRI->getRegClass(RegA))) {
1790 <<
" to register class of " <<
printReg(RegA,
TRI, 0)
1795 MRI->replaceRegWith(RegA, RegB);
1802 for (
const VNInfo *VNI :
Other.valnos) {
1806 for (
auto &S :
Other) {
1807 VNInfo *VNI = NewVNIs[S.
valno->
id];
1808 LiveRange::Segment NewSeg(S.
start, S.
end, VNI);
1815 if (
MI->getOperand(SrcIdx).isKill())
1817 LiveVariables::VarInfo &SrcInfo = LV->
getVarInfo(RegB);
1818 LiveVariables::VarInfo &DstInfo = LV->
getVarInfo(RegA);
1821 for (
auto *KillMI : DstInfo.
Kills)
1829bool TwoAddressInstructionImpl::run() {
1830 bool MadeChange =
false;
1832 LLVM_DEBUG(
dbgs() <<
"********** REWRITING TWO-ADDR INSTRS **********\n");
1841 TiedOperandMap TiedOperands;
1842 for (MachineBasicBlock &
MBBI : *MF) {
1845 DistanceMap.
clear();
1853 if (mi->isDebugInstr()) {
1860 if (mi->isRegSequence())
1861 eliminateRegSequence(mi);
1863 DistanceMap.
insert(std::make_pair(&*mi, ++Dist));
1869 if (!collectTiedOperands(&*mi, TiedOperands)) {
1870 removeClobberedSrcRegMap(&*mi);
1875 ++NumTwoAddressInstrs;
1882 if (TiedOperands.size() == 1) {
1883 SmallVectorImpl<std::pair<unsigned, unsigned>> &TiedPairs
1884 = TiedOperands.begin()->second;
1885 if (TiedPairs.
size() == 1) {
1886 unsigned SrcIdx = TiedPairs[0].first;
1887 unsigned DstIdx = TiedPairs[0].second;
1888 Register SrcReg = mi->getOperand(SrcIdx).getReg();
1889 Register DstReg = mi->getOperand(DstIdx).getReg();
1890 if (SrcReg != DstReg &&
1891 tryInstructionTransform(mi, nmi, SrcIdx, DstIdx, Dist,
false)) {
1894 TiedOperands.clear();
1895 removeClobberedSrcRegMap(&*mi);
1902 if (mi->getOpcode() == TargetOpcode::STATEPOINT &&
1903 processStatepoint(&*mi, TiedOperands)) {
1904 TiedOperands.clear();
1911 for (
auto &TO : TiedOperands) {
1912 processTiedPairs(&*mi, TO.second, Dist);
1917 if (mi->isInsertSubreg()) {
1920 unsigned SubIdx = mi->getOperand(3).getImm();
1921 mi->removeOperand(3);
1922 assert(mi->getOperand(0).getSubReg() == 0 &&
"Unexpected subreg idx");
1923 mi->getOperand(0).setSubReg(SubIdx);
1924 mi->getOperand(0).setIsUndef(mi->getOperand(1).isUndef());
1925 mi->removeOperand(1);
1926 mi->setDesc(
TII->get(TargetOpcode::COPY));
1936 LaneBitmask LaneMask =
1937 TRI->getSubRegIndexLaneMask(mi->getOperand(0).getSubReg());
1940 if ((S.LaneMask & LaneMask).none()) {
1941 LiveRange::iterator DefSeg = S.FindSegmentContaining(Idx);
1942 if (mi->getOperand(0).isUndef()) {
1943 S.removeValNo(DefSeg->valno);
1945 LiveRange::iterator UseSeg = std::prev(DefSeg);
1946 S.MergeValueNumberInto(DefSeg->valno, UseSeg->valno);
1964 TiedOperands.clear();
1965 removeClobberedSrcRegMap(&*mi);
1983void TwoAddressInstructionImpl::eliminateRegSequence(
1985 MachineInstr &
MI = *
MBBI;
1989 VNInfo *DefVN =
nullptr;
1992 for (
unsigned i = 1, e =
MI.getNumOperands(); i < e; i += 2)
2002 bool DefEmitted =
false;
2003 for (
unsigned i = 1, e =
MI.getNumOperands(); i < e; i += 2) {
2004 MachineOperand &UseMO =
MI.getOperand(i);
2006 unsigned SubIdx =
MI.getOperand(i+1).getImm();
2009 UndefLanes |=
TRI->getSubRegIndexLaneMask(SubIdx);
2015 bool isKill = UseMO.
isKill();
2017 for (
unsigned j = i + 2;
j <
e;
j += 2)
2018 if (
MI.getOperand(j).getReg() == SrcReg) {
2019 MI.getOperand(j).setIsKill();
2026 MachineInstr *CopyMI =
BuildMI(*
MI.getParent(),
MI,
MI.getDebugLoc(),
2027 TII->get(TargetOpcode::COPY))
2052 MI.setDesc(
TII->get(TargetOpcode::IMPLICIT_DEF));
2053 for (
int j =
MI.getNumOperands() - 1, ee = 0; j > ee; --j)
2054 MI.removeOperand(j);
2060 if (UndefLanes.
any() && DefVN &&
MRI->shouldTrackSubRegLiveness(DstReg)) {
2062 for (MachineOperand &UseOp :
MRI->use_operands(DstReg)) {
2070 LaneBitmask LaneMask =
TRI->getSubRegIndexLaneMask(
SubReg);
2071 if ((UndefLanes & LaneMask).
any())
2080 MI.eraseFromParent();
unsigned const MachineRegisterInfo * MRI
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
FunctionAnalysisManager FAM
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(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 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< unsigned > MaxDataFlowEdge("dataflow-edge-limit", cl::Hidden, cl::init(3), cl::desc("Maximum number of dataflow edges to traverse when evaluating " "the benefit of commuting operands"))
A manager for alias analyses.
A wrapper pass to provide the legacy pass manager access to a suitably prepared AAResults object.
AnalysisUsage & addPreservedID(const void *ID)
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.
LiveRange * getCachedRegUnit(unsigned Unit)
Return the live range for register unit Unit if it has already been computed, or nullptr if it hasn't...
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.
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
Analysis pass which computes a MachineDominatorTree.
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 & add(const MachineOperand &MO) const
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
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
Analysis pass that exposes the MachineLoopInfo for a machine function.
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,...
defusechain_iterator< false, true, false, true, false > def_iterator
def_iterator/def_begin/def_end - Walk all defs of the specified register.
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
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...
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.
Abstract Attribute helper functions.
constexpr bool any(E Val)
@ Define
Register definition.
initializer< Ty > init(const Ty &Val)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
NodeAddr< DefNode * > Def
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.
LLVM_ABI char & MachineDominatorsID
MachineDominators - This pass is a machine dominators analysis pass.
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:
LLVM_ABI char & MachineLoopInfoID
MachineLoopInfo - This pass is a loop analysis pass.
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.
unsigned MCRegUnit
Register units are used to compute register aliasing.
CodeGenOptLevel
Code generation optimization level.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
LLVM_ABI void initializeTwoAddressInstructionLegacyPassPass(PassRegistry &)
LLVM_ABI char & TwoAddressInstructionPassID
TwoAddressInstruction - This pass reduces two-address instructions to use two operands.
AAResults AliasAnalysis
Temporary typedef for legacy code that uses a generic AliasAnalysis pointer or reference.
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.
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.