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)"),
88 cl::desc(
"Maximum number of dataflow edges to traverse when evaluating "
89 "the benefit of commuting operands"));
93class 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);
204 TwoAddressInstructionLegacyPass() : MachineFunctionPass(ID) {}
207 bool runOnMachineFunction(MachineFunction &MF)
override {
208 TwoAddressInstructionImpl Impl(MF,
this);
212 Impl.setOptLevel(CodeGenOptLevel::None);
216 void getAnalysisUsage(AnalysisUsage &AU)
const override {
237 TwoAddressInstructionImpl Impl(MF, MFAM, LIS);
260char TwoAddressInstructionLegacyPass::ID = 0;
265 "Two-Address instruction pass",
false,
false)
267TwoAddressInstructionImpl::TwoAddressInstructionImpl(
270 : MF(&Func),
TII(Func.getSubtarget().getInstrInfo()),
271 TRI(Func.getSubtarget().getRegisterInfo()),
272 InstrItins(Func.getSubtarget().getInstrItineraryData()),
273 MRI(&Func.getRegInfo()),
275 OptLevel(Func.getTarget().getOptLevel()) {}
277TwoAddressInstructionImpl::TwoAddressInstructionImpl(
MachineFunction &Func,
279 : MF(&
Func),
TII(
Func.getSubtarget().getInstrInfo()),
280 TRI(
Func.getSubtarget().getRegisterInfo()),
281 InstrItins(
Func.getSubtarget().getInstrItineraryData()),
282 MRI(&
Func.getRegInfo()), OptLevel(
Func.getTarget().getOptLevel()) {
284 LV = LVWrapper ? &LVWrapper->
getLV() :
nullptr;
286 LIS = LISWrapper ? &LISWrapper->
getLIS() :
nullptr;
291TwoAddressInstructionImpl::getSingleDef(
Register Reg,
293 MachineInstr *Ret =
nullptr;
294 for (MachineInstr &
DefMI :
MRI->def_instructions(
Reg)) {
295 if (
DefMI.getParent() != BB ||
DefMI.isDebugValue())
299 else if (Ret != &
DefMI)
312bool TwoAddressInstructionImpl::isRevCopyChain(
Register FromReg,
Register ToReg,
315 for (
int i = 0; i < Maxlen; i++) {
316 MachineInstr *
Def = getSingleDef(TmpReg,
MBB);
317 if (!Def || !
Def->isCopy())
320 TmpReg =
Def->getOperand(1).getReg();
332bool TwoAddressInstructionImpl::noUseAfterLastDef(
Register Reg,
unsigned Dist,
335 unsigned LastUse = Dist;
336 for (MachineOperand &MO :
MRI->reg_operands(
Reg)) {
337 MachineInstr *
MI = MO.getParent();
338 if (
MI->getParent() !=
MBB ||
MI->isDebugValue())
340 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.
find(
MI);
341 if (DI == DistanceMap.
end())
343 if (MO.isUse() && DI->second < LastUse)
344 LastUse = DI->second;
345 if (MO.isDef() && DI->second > LastDef)
346 LastDef = DI->second;
349 return !(LastUse > LastDef && LastUse < Dist);
355bool TwoAddressInstructionImpl::isCopyToReg(MachineInstr &
MI,
Register &SrcReg,
357 bool &IsDstPhys)
const {
361 DstReg =
MI.getOperand(0).getReg();
362 SrcReg =
MI.getOperand(1).getReg();
363 }
else if (
MI.isInsertSubreg() ||
MI.isSubregToReg()) {
364 DstReg =
MI.getOperand(0).getReg();
365 SrcReg =
MI.getOperand(2).getReg();
375bool TwoAddressInstructionImpl::isPlainlyKilled(
const MachineInstr *
MI,
382 LiveInterval::const_iterator
I = LR.
find(useIdx);
383 assert(
I != LR.
end() &&
"Reg must be live-in to use.");
389bool TwoAddressInstructionImpl::isPlainlyKilled(
const MachineInstr *
MI,
404 return isPlainlyKilled(MI, LIS->getRegUnit(U));
408 return MI->killsRegister(
Reg,
nullptr);
413bool TwoAddressInstructionImpl::isPlainlyKilled(
414 const MachineOperand &MO)
const {
435bool TwoAddressInstructionImpl::isKilled(MachineInstr &
MI,
Register Reg,
436 bool allowFalsePositives)
const {
449 if (std::next(Begin) !=
MRI->def_end())
452 bool IsSrcPhys, IsDstPhys;
456 if (!isCopyToReg(*
DefMI, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
465 for (
unsigned i = 0,
NumOps =
MI.getNumOperands(); i !=
NumOps; ++i) {
470 if (
MI.isRegTiedToDefOperand(i, &ti)) {
471 DstReg =
MI.getOperand(ti).getReg();
480MachineInstr *TwoAddressInstructionImpl::findOnlyInterestingUse(
482 bool &IsDstPhys)
const {
483 MachineOperand *UseOp =
nullptr;
484 for (MachineOperand &MO :
MRI->use_nodbg_operands(
Reg)) {
489 if (
MI->getParent() !=
MBB)
491 if (isPlainlyKilled(
MI,
Reg))
500 if (isCopyToReg(
UseMI, SrcReg, DstReg, IsSrcPhys, IsDstPhys)) {
509 if (
UseMI.isCommutable()) {
512 if (
TII->findCommutedOpIndices(
UseMI, Src1, Src2)) {
513 MachineOperand &MO =
UseMI.getOperand(Src1);
528 while (
Reg.isVirtual()) {
530 if (
SI == RegMap.
end())
534 if (
Reg.isPhysical())
540bool TwoAddressInstructionImpl::regsAreCompatible(
Register RegA,
546 return TRI->regsOverlap(RegA, RegB);
550void TwoAddressInstructionImpl::removeMapRegEntry(
551 const MachineOperand &MO, DenseMap<Register, Register> &RegMap)
const {
554 "removeMapRegEntry must be called with a register or regmask operand.");
557 for (
auto SI : RegMap) {
564 if (
TRI->regsOverlap(ToReg,
Reg))
570 for (
auto SrcReg : Srcs)
571 RegMap.erase(SrcReg);
582void TwoAddressInstructionImpl::removeClobberedSrcRegMap(MachineInstr *
MI) {
595 if (!Dst || Dst.isVirtual())
599 if (regsAreCompatible(Dst,
getMappedReg(Src, SrcRegMap)))
603 for (
const MachineOperand &MO :
MI->operands()) {
605 removeMapRegEntry(MO, SrcRegMap);
613 removeMapRegEntry(MO, SrcRegMap);
618bool TwoAddressInstructionImpl::regOverlapsSet(
619 const SmallVectorImpl<Register> &Set,
Register Reg)
const {
621 if (
TRI->regsOverlap(R,
Reg))
629bool TwoAddressInstructionImpl::isProfitableToCommute(
Register RegA,
634 if (OptLevel == CodeGenOptLevel::None)
655 if (!isPlainlyKilled(
MI, RegC))
672 bool CompB = FromRegB && regsAreCompatible(FromRegB, ToRegA);
673 bool CompC = FromRegC && regsAreCompatible(FromRegC, ToRegA);
679 if ((!FromRegB && CompC) || (FromRegB && !CompB && (!FromRegC || CompC)))
685 if ((!FromRegC && CompB) || (FromRegC && !CompC && (!FromRegB || CompB)))
691 unsigned LastDefC = 0;
692 if (!noUseAfterLastDef(RegC, Dist, LastDefC))
697 unsigned LastDefB = 0;
698 if (!noUseAfterLastDef(RegB, Dist, LastDefB))
724 if (
TII->hasCommutePreference(*
MI, Commute))
729 return LastDefB && LastDefC && LastDefC > LastDefB;
734bool TwoAddressInstructionImpl::commuteInstruction(MachineInstr *
MI,
739 Register RegC =
MI->getOperand(RegCIdx).getReg();
741 MachineInstr *NewMI =
TII->commuteInstruction(*
MI,
false, RegBIdx, RegCIdx);
743 if (NewMI ==
nullptr) {
750 "TargetInstrInfo::commuteInstruction() should not return a new "
751 "instruction unless it was requested.");
756 Register RegA =
MI->getOperand(DstIdx).getReg();
757 SrcRegMap[RegA] = FromRegC;
765bool TwoAddressInstructionImpl::isProfitableToConv3Addr(
Register RegA,
777 return (ToRegA && !regsAreCompatible(FromRegB, ToRegA));
782bool TwoAddressInstructionImpl::convertInstTo3Addr(
785 MachineInstrSpan MIS(mi,
MBB);
786 MachineInstr *NewMI =
TII->convertToThreeAddress(*mi, LV, LIS);
790 for (MachineInstr &
MI : MIS)
791 DistanceMap.
insert(std::make_pair(&
MI, Dist++));
794 LLVM_DEBUG(
dbgs() <<
"2addr: CONVERTED IN-PLACE TO 3-ADDR: " << *mi);
797 dbgs() <<
"2addr: CONVERTING 2-ADDR: " << *mi;
798 dbgs() <<
"2addr: TO 3-ADDR: " << *NewMI;
802 if (
auto OldInstrNum = mi->peekDebugInstrNum()) {
803 assert(mi->getNumExplicitDefs() == 1);
807 unsigned OldIdx = mi->defs().begin()->getOperandNo();
808 unsigned NewIdx = NewMI->
defs().
begin()->getOperandNo();
813 std::make_pair(NewInstrNum, NewIdx));
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);
1343 if (Commuted && !ConvertibleTo3Addr)
1346 if (shouldOnlyCommute)
1359 regB =
MI.getOperand(SrcIdx).getReg();
1360 regBKilled = isKilled(
MI, regB,
true);
1363 if (ConvertibleTo3Addr) {
1366 if (!regBKilled || isProfitableToConv3Addr(regA, regB)) {
1368 if (convertInstTo3Addr(mi, nmi, regA, regB, Dist)) {
1369 ++NumConvertedTo3Addr;
1394 if (
MI.mayLoad() && !regBKilled) {
1396 unsigned LoadRegIndex;
1398 TII->getOpcodeAfterMemoryUnfold(
MI.getOpcode(),
1403 const MCInstrDesc &UnfoldMCID =
TII->get(NewOpc);
1407 const TargetRegisterClass *RC =
TRI->getAllocatableClass(
1408 TII->getRegClass(UnfoldMCID, LoadRegIndex));
1410 SmallVector<MachineInstr *, 2> NewMIs;
1411 if (!
TII->unfoldMemoryOperand(*MF,
MI,
Reg,
1418 "Unfolded a load into multiple instructions!");
1420 NewMIs[1]->addRegisterKilled(
Reg,
TRI);
1426 DistanceMap.
insert(std::make_pair(NewMIs[0], Dist++));
1427 DistanceMap.
insert(std::make_pair(NewMIs[1], Dist));
1430 <<
"2addr: NEW INST: " << *NewMIs[1]);
1433 unsigned NewDstIdx =
1434 NewMIs[1]->findRegisterDefOperandIdx(regA,
nullptr);
1435 unsigned NewSrcIdx =
1436 NewMIs[1]->findRegisterUseOperandIdx(regB,
nullptr);
1438 bool TransformResult =
1439 tryInstructionTransform(NewMI, mi, NewSrcIdx, NewDstIdx, Dist,
true);
1440 (void)TransformResult;
1441 assert(!TransformResult &&
1442 "tryInstructionTransform() should return false.");
1443 if (NewMIs[1]->getOperand(NewSrcIdx).isKill()) {
1447 for (
const MachineOperand &MO :
MI.operands()) {
1451 if (NewMIs[0]->killsRegister(MO.
getReg(),
nullptr))
1456 "Kill missing after load unfold!");
1461 if (NewMIs[1]->registerDefIsDead(MO.
getReg(),
1467 "Dead flag missing after load unfold!");
1478 for (
const MachineOperand &MO :
MI.operands()) {
1486 MI.eraseFromParent();
1502 NewMIs[0]->eraseFromParent();
1503 NewMIs[1]->eraseFromParent();
1504 DistanceMap.
erase(NewMIs[0]);
1505 DistanceMap.
erase(NewMIs[1]);
1518bool TwoAddressInstructionImpl::collectTiedOperands(
1519 MachineInstr *
MI, TiedOperandMap &TiedOperands) {
1520 bool AnyOps =
false;
1521 unsigned NumOps =
MI->getNumOperands();
1523 for (
unsigned SrcIdx = 0; SrcIdx <
NumOps; ++SrcIdx) {
1524 unsigned DstIdx = 0;
1525 if (!
MI->isRegTiedToDefOperand(SrcIdx, &DstIdx))
1528 MachineOperand &SrcMO =
MI->getOperand(SrcIdx);
1529 MachineOperand &DstMO =
MI->getOperand(DstIdx);
1533 if (SrcReg == DstReg)
1536 assert(SrcReg && SrcMO.
isUse() &&
"two address instruction invalid");
1542 const TargetRegisterClass *RC =
MRI->getRegClass(SrcReg);
1543 MRI->constrainRegClass(DstReg, RC);
1550 TiedOperands[SrcReg].push_back(std::make_pair(SrcIdx, DstIdx));
1557void TwoAddressInstructionImpl::processTiedPairs(MachineInstr *
MI,
1558 TiedPairList &TiedPairs,
1560 bool IsEarlyClobber =
llvm::any_of(TiedPairs, [
MI](
auto const &TP) {
1561 return MI->getOperand(TP.second).isEarlyClobber();
1564 bool RemovedKillFlag =
false;
1565 bool AllUsesCopied =
true;
1567 SlotIndex LastCopyIdx;
1569 unsigned SubRegB = 0;
1570 for (
auto &TP : TiedPairs) {
1571 unsigned SrcIdx = TP.first;
1572 unsigned DstIdx = TP.second;
1574 const MachineOperand &DstMO =
MI->getOperand(DstIdx);
1579 RegB =
MI->getOperand(SrcIdx).getReg();
1580 SubRegB =
MI->getOperand(SrcIdx).getSubReg();
1586 AllUsesCopied =
false;
1589 LastCopiedReg = RegA;
1591 assert(RegB.
isVirtual() &&
"cannot make instruction into two-address form");
1597 for (
unsigned i = 0; i !=
MI->getNumOperands(); ++i)
1599 !
MI->getOperand(i).isReg() ||
1600 MI->getOperand(i).getReg() != RegA);
1604 MachineInstrBuilder MIB =
BuildMI(*
MI->getParent(),
MI,
MI->getDebugLoc(),
1605 TII->get(TargetOpcode::COPY), RegA);
1608 MIB.
addReg(RegB, {}, SubRegB);
1609 const TargetRegisterClass *RC =
MRI->getRegClass(RegB);
1612 assert(
TRI->getMatchingSuperRegClass(RC,
MRI->getRegClass(RegA),
1614 "tied subregister must be a truncation");
1618 assert(
TRI->getMatchingSuperReg(RegA, SubRegB,
MRI->getRegClass(RegB))
1619 &&
"tied subregister must be a truncation");
1626 DistanceMap.
insert(std::make_pair(&*PrevMI, Dist));
1627 DistanceMap[
MI] = ++Dist;
1637 LI.
addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1640 S.addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1643 for (MCRegUnit Unit :
TRI->regunits(RegA)) {
1647 LR->
addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1655 MachineOperand &MO =
MI->getOperand(SrcIdx);
1657 "inconsistent operand info for 2-reg pass");
1658 if (isPlainlyKilled(MO)) {
1660 RemovedKillFlag =
true;
1665 MRI->constrainRegClass(RegA, RC);
1673 if (
MI->isBundle()) {
1677 "tied subregister uses in bundled instructions not supported");
1684 if (AllUsesCopied) {
1687 for (MachineOperand &MO :
MI->all_uses()) {
1688 if (MO.
getReg() == RegB) {
1689 if (MO.
getSubReg() == SubRegB && !IsEarlyClobber) {
1690 if (isPlainlyKilled(MO)) {
1692 RemovedKillFlag =
true;
1694 MO.
setReg(LastCopiedReg);
1697 RemainingUses |=
TRI->getSubRegIndexLaneMask(MO.
getSubReg());
1703 if (RemovedKillFlag && RemainingUses.
none() && LV &&
1710 if (RemovedKillFlag && RemainingUses.
none())
1711 SrcRegMap[LastCopiedReg] = RegB;
1716 auto Shrink = [=](
LiveRange &LR, LaneBitmask LaneMask) {
1720 if ((LaneMask & RemainingUses).
any())
1724 S->
end = LastCopyIdx;
1729 bool ShrinkLI =
true;
1731 ShrinkLI &= Shrink(S, S.LaneMask);
1735 }
else if (RemovedKillFlag) {
1740 for (MachineOperand &MO :
MI->all_uses()) {
1741 if (MO.
getReg() == RegB) {
1756bool TwoAddressInstructionImpl::processStatepoint(
1757 MachineInstr *
MI, TiedOperandMap &TiedOperands) {
1759 bool NeedCopy =
false;
1760 for (
auto &TO : TiedOperands) {
1762 if (TO.second.size() != 1) {
1767 unsigned SrcIdx = TO.second[0].first;
1768 unsigned DstIdx = TO.second[0].second;
1770 MachineOperand &DstMO =
MI->getOperand(DstIdx);
1773 assert(RegB ==
MI->getOperand(SrcIdx).getReg());
1786 if (DefLI.overlaps(UseLI)) {
1788 <<
" UseLI overlaps with DefLI\n");
1797 <<
" not killed by statepoint\n");
1802 if (!
MRI->constrainRegClass(RegB,
MRI->getRegClass(RegA))) {
1804 <<
" to register class of " <<
printReg(RegA,
TRI, 0)
1809 MRI->replaceRegWith(RegA, RegB);
1816 for (
const VNInfo *VNI :
Other.valnos) {
1820 for (
auto &S :
Other) {
1821 VNInfo *VNI = NewVNIs[S.
valno->
id];
1822 LiveRange::Segment NewSeg(S.
start, S.
end, VNI);
1829 if (
MI->getOperand(SrcIdx).isKill())
1831 LiveVariables::VarInfo &SrcInfo = LV->
getVarInfo(RegB);
1832 LiveVariables::VarInfo &DstInfo = LV->
getVarInfo(RegA);
1835 for (
auto *KillMI : DstInfo.
Kills)
1843bool TwoAddressInstructionImpl::run() {
1844 bool MadeChange =
false;
1846 LLVM_DEBUG(
dbgs() <<
"********** REWRITING TWO-ADDR INSTRS **********\n");
1855 TiedOperandMap TiedOperands;
1856 for (MachineBasicBlock &
MBBI : *MF) {
1859 DistanceMap.
clear();
1867 if (mi->isDebugInstr()) {
1874 if (mi->isRegSequence()) {
1875 eliminateRegSequence(mi);
1879 DistanceMap.
insert(std::make_pair(&*mi, ++Dist));
1885 if (!collectTiedOperands(&*mi, TiedOperands)) {
1886 removeClobberedSrcRegMap(&*mi);
1891 ++NumTwoAddressInstrs;
1898 if (TiedOperands.size() == 1) {
1899 SmallVectorImpl<std::pair<unsigned, unsigned>> &TiedPairs
1900 = TiedOperands.begin()->second;
1901 if (TiedPairs.
size() == 1) {
1902 unsigned SrcIdx = TiedPairs[0].first;
1903 unsigned DstIdx = TiedPairs[0].second;
1904 Register SrcReg = mi->getOperand(SrcIdx).getReg();
1905 Register DstReg = mi->getOperand(DstIdx).getReg();
1906 if (SrcReg != DstReg &&
1907 tryInstructionTransform(mi, nmi, SrcIdx, DstIdx, Dist,
false)) {
1910 TiedOperands.clear();
1911 removeClobberedSrcRegMap(&*mi);
1918 if (mi->getOpcode() == TargetOpcode::STATEPOINT &&
1919 processStatepoint(&*mi, TiedOperands)) {
1920 TiedOperands.clear();
1927 for (
auto &TO : TiedOperands) {
1928 processTiedPairs(&*mi, TO.second, Dist);
1933 if (mi->isInsertSubreg()) {
1936 unsigned SubIdx = mi->getOperand(3).getImm();
1937 mi->removeOperand(3);
1938 assert(mi->getOperand(0).getSubReg() == 0 &&
"Unexpected subreg idx");
1939 mi->getOperand(0).setSubReg(SubIdx);
1940 mi->getOperand(0).setIsUndef(mi->getOperand(1).isUndef());
1941 mi->removeOperand(1);
1942 mi->setDesc(
TII->get(TargetOpcode::COPY));
1952 LaneBitmask LaneMask =
1953 TRI->getSubRegIndexLaneMask(mi->getOperand(0).getSubReg());
1956 if ((S.LaneMask & LaneMask).none()) {
1957 LiveRange::iterator DefSeg = S.FindSegmentContaining(Idx);
1958 if (mi->getOperand(0).isUndef()) {
1959 S.removeValNo(DefSeg->valno);
1961 LiveRange::iterator UseSeg = std::prev(DefSeg);
1962 S.MergeValueNumberInto(DefSeg->valno, UseSeg->valno);
1980 TiedOperands.clear();
1981 removeClobberedSrcRegMap(&*mi);
1999void TwoAddressInstructionImpl::eliminateRegSequence(
2001 MachineInstr &
MI = *
MBBI;
2005 VNInfo *DefVN =
nullptr;
2008 for (
unsigned i = 1, e =
MI.getNumOperands(); i < e; i += 2)
2018 bool DefEmitted =
false;
2019 for (
unsigned i = 1, e =
MI.getNumOperands(); i < e; i += 2) {
2020 MachineOperand &UseMO =
MI.getOperand(i);
2022 unsigned SubIdx =
MI.getOperand(i+1).getImm();
2025 UndefLanes |=
TRI->getSubRegIndexLaneMask(SubIdx);
2031 bool isKill = UseMO.
isKill();
2033 for (
unsigned j = i + 2;
j <
e;
j += 2)
2034 if (
MI.getOperand(j).getReg() == SrcReg) {
2035 MI.getOperand(j).setIsKill();
2042 MachineInstr *CopyMI =
BuildMI(*
MI.getParent(),
MI,
MI.getDebugLoc(),
2043 TII->get(TargetOpcode::COPY))
2044 .
addReg(DstReg, RegState::Define, SubIdx)
2068 MI.setDesc(
TII->get(TargetOpcode::IMPLICIT_DEF));
2069 for (
int j =
MI.getNumOperands() - 1, ee = 0; j > ee; --j)
2070 MI.removeOperand(j);
2076 if (UndefLanes.
any() && DefVN &&
MRI->shouldTrackSubRegLiveness(DstReg)) {
2078 for (MachineOperand &UseOp :
MRI->use_operands(DstReg)) {
2086 LaneBitmask LaneMask =
TRI->getSubRegIndexLaneMask(
SubReg);
2087 if ((UndefLanes & LaneMask).
any())
2096 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
#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 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"))
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,...
defusechain_iterator< false, true, false, true, false > def_iterator
def_iterator/def_begin/def_end - Walk all defs of the specified register.
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< 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.