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 (
MI->isBundle()) {
1674 "tied subregister uses in bundled instructions not supported");
1681 if (AllUsesCopied) {
1684 for (MachineOperand &MO :
MI->all_uses()) {
1685 if (MO.
getReg() == RegB) {
1686 if (MO.
getSubReg() == SubRegB && !IsEarlyClobber) {
1687 if (isPlainlyKilled(MO)) {
1689 RemovedKillFlag =
true;
1691 MO.
setReg(LastCopiedReg);
1694 RemainingUses |=
TRI->getSubRegIndexLaneMask(MO.
getSubReg());
1700 if (RemovedKillFlag && RemainingUses.
none() && LV &&
1707 if (RemovedKillFlag && RemainingUses.
none())
1708 SrcRegMap[LastCopiedReg] = RegB;
1713 auto Shrink = [=](
LiveRange &LR, LaneBitmask LaneMask) {
1717 if ((LaneMask & RemainingUses).
any())
1721 S->
end = LastCopyIdx;
1726 bool ShrinkLI =
true;
1728 ShrinkLI &= Shrink(S, S.LaneMask);
1732 }
else if (RemovedKillFlag) {
1737 for (MachineOperand &MO :
MI->all_uses()) {
1738 if (MO.
getReg() == RegB) {
1753bool TwoAddressInstructionImpl::processStatepoint(
1754 MachineInstr *
MI, TiedOperandMap &TiedOperands) {
1756 bool NeedCopy =
false;
1757 for (
auto &TO : TiedOperands) {
1759 if (TO.second.size() != 1) {
1764 unsigned SrcIdx = TO.second[0].first;
1765 unsigned DstIdx = TO.second[0].second;
1767 MachineOperand &DstMO =
MI->getOperand(DstIdx);
1770 assert(RegB ==
MI->getOperand(SrcIdx).getReg());
1783 if (DefLI.overlaps(UseLI)) {
1785 <<
" UseLI overlaps with DefLI\n");
1794 <<
" not killed by statepoint\n");
1799 if (!
MRI->constrainRegClass(RegB,
MRI->getRegClass(RegA))) {
1801 <<
" to register class of " <<
printReg(RegA,
TRI, 0)
1806 MRI->replaceRegWith(RegA, RegB);
1813 for (
const VNInfo *VNI :
Other.valnos) {
1817 for (
auto &S :
Other) {
1818 VNInfo *VNI = NewVNIs[S.
valno->
id];
1819 LiveRange::Segment NewSeg(S.
start, S.
end, VNI);
1826 if (
MI->getOperand(SrcIdx).isKill())
1828 LiveVariables::VarInfo &SrcInfo = LV->
getVarInfo(RegB);
1829 LiveVariables::VarInfo &DstInfo = LV->
getVarInfo(RegA);
1832 for (
auto *KillMI : DstInfo.
Kills)
1840bool TwoAddressInstructionImpl::run() {
1841 bool MadeChange =
false;
1843 LLVM_DEBUG(
dbgs() <<
"********** REWRITING TWO-ADDR INSTRS **********\n");
1852 TiedOperandMap TiedOperands;
1853 for (MachineBasicBlock &
MBBI : *MF) {
1856 DistanceMap.
clear();
1864 if (mi->isDebugInstr()) {
1871 if (mi->isRegSequence())
1872 eliminateRegSequence(mi);
1874 DistanceMap.
insert(std::make_pair(&*mi, ++Dist));
1880 if (!collectTiedOperands(&*mi, TiedOperands)) {
1881 removeClobberedSrcRegMap(&*mi);
1886 ++NumTwoAddressInstrs;
1893 if (TiedOperands.size() == 1) {
1894 SmallVectorImpl<std::pair<unsigned, unsigned>> &TiedPairs
1895 = TiedOperands.begin()->second;
1896 if (TiedPairs.
size() == 1) {
1897 unsigned SrcIdx = TiedPairs[0].first;
1898 unsigned DstIdx = TiedPairs[0].second;
1899 Register SrcReg = mi->getOperand(SrcIdx).getReg();
1900 Register DstReg = mi->getOperand(DstIdx).getReg();
1901 if (SrcReg != DstReg &&
1902 tryInstructionTransform(mi, nmi, SrcIdx, DstIdx, Dist,
false)) {
1905 TiedOperands.clear();
1906 removeClobberedSrcRegMap(&*mi);
1913 if (mi->getOpcode() == TargetOpcode::STATEPOINT &&
1914 processStatepoint(&*mi, TiedOperands)) {
1915 TiedOperands.clear();
1922 for (
auto &TO : TiedOperands) {
1923 processTiedPairs(&*mi, TO.second, Dist);
1928 if (mi->isInsertSubreg()) {
1931 unsigned SubIdx = mi->getOperand(3).getImm();
1932 mi->removeOperand(3);
1933 assert(mi->getOperand(0).getSubReg() == 0 &&
"Unexpected subreg idx");
1934 mi->getOperand(0).setSubReg(SubIdx);
1935 mi->getOperand(0).setIsUndef(mi->getOperand(1).isUndef());
1936 mi->removeOperand(1);
1937 mi->setDesc(
TII->get(TargetOpcode::COPY));
1947 LaneBitmask LaneMask =
1948 TRI->getSubRegIndexLaneMask(mi->getOperand(0).getSubReg());
1951 if ((S.LaneMask & LaneMask).none()) {
1952 LiveRange::iterator DefSeg = S.FindSegmentContaining(Idx);
1953 if (mi->getOperand(0).isUndef()) {
1954 S.removeValNo(DefSeg->valno);
1956 LiveRange::iterator UseSeg = std::prev(DefSeg);
1957 S.MergeValueNumberInto(DefSeg->valno, UseSeg->valno);
1975 TiedOperands.clear();
1976 removeClobberedSrcRegMap(&*mi);
1994void TwoAddressInstructionImpl::eliminateRegSequence(
1996 MachineInstr &
MI = *
MBBI;
2000 VNInfo *DefVN =
nullptr;
2003 for (
unsigned i = 1, e =
MI.getNumOperands(); i < e; i += 2)
2013 bool DefEmitted =
false;
2014 for (
unsigned i = 1, e =
MI.getNumOperands(); i < e; i += 2) {
2015 MachineOperand &UseMO =
MI.getOperand(i);
2017 unsigned SubIdx =
MI.getOperand(i+1).getImm();
2020 UndefLanes |=
TRI->getSubRegIndexLaneMask(SubIdx);
2026 bool isKill = UseMO.
isKill();
2028 for (
unsigned j = i + 2;
j <
e;
j += 2)
2029 if (
MI.getOperand(j).getReg() == SrcReg) {
2030 MI.getOperand(j).setIsKill();
2037 MachineInstr *CopyMI =
BuildMI(*
MI.getParent(),
MI,
MI.getDebugLoc(),
2038 TII->get(TargetOpcode::COPY))
2063 MI.setDesc(
TII->get(TargetOpcode::IMPLICIT_DEF));
2064 for (
int j =
MI.getNumOperands() - 1, ee = 0; j > ee; --j)
2065 MI.removeOperand(j);
2071 if (UndefLanes.
any() && DefVN &&
MRI->shouldTrackSubRegLiveness(DstReg)) {
2073 for (MachineOperand &UseOp :
MRI->use_operands(DstReg)) {
2081 LaneBitmask LaneMask =
TRI->getSubRegIndexLaneMask(
SubReg);
2082 if ((UndefLanes & LaneMask).
any())
2091 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...
iterator_range< MIBundleOperands > mi_bundle_ops(MachineInstr &MI)
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.