69#define DEBUG_TYPE "twoaddressinstruction"
71STATISTIC(NumTwoAddressInstrs,
"Number of two-address instructions");
72STATISTIC(NumCommuted ,
"Number of instructions commuted to coalesce");
73STATISTIC(NumAggrCommuted ,
"Number of instructions aggressively commuted");
74STATISTIC(NumConvertedTo3Addr,
"Number of instructions promoted to 3-address");
75STATISTIC(NumReSchedUps,
"Number of instructions re-scheduled up");
76STATISTIC(NumReSchedDowns,
"Number of instructions re-scheduled down");
81 cl::desc(
"Coalesce copies by rescheduling (default=true)"),
85 "twoaddr-analyze-revcopy-tied",
86 cl::desc(
"Analyze tied operands when looking for reversed copy chain"),
93 cl::desc(
"Maximum number of dataflow edges to traverse when evaluating "
94 "the benefit of commuting operands"));
98class TwoAddressInstructionImpl {
131 bool noUseAfterLastDef(
Register Reg,
unsigned Dist,
unsigned &LastDef);
134 bool &IsSrcPhys,
bool &IsDstPhys)
const;
144 bool &IsDstPhys)
const;
159 unsigned RegBIdx,
unsigned RegCIdx,
unsigned Dist);
176 unsigned SrcIdx,
unsigned DstIdx,
177 unsigned &Dist,
bool shouldOnlyCommute);
192 void processTiedPairs(
MachineInstr *
MI, TiedPairList&,
unsigned &Dist);
194 bool processStatepoint(
MachineInstr *
MI, TiedOperandMap &TiedOperands);
209 TwoAddressInstructionLegacyPass() : MachineFunctionPass(ID) {}
212 bool runOnMachineFunction(MachineFunction &MF)
override {
213 TwoAddressInstructionImpl Impl(MF,
this);
217 Impl.setOptLevel(CodeGenOptLevel::None);
221 void getAnalysisUsage(AnalysisUsage &AU)
const override {
242 TwoAddressInstructionImpl Impl(MF, MFAM, LIS);
265char TwoAddressInstructionLegacyPass::ID = 0;
270 "Two-Address instruction pass",
false,
false)
272TwoAddressInstructionImpl::TwoAddressInstructionImpl(
275 : MF(&Func),
TII(Func.getSubtarget().getInstrInfo()),
276 TRI(Func.getSubtarget().getRegisterInfo()),
277 InstrItins(Func.getSubtarget().getInstrItineraryData()),
278 MRI(&Func.getRegInfo()),
280 OptLevel(Func.getTarget().getOptLevel()) {}
282TwoAddressInstructionImpl::TwoAddressInstructionImpl(
MachineFunction &Func,
284 : MF(&
Func),
TII(
Func.getSubtarget().getInstrInfo()),
285 TRI(
Func.getSubtarget().getRegisterInfo()),
286 InstrItins(
Func.getSubtarget().getInstrItineraryData()),
287 MRI(&
Func.getRegInfo()), OptLevel(
Func.getTarget().getOptLevel()) {
289 LV = LVWrapper ? &LVWrapper->
getLV() :
nullptr;
291 LIS = LISWrapper ? &LISWrapper->
getLIS() :
nullptr;
296TwoAddressInstructionImpl::getSingleDef(
Register Reg,
298 MachineInstr *Ret =
nullptr;
300 if (
DefMI.getParent() != BB ||
DefMI.isDebugValue())
304 else if (Ret != &
DefMI)
312 int DefRegIdx =
MI->findRegisterDefOperandIdx(DefReg,
TRI);
315 return MI->isRegTiedToUseOperand(DefRegIdx, &TiedOpIdx);
325bool TwoAddressInstructionImpl::isRevCopyChain(
Register FromReg,
Register ToReg,
328 for (
int i = 0; i < Maxlen; i++) {
329 MachineInstr *
Def = getSingleDef(TmpReg,
MBB);
334 TmpReg =
Def->getOperand(1).getReg();
335 else if (
unsigned TiedOpIdx;
337 Register TiedUseReg =
Def->getOperand(TiedOpIdx).getReg();
340 if (TiedUseReg == TmpReg)
356bool TwoAddressInstructionImpl::noUseAfterLastDef(
Register Reg,
unsigned Dist,
359 unsigned LastUse = Dist;
361 MachineInstr *
MI = MO.getParent();
362 if (
MI->getParent() !=
MBB ||
MI->isDebugValue())
364 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.
find(
MI);
365 if (DI == DistanceMap.
end())
367 if (MO.isUse() && DI->second < LastUse)
368 LastUse = DI->second;
369 if (MO.isDef() && DI->second > LastDef)
370 LastDef = DI->second;
373 return !(LastUse > LastDef && LastUse < Dist);
379bool TwoAddressInstructionImpl::isCopyToReg(MachineInstr &
MI,
Register &SrcReg,
381 bool &IsDstPhys)
const {
384 if (
MI.isCopy() ||
MI.isSubregToReg()) {
385 DstReg =
MI.getOperand(0).getReg();
386 SrcReg =
MI.getOperand(1).getReg();
387 }
else if (
MI.isInsertSubreg()) {
388 DstReg =
MI.getOperand(0).getReg();
389 SrcReg =
MI.getOperand(2).getReg();
399bool TwoAddressInstructionImpl::isPlainlyKilled(
const MachineInstr *
MI,
406 LiveInterval::const_iterator
I = LR.
find(useIdx);
407 assert(
I != LR.
end() &&
"Reg must be live-in to use.");
413bool TwoAddressInstructionImpl::isPlainlyKilled(
const MachineInstr *
MI,
428 return isPlainlyKilled(MI, LIS->getRegUnit(U));
432 return MI->killsRegister(
Reg,
nullptr);
437bool TwoAddressInstructionImpl::isPlainlyKilled(
438 const MachineOperand &MO)
const {
459bool TwoAddressInstructionImpl::isKilled(MachineInstr &
MI,
Register Reg,
460 bool allowFalsePositives)
const {
473 if (std::next(Begin) != MRI->
def_end())
476 bool IsSrcPhys, IsDstPhys;
480 if (!isCopyToReg(*
DefMI, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
489 for (
unsigned i = 0,
NumOps =
MI.getNumOperands(); i !=
NumOps; ++i) {
494 if (
MI.isRegTiedToDefOperand(i, &ti)) {
495 DstReg =
MI.getOperand(ti).getReg();
504MachineInstr *TwoAddressInstructionImpl::findOnlyInterestingUse(
506 bool &IsDstPhys)
const {
507 MachineOperand *UseOp =
nullptr;
513 if (
MI->getParent() !=
MBB)
515 if (isPlainlyKilled(
MI,
Reg))
524 if (isCopyToReg(
UseMI, SrcReg, DstReg, IsSrcPhys, IsDstPhys)) {
533 if (
UseMI.isCommutable()) {
536 if (
TII->findCommutedOpIndices(
UseMI, Src1, Src2)) {
537 MachineOperand &MO =
UseMI.getOperand(Src1);
552 while (
Reg.isVirtual()) {
554 if (
SI == RegMap.
end())
558 if (
Reg.isPhysical())
564bool TwoAddressInstructionImpl::regsAreCompatible(
Register RegA,
570 return TRI->regsOverlap(RegA, RegB);
574void TwoAddressInstructionImpl::removeMapRegEntry(
575 const MachineOperand &MO, DenseMap<Register, Register> &RegMap)
const {
578 "removeMapRegEntry must be called with a register or regmask operand.");
581 for (
auto SI : RegMap) {
588 if (
TRI->regsOverlap(ToReg,
Reg))
594 for (
auto SrcReg : Srcs)
595 RegMap.erase(SrcReg);
606void TwoAddressInstructionImpl::removeClobberedSrcRegMap(MachineInstr *
MI) {
619 if (!Dst || Dst.isVirtual())
623 if (regsAreCompatible(Dst,
getMappedReg(Src, SrcRegMap)))
627 for (
const MachineOperand &MO :
MI->operands()) {
629 removeMapRegEntry(MO, SrcRegMap);
637 removeMapRegEntry(MO, SrcRegMap);
642bool TwoAddressInstructionImpl::regOverlapsSet(
643 const SmallVectorImpl<Register> &Set,
Register Reg)
const {
645 if (
TRI->regsOverlap(R,
Reg))
653bool TwoAddressInstructionImpl::isProfitableToCommute(
Register RegA,
658 if (OptLevel == CodeGenOptLevel::None)
679 if (!isPlainlyKilled(
MI, RegC))
696 bool CompB = FromRegB && regsAreCompatible(FromRegB, ToRegA);
697 bool CompC = FromRegC && regsAreCompatible(FromRegC, ToRegA);
703 if ((!FromRegB && CompC) || (FromRegB && !CompB && (!FromRegC || CompC)))
709 if ((!FromRegC && CompB) || (FromRegC && !CompC && (!FromRegB || CompB)))
715 unsigned LastDefC = 0;
716 if (!noUseAfterLastDef(RegC, Dist, LastDefC))
721 unsigned LastDefB = 0;
722 if (!noUseAfterLastDef(RegB, Dist, LastDefB))
748 if (
TII->hasCommutePreference(*
MI, Commute))
753 return LastDefB && LastDefC && LastDefC > LastDefB;
758bool TwoAddressInstructionImpl::commuteInstruction(MachineInstr *
MI,
763 Register RegC =
MI->getOperand(RegCIdx).getReg();
765 MachineInstr *NewMI =
TII->commuteInstruction(*
MI,
false, RegBIdx, RegCIdx);
767 if (NewMI ==
nullptr) {
774 "TargetInstrInfo::commuteInstruction() should not return a new "
775 "instruction unless it was requested.");
780 Register RegA =
MI->getOperand(DstIdx).getReg();
781 SrcRegMap[RegA] = FromRegC;
789bool TwoAddressInstructionImpl::isProfitableToConv3Addr(
Register RegA,
801 return (ToRegA && !regsAreCompatible(FromRegB, ToRegA));
806bool TwoAddressInstructionImpl::convertInstTo3Addr(
809 MachineInstrSpan MIS(mi,
MBB);
810 MachineInstr *NewMI =
TII->convertToThreeAddress(*mi, LV, LIS);
814 for (MachineInstr &
MI : MIS)
815 DistanceMap.
insert(std::make_pair(&
MI, Dist++));
818 LLVM_DEBUG(
dbgs() <<
"2addr: CONVERTED IN-PLACE TO 3-ADDR: " << *mi);
821 dbgs() <<
"2addr: CONVERTING 2-ADDR: " << *mi;
822 dbgs() <<
"2addr: TO 3-ADDR: " << *NewMI;
826 if (
auto OldInstrNum = mi->peekDebugInstrNum()) {
827 assert(mi->getNumExplicitDefs() == 1);
831 unsigned OldIdx = mi->defs().begin()->getOperandNo();
832 unsigned NewIdx = NewMI->
defs().
begin()->getOperandNo();
837 std::make_pair(NewInstrNum, NewIdx));
848 SrcRegMap.
erase(RegA);
849 DstRegMap.
erase(RegB);
855void TwoAddressInstructionImpl::scanUses(
Register DstReg) {
861 while (MachineInstr *
UseMI =
862 findOnlyInterestingUse(
Reg,
MBB, IsCopy, NewReg, IsDstPhys)) {
863 if (IsCopy && !Processed.insert(
UseMI).second)
866 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.
find(
UseMI);
867 if (DI != DistanceMap.
end())
875 SrcRegMap[NewReg] =
Reg;
880 if (!VirtRegPairs.
empty()) {
882 while (!VirtRegPairs.
empty()) {
884 bool isNew = DstRegMap.
insert(std::make_pair(FromReg, ToReg)).second;
886 assert(DstRegMap[FromReg] == ToReg &&
"Can't map to two dst registers!");
889 bool isNew = DstRegMap.
insert(std::make_pair(DstReg, ToReg)).second;
891 assert(DstRegMap[DstReg] == ToReg &&
"Can't map to two dst registers!");
907void TwoAddressInstructionImpl::processCopy(MachineInstr *
MI) {
908 if (Processed.count(
MI))
911 bool IsSrcPhys, IsDstPhys;
913 if (!isCopyToReg(*
MI, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
916 if (IsDstPhys && !IsSrcPhys) {
917 DstRegMap.
insert(std::make_pair(SrcReg, DstReg));
918 }
else if (!IsDstPhys && IsSrcPhys) {
919 bool isNew = SrcRegMap.
insert(std::make_pair(DstReg, SrcReg)).second;
921 assert(SrcRegMap[DstReg] == SrcReg &&
922 "Can't map to two src physical registers!");
927 Processed.insert(
MI);
933bool TwoAddressInstructionImpl::rescheduleMIBelowKill(
941 MachineInstr *
MI = &*mi;
942 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.
find(
MI);
943 if (DI == DistanceMap.
end())
947 MachineInstr *KillMI =
nullptr;
951 "Reg should not have empty live interval.");
954 LiveInterval::const_iterator
I = LI.
find(MBBEndIdx);
955 if (
I != LI.
end() &&
I->start < MBBEndIdx)
976 bool SeenStore =
true;
977 if (!
MI->isSafeToMove(SeenStore))
987 for (
const MachineOperand &MO :
MI->operands()) {
996 Uses.push_back(MOReg);
997 if (MOReg !=
Reg && isPlainlyKilled(MO))
1006 while (End !=
MBB->
end()) {
1008 if (End->isCopy() && regOverlapsSet(Defs, End->getOperand(1).getReg()))
1009 Defs.
push_back(End->getOperand(0).getReg());
1016 unsigned NumVisited = 0;
1019 for (MachineInstr &OtherMI :
make_range(End, KillPos)) {
1021 if (OtherMI.isDebugOrPseudoInstr())
1023 if (NumVisited > 10)
1026 if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
1027 OtherMI.isBranch() || OtherMI.isTerminator())
1030 for (
const MachineOperand &MO : OtherMI.operands()) {
1037 if (regOverlapsSet(
Uses, MOReg))
1040 if (!MO.
isDead() && regOverlapsSet(Defs, MOReg))
1046 if (regOverlapsSet(Defs, MOReg))
1048 bool isKill = isPlainlyKilled(MO);
1049 if (MOReg !=
Reg && ((isKill && regOverlapsSet(
Uses, MOReg)) ||
1050 regOverlapsSet(Kills, MOReg)))
1053 if (MOReg ==
Reg && !isKill)
1057 assert((MOReg !=
Reg || &OtherMI == KillMI) &&
1058 "Found multiple kills of a register in a basic block");
1064 while (Begin !=
MBB->
begin() && std::prev(Begin)->isDebugInstr())
1073 auto CopyMI =
MBBI++;
1075 if (!CopyMI->isDebugOrPseudoInstr())
1084 DistanceMap.
erase(DI);
1100bool TwoAddressInstructionImpl::isDefTooClose(
Register Reg,
unsigned Dist,
1107 DenseMap<MachineInstr*, unsigned>::iterator DDI = DistanceMap.
find(&
DefMI);
1108 if (DDI == DistanceMap.
end())
1110 unsigned DefDist = DDI->second;
1111 assert(Dist > DefDist &&
"Visited def already?");
1121bool TwoAddressInstructionImpl::rescheduleKillAboveMI(
1129 MachineInstr *
MI = &*mi;
1130 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.
find(
MI);
1131 if (DI == DistanceMap.
end())
1135 MachineInstr *KillMI =
nullptr;
1139 "Reg should not have empty live interval.");
1142 LiveInterval::const_iterator
I = LI.
find(MBBEndIdx);
1143 if (
I != LI.
end() &&
I->start < MBBEndIdx)
1151 if (!KillMI ||
MI == KillMI)
1159 bool IsCopySrcPhys, IsCopyDstPhys;
1164 if (!isCopyToReg(*KillMI, CopySrcReg, CopyDstReg, IsCopySrcPhys,
1168 if (CopySrcReg !=
Reg || IsCopySrcPhys || !IsCopyDstPhys)
1176 bool SeenStore =
true;
1184 for (
const MachineOperand &MO : KillMI->
operands()) {
1191 if (isDefTooClose(MOReg, DI->second,
MI))
1193 bool isKill = isPlainlyKilled(MO);
1194 if (MOReg ==
Reg && !isKill)
1196 Uses.push_back(MOReg);
1197 if (isKill && MOReg !=
Reg)
1207 unsigned NumVisited = 0;
1208 for (MachineInstr &OtherMI :
1211 if (OtherMI.isDebugOrPseudoInstr())
1213 if (NumVisited > 10)
1216 if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
1217 OtherMI.isBranch() || OtherMI.isTerminator())
1221 for (
const MachineOperand &MO : OtherMI.operands()) {
1228 if (regOverlapsSet(Defs, MOReg))
1232 if (regOverlapsSet(Kills, MOReg))
1235 if (&OtherMI !=
MI && MOReg ==
Reg && !isPlainlyKilled(MO))
1244 if (regOverlapsSet(
Uses, MOReg))
1246 if (MOReg.
isPhysical() && regOverlapsSet(LiveDefs, MOReg))
1255 while (InsertPos !=
MBB->
begin() && std::prev(InsertPos)->isDebugInstr())
1259 while (std::prev(From)->isDebugInstr())
1263 nmi = std::prev(InsertPos);
1264 DistanceMap.
erase(DI);
1290bool TwoAddressInstructionImpl::tryInstructionCommute(MachineInstr *
MI,
1295 if (!
MI->isCommutable())
1298 bool MadeChange =
false;
1299 Register DstOpReg =
MI->getOperand(DstOpIdx).getReg();
1300 Register BaseOpReg =
MI->getOperand(BaseOpIdx).getReg();
1301 unsigned OpsNum =
MI->getDesc().getNumOperands();
1302 unsigned OtherOpIdx =
MI->getDesc().getNumDefs();
1303 for (; OtherOpIdx < OpsNum; OtherOpIdx++) {
1308 if (OtherOpIdx == BaseOpIdx || !
MI->getOperand(OtherOpIdx).isReg() ||
1309 !
TII->findCommutedOpIndices(*
MI, BaseOpIdx, OtherOpIdx))
1312 Register OtherOpReg =
MI->getOperand(OtherOpIdx).getReg();
1313 bool AggressiveCommute =
false;
1317 bool OtherOpKilled = isKilled(*
MI, OtherOpReg,
false);
1318 bool DoCommute = !BaseOpKilled && OtherOpKilled;
1321 isProfitableToCommute(DstOpReg, BaseOpReg, OtherOpReg,
MI, Dist)) {
1323 AggressiveCommute =
true;
1327 if (DoCommute && commuteInstruction(
MI, DstOpIdx, BaseOpIdx, OtherOpIdx,
1331 if (AggressiveCommute)
1338 BaseOpReg = OtherOpReg;
1339 BaseOpKilled = OtherOpKilled;
1342 OpsNum =
MI->getDesc().getNumOperands();
1355bool TwoAddressInstructionImpl::tryInstructionTransform(
1357 unsigned SrcIdx,
unsigned DstIdx,
unsigned &Dist,
bool shouldOnlyCommute) {
1358 if (OptLevel == CodeGenOptLevel::None)
1361 MachineInstr &
MI = *mi;
1362 Register regA =
MI.getOperand(DstIdx).getReg();
1363 Register regB =
MI.getOperand(SrcIdx).getReg();
1365 assert(regB.
isVirtual() &&
"cannot make instruction into two-address form");
1366 bool regBKilled = isKilled(
MI, regB,
true);
1371 bool Commuted = tryInstructionCommute(&
MI, DstIdx, SrcIdx, regBKilled, Dist);
1384 if (Commuted && !ConvertibleTo3Addr)
1387 if (shouldOnlyCommute)
1400 regB =
MI.getOperand(SrcIdx).getReg();
1401 regBKilled = isKilled(
MI, regB,
true);
1404 if (ConvertibleTo3Addr) {
1407 if (!regBKilled || isProfitableToConv3Addr(regA, regB)) {
1409 if (convertInstTo3Addr(mi, nmi, regA, regB, Dist)) {
1410 ++NumConvertedTo3Addr;
1435 if (
MI.mayLoad() && !regBKilled) {
1437 unsigned LoadRegIndex;
1439 TII->getOpcodeAfterMemoryUnfold(
MI.getOpcode(),
1444 const MCInstrDesc &UnfoldMCID =
TII->get(NewOpc);
1448 const TargetRegisterClass *RC =
TRI->getAllocatableClass(
1449 TII->getRegClass(UnfoldMCID, LoadRegIndex));
1451 SmallVector<MachineInstr *, 2> NewMIs;
1452 if (!
TII->unfoldMemoryOperand(*MF,
MI,
Reg,
1459 "Unfolded a load into multiple instructions!");
1461 NewMIs[1]->addRegisterKilled(
Reg,
TRI);
1467 DistanceMap.
insert(std::make_pair(NewMIs[0], Dist++));
1468 DistanceMap.
insert(std::make_pair(NewMIs[1], Dist));
1471 <<
"2addr: NEW INST: " << *NewMIs[1]);
1474 unsigned NewDstIdx =
1475 NewMIs[1]->findRegisterDefOperandIdx(regA,
nullptr);
1476 unsigned NewSrcIdx =
1477 NewMIs[1]->findRegisterUseOperandIdx(regB,
nullptr);
1479 bool TransformResult =
1480 tryInstructionTransform(NewMI, mi, NewSrcIdx, NewDstIdx, Dist,
true);
1481 (void)TransformResult;
1482 assert(!TransformResult &&
1483 "tryInstructionTransform() should return false.");
1484 if (NewMIs[1]->getOperand(NewSrcIdx).isKill()) {
1488 for (
const MachineOperand &MO :
MI.operands()) {
1492 if (NewMIs[0]->killsRegister(MO.
getReg(),
nullptr))
1497 "Kill missing after load unfold!");
1502 if (NewMIs[1]->registerDefIsDead(MO.
getReg(),
1508 "Dead flag missing after load unfold!");
1519 for (
const MachineOperand &MO :
MI.operands()) {
1527 MI.eraseFromParent();
1543 NewMIs[0]->eraseFromParent();
1544 NewMIs[1]->eraseFromParent();
1545 DistanceMap.
erase(NewMIs[0]);
1546 DistanceMap.
erase(NewMIs[1]);
1559bool TwoAddressInstructionImpl::collectTiedOperands(
1560 MachineInstr *
MI, TiedOperandMap &TiedOperands) {
1561 bool AnyOps =
false;
1562 unsigned NumOps =
MI->getNumOperands();
1564 for (
unsigned SrcIdx = 0; SrcIdx <
NumOps; ++SrcIdx) {
1565 unsigned DstIdx = 0;
1566 if (!
MI->isRegTiedToDefOperand(SrcIdx, &DstIdx))
1569 MachineOperand &SrcMO =
MI->getOperand(SrcIdx);
1570 MachineOperand &DstMO =
MI->getOperand(DstIdx);
1574 if (SrcReg == DstReg)
1577 assert(SrcReg && SrcMO.
isUse() &&
"two address instruction invalid");
1583 const TargetRegisterClass *RC = MRI->
getRegClass(SrcReg);
1591 TiedOperands[SrcReg].push_back(std::make_pair(SrcIdx, DstIdx));
1598void TwoAddressInstructionImpl::processTiedPairs(MachineInstr *
MI,
1599 TiedPairList &TiedPairs,
1601 bool IsEarlyClobber =
llvm::any_of(TiedPairs, [
MI](
auto const &TP) {
1602 return MI->getOperand(TP.second).isEarlyClobber();
1605 bool RemovedKillFlag =
false;
1606 bool AllUsesCopied =
true;
1608 SlotIndex LastCopyIdx;
1610 unsigned SubRegB = 0;
1611 for (
auto &TP : TiedPairs) {
1612 unsigned SrcIdx = TP.first;
1613 unsigned DstIdx = TP.second;
1615 const MachineOperand &DstMO =
MI->getOperand(DstIdx);
1620 RegB =
MI->getOperand(SrcIdx).getReg();
1621 SubRegB =
MI->getOperand(SrcIdx).getSubReg();
1627 AllUsesCopied =
false;
1630 LastCopiedReg = RegA;
1632 assert(RegB.
isVirtual() &&
"cannot make instruction into two-address form");
1638 for (
unsigned i = 0; i !=
MI->getNumOperands(); ++i)
1640 !
MI->getOperand(i).isReg() ||
1641 MI->getOperand(i).getReg() != RegA);
1645 MachineInstrBuilder MIB =
BuildMI(*
MI->getParent(),
MI,
MI->getDebugLoc(),
1646 TII->get(TargetOpcode::COPY), RegA);
1649 MIB.
addReg(RegB, {}, SubRegB);
1650 const TargetRegisterClass *RC = MRI->
getRegClass(RegB);
1655 "tied subregister must be a truncation");
1660 &&
"tied subregister must be a truncation");
1667 DistanceMap.
insert(std::make_pair(&*PrevMI, Dist));
1668 DistanceMap[
MI] = ++Dist;
1678 LI.
addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1681 S.addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1684 for (MCRegUnit Unit :
TRI->regunits(RegA)) {
1688 LR->
addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1696 MachineOperand &MO =
MI->getOperand(SrcIdx);
1698 "inconsistent operand info for 2-reg pass");
1699 if (isPlainlyKilled(MO)) {
1701 RemovedKillFlag =
true;
1714 if (
MI->isBundle()) {
1718 "tied subregister uses in bundled instructions not supported");
1725 if (AllUsesCopied) {
1728 for (MachineOperand &MO :
MI->all_uses()) {
1729 if (MO.
getReg() == RegB) {
1730 if (MO.
getSubReg() == SubRegB && !IsEarlyClobber) {
1731 if (isPlainlyKilled(MO)) {
1733 RemovedKillFlag =
true;
1735 MO.
setReg(LastCopiedReg);
1738 RemainingUses |=
TRI->getSubRegIndexLaneMask(MO.
getSubReg());
1744 if (RemovedKillFlag && RemainingUses.
none() && LV &&
1751 if (RemovedKillFlag && RemainingUses.
none())
1752 SrcRegMap[LastCopiedReg] = RegB;
1757 auto Shrink = [=](
LiveRange &LR, LaneBitmask LaneMask) {
1761 if ((LaneMask & RemainingUses).
any())
1765 S->
end = LastCopyIdx;
1770 bool ShrinkLI =
true;
1772 ShrinkLI &= Shrink(S, S.LaneMask);
1776 }
else if (RemovedKillFlag) {
1781 for (MachineOperand &MO :
MI->all_uses()) {
1782 if (MO.
getReg() == RegB) {
1797bool TwoAddressInstructionImpl::processStatepoint(
1798 MachineInstr *
MI, TiedOperandMap &TiedOperands) {
1800 bool NeedCopy =
false;
1801 for (
auto &TO : TiedOperands) {
1803 if (TO.second.size() != 1) {
1808 unsigned SrcIdx = TO.second[0].first;
1809 unsigned DstIdx = TO.second[0].second;
1811 MachineOperand &DstMO =
MI->getOperand(DstIdx);
1814 assert(RegB ==
MI->getOperand(SrcIdx).getReg());
1827 if (DefLI.overlaps(UseLI)) {
1829 <<
" UseLI overlaps with DefLI\n");
1838 <<
" not killed by statepoint\n");
1845 <<
" to register class of " <<
printReg(RegA,
TRI, 0)
1857 for (
const VNInfo *VNI :
Other.valnos) {
1861 for (
auto &S :
Other) {
1862 VNInfo *VNI = NewVNIs[S.
valno->
id];
1863 LiveRange::Segment NewSeg(S.
start, S.
end, VNI);
1870 if (
MI->getOperand(SrcIdx).isKill())
1872 LiveVariables::VarInfo &SrcInfo = LV->
getVarInfo(RegB);
1873 LiveVariables::VarInfo &DstInfo = LV->
getVarInfo(RegA);
1876 for (
auto *KillMI : DstInfo.
Kills)
1884bool TwoAddressInstructionImpl::run() {
1885 bool MadeChange =
false;
1887 LLVM_DEBUG(
dbgs() <<
"********** REWRITING TWO-ADDR INSTRS **********\n");
1896 TiedOperandMap TiedOperands;
1897 for (MachineBasicBlock &
MBBI : *MF) {
1900 DistanceMap.
clear();
1908 if (mi->isDebugInstr()) {
1915 if (mi->isRegSequence()) {
1916 eliminateRegSequence(mi);
1920 DistanceMap.
insert(std::make_pair(&*mi, ++Dist));
1926 if (!collectTiedOperands(&*mi, TiedOperands)) {
1927 removeClobberedSrcRegMap(&*mi);
1932 ++NumTwoAddressInstrs;
1939 if (TiedOperands.size() == 1) {
1940 SmallVectorImpl<std::pair<unsigned, unsigned>> &TiedPairs
1941 = TiedOperands.begin()->second;
1942 if (TiedPairs.
size() == 1) {
1943 unsigned SrcIdx = TiedPairs[0].first;
1944 unsigned DstIdx = TiedPairs[0].second;
1945 Register SrcReg = mi->getOperand(SrcIdx).getReg();
1946 Register DstReg = mi->getOperand(DstIdx).getReg();
1947 if (SrcReg != DstReg &&
1948 tryInstructionTransform(mi, nmi, SrcIdx, DstIdx, Dist,
false)) {
1951 TiedOperands.clear();
1952 removeClobberedSrcRegMap(&*mi);
1959 if (mi->getOpcode() == TargetOpcode::STATEPOINT &&
1960 processStatepoint(&*mi, TiedOperands)) {
1961 TiedOperands.clear();
1968 for (
auto &TO : TiedOperands) {
1969 processTiedPairs(&*mi, TO.second, Dist);
1974 if (mi->isInsertSubreg()) {
1977 unsigned SubIdx = mi->getOperand(3).getImm();
1978 mi->removeOperand(3);
1979 assert(mi->getOperand(0).getSubReg() == 0 &&
"Unexpected subreg idx");
1980 mi->getOperand(0).setSubReg(SubIdx);
1981 mi->getOperand(0).setIsUndef(mi->getOperand(1).isUndef());
1982 mi->removeOperand(1);
1983 mi->setDesc(
TII->get(TargetOpcode::COPY));
1993 LaneBitmask LaneMask =
1994 TRI->getSubRegIndexLaneMask(mi->getOperand(0).getSubReg());
1997 if ((S.LaneMask & LaneMask).none()) {
1998 LiveRange::iterator DefSeg = S.FindSegmentContaining(Idx);
1999 if (mi->getOperand(0).isUndef()) {
2000 S.removeValNo(DefSeg->valno);
2002 LiveRange::iterator UseSeg = std::prev(DefSeg);
2003 S.MergeValueNumberInto(DefSeg->valno, UseSeg->valno);
2021 TiedOperands.clear();
2022 removeClobberedSrcRegMap(&*mi);
2040void TwoAddressInstructionImpl::eliminateRegSequence(
2042 MachineInstr &
MI = *
MBBI;
2046 VNInfo *DefVN =
nullptr;
2049 for (
unsigned i = 1, e =
MI.getNumOperands(); i < e; i += 2)
2063 if (
unsigned SubReg =
Use.getSubReg())
2064 UsedLanes |=
TRI->getSubRegIndexLaneMask(SubReg);
2069 bool DefEmitted =
false;
2070 for (
unsigned i = 1, e =
MI.getNumOperands(); i < e; i += 2) {
2071 MachineOperand &UseMO =
MI.getOperand(i);
2073 unsigned SubIdx =
MI.getOperand(i+1).getImm();
2078 LaneBitmask LaneMask =
TRI->getSubRegIndexLaneMask(SubIdx);
2079 if (LIS || (UsedLanes & LaneMask).
none()) {
2080 UndefLanes |= LaneMask;
2087 bool isKill = UseMO.
isKill();
2089 for (
unsigned j = i + 2;
j <
e;
j += 2)
2090 if (
MI.getOperand(j).getReg() == SrcReg) {
2091 MI.getOperand(j).setIsKill();
2098 MachineInstr *CopyMI =
BuildMI(*
MI.getParent(),
MI,
MI.getDebugLoc(),
2099 TII->get(TargetOpcode::COPY))
2100 .
addReg(DstReg, RegState::Define, SubIdx)
2124 MI.setDesc(
TII->get(TargetOpcode::IMPLICIT_DEF));
2125 for (
int j =
MI.getNumOperands() - 1, ee = 0; j > ee; --j)
2126 MI.removeOperand(j);
2134 for (MachineOperand &UseOp : MRI->
use_operands(DstReg)) {
2136 if (UseOp.
isUndef() || !SubReg)
2142 LaneBitmask LaneMask =
TRI->getSubRegIndexLaneMask(SubReg);
2143 if ((UndefLanes & LaneMask).
any())
2152 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 & 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.
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
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 & 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
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,...
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...
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.
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.
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.
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.