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);
797 for (MachineInstr &
MI : MIS)
798 DistanceMap.
insert(std::make_pair(&
MI, Dist++));
801 LLVM_DEBUG(
dbgs() <<
"2addr: CONVERTED IN-PLACE TO 3-ADDR: " << *mi);
804 dbgs() <<
"2addr: CONVERTING 2-ADDR: " << *mi;
805 dbgs() <<
"2addr: TO 3-ADDR: " << *NewMI;
809 if (
auto OldInstrNum = mi->peekDebugInstrNum()) {
810 assert(mi->getNumExplicitDefs() == 1);
814 unsigned OldIdx = mi->defs().begin()->getOperandNo();
815 unsigned NewIdx = NewMI->
defs().
begin()->getOperandNo();
820 std::make_pair(NewInstrNum, NewIdx));
831 SrcRegMap.
erase(RegA);
832 DstRegMap.
erase(RegB);
838void TwoAddressInstructionImpl::scanUses(
Register DstReg) {
844 while (MachineInstr *
UseMI =
845 findOnlyInterestingUse(
Reg,
MBB, IsCopy, NewReg, IsDstPhys)) {
846 if (IsCopy && !Processed.insert(
UseMI).second)
849 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.
find(
UseMI);
850 if (DI != DistanceMap.
end())
858 SrcRegMap[NewReg] =
Reg;
863 if (!VirtRegPairs.
empty()) {
865 while (!VirtRegPairs.
empty()) {
867 bool isNew = DstRegMap.
insert(std::make_pair(FromReg, ToReg)).second;
869 assert(DstRegMap[FromReg] == ToReg &&
"Can't map to two dst registers!");
872 bool isNew = DstRegMap.
insert(std::make_pair(DstReg, ToReg)).second;
874 assert(DstRegMap[DstReg] == ToReg &&
"Can't map to two dst registers!");
890void TwoAddressInstructionImpl::processCopy(MachineInstr *
MI) {
891 if (Processed.count(
MI))
894 bool IsSrcPhys, IsDstPhys;
896 if (!isCopyToReg(*
MI, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
899 if (IsDstPhys && !IsSrcPhys) {
900 DstRegMap.
insert(std::make_pair(SrcReg, DstReg));
901 }
else if (!IsDstPhys && IsSrcPhys) {
902 bool isNew = SrcRegMap.
insert(std::make_pair(DstReg, SrcReg)).second;
904 assert(SrcRegMap[DstReg] == SrcReg &&
905 "Can't map to two src physical registers!");
910 Processed.insert(
MI);
916bool TwoAddressInstructionImpl::rescheduleMIBelowKill(
924 MachineInstr *
MI = &*mi;
925 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.
find(
MI);
926 if (DI == DistanceMap.
end())
930 MachineInstr *KillMI =
nullptr;
934 "Reg should not have empty live interval.");
937 LiveInterval::const_iterator
I = LI.
find(MBBEndIdx);
938 if (
I != LI.
end() &&
I->start < MBBEndIdx)
959 bool SeenStore =
true;
960 if (!
MI->isSafeToMove(SeenStore))
970 for (
const MachineOperand &MO :
MI->operands()) {
979 Uses.push_back(MOReg);
980 if (MOReg !=
Reg && isPlainlyKilled(MO))
989 while (End !=
MBB->
end()) {
991 if (End->isCopy() && regOverlapsSet(Defs, End->getOperand(1).getReg()))
992 Defs.
push_back(End->getOperand(0).getReg());
999 unsigned NumVisited = 0;
1002 for (MachineInstr &OtherMI :
make_range(End, KillPos)) {
1004 if (OtherMI.isDebugOrPseudoInstr())
1006 if (NumVisited > 10)
1009 if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
1010 OtherMI.isBranch() || OtherMI.isTerminator())
1013 for (
const MachineOperand &MO : OtherMI.operands()) {
1020 if (regOverlapsSet(
Uses, MOReg))
1023 if (!MO.
isDead() && regOverlapsSet(Defs, MOReg))
1029 if (regOverlapsSet(Defs, MOReg))
1031 bool isKill = isPlainlyKilled(MO);
1032 if (MOReg !=
Reg && ((isKill && regOverlapsSet(
Uses, MOReg)) ||
1033 regOverlapsSet(Kills, MOReg)))
1036 if (MOReg ==
Reg && !isKill)
1040 assert((MOReg !=
Reg || &OtherMI == KillMI) &&
1041 "Found multiple kills of a register in a basic block");
1047 while (Begin !=
MBB->
begin() && std::prev(Begin)->isDebugInstr())
1056 auto CopyMI =
MBBI++;
1058 if (!CopyMI->isDebugOrPseudoInstr())
1067 DistanceMap.
erase(DI);
1083bool TwoAddressInstructionImpl::isDefTooClose(
Register Reg,
unsigned Dist,
1085 for (MachineInstr &
DefMI :
MRI->def_instructions(
Reg)) {
1090 DenseMap<MachineInstr*, unsigned>::iterator DDI = DistanceMap.
find(&
DefMI);
1091 if (DDI == DistanceMap.
end())
1093 unsigned DefDist = DDI->second;
1094 assert(Dist > DefDist &&
"Visited def already?");
1104bool TwoAddressInstructionImpl::rescheduleKillAboveMI(
1112 MachineInstr *
MI = &*mi;
1113 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.
find(
MI);
1114 if (DI == DistanceMap.
end())
1118 MachineInstr *KillMI =
nullptr;
1122 "Reg should not have empty live interval.");
1125 LiveInterval::const_iterator
I = LI.
find(MBBEndIdx);
1126 if (
I != LI.
end() &&
I->start < MBBEndIdx)
1142 bool SeenStore =
true;
1150 for (
const MachineOperand &MO : KillMI->
operands()) {
1157 if (isDefTooClose(MOReg, DI->second,
MI))
1159 bool isKill = isPlainlyKilled(MO);
1160 if (MOReg ==
Reg && !isKill)
1162 Uses.push_back(MOReg);
1163 if (isKill && MOReg !=
Reg)
1173 unsigned NumVisited = 0;
1174 for (MachineInstr &OtherMI :
1177 if (OtherMI.isDebugOrPseudoInstr())
1179 if (NumVisited > 10)
1182 if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
1183 OtherMI.isBranch() || OtherMI.isTerminator())
1187 for (
const MachineOperand &MO : OtherMI.operands()) {
1194 if (regOverlapsSet(Defs, MOReg))
1198 if (regOverlapsSet(Kills, MOReg))
1201 if (&OtherMI !=
MI && MOReg ==
Reg && !isPlainlyKilled(MO))
1210 if (regOverlapsSet(
Uses, MOReg))
1212 if (MOReg.
isPhysical() && regOverlapsSet(LiveDefs, MOReg))
1221 while (InsertPos !=
MBB->
begin() && std::prev(InsertPos)->isDebugInstr())
1225 while (std::prev(From)->isDebugInstr())
1229 nmi = std::prev(InsertPos);
1230 DistanceMap.
erase(DI);
1256bool TwoAddressInstructionImpl::tryInstructionCommute(MachineInstr *
MI,
1261 if (!
MI->isCommutable())
1264 bool MadeChange =
false;
1265 Register DstOpReg =
MI->getOperand(DstOpIdx).getReg();
1266 Register BaseOpReg =
MI->getOperand(BaseOpIdx).getReg();
1267 unsigned OpsNum =
MI->getDesc().getNumOperands();
1268 unsigned OtherOpIdx =
MI->getDesc().getNumDefs();
1269 for (; OtherOpIdx < OpsNum; OtherOpIdx++) {
1274 if (OtherOpIdx == BaseOpIdx || !
MI->getOperand(OtherOpIdx).isReg() ||
1275 !
TII->findCommutedOpIndices(*
MI, BaseOpIdx, OtherOpIdx))
1278 Register OtherOpReg =
MI->getOperand(OtherOpIdx).getReg();
1279 bool AggressiveCommute =
false;
1283 bool OtherOpKilled = isKilled(*
MI, OtherOpReg,
false);
1284 bool DoCommute = !BaseOpKilled && OtherOpKilled;
1287 isProfitableToCommute(DstOpReg, BaseOpReg, OtherOpReg,
MI, Dist)) {
1289 AggressiveCommute =
true;
1293 if (DoCommute && commuteInstruction(
MI, DstOpIdx, BaseOpIdx, OtherOpIdx,
1297 if (AggressiveCommute)
1304 BaseOpReg = OtherOpReg;
1305 BaseOpKilled = OtherOpKilled;
1308 OpsNum =
MI->getDesc().getNumOperands();
1321bool TwoAddressInstructionImpl::tryInstructionTransform(
1323 unsigned SrcIdx,
unsigned DstIdx,
unsigned &Dist,
bool shouldOnlyCommute) {
1324 if (OptLevel == CodeGenOptLevel::None)
1327 MachineInstr &
MI = *mi;
1328 Register regA =
MI.getOperand(DstIdx).getReg();
1329 Register regB =
MI.getOperand(SrcIdx).getReg();
1331 assert(regB.
isVirtual() &&
"cannot make instruction into two-address form");
1332 bool regBKilled = isKilled(
MI, regB,
true);
1337 bool Commuted = tryInstructionCommute(&
MI, DstIdx, SrcIdx, regBKilled, Dist);
1350 if (Commuted && !ConvertibleTo3Addr)
1353 if (shouldOnlyCommute)
1366 regB =
MI.getOperand(SrcIdx).getReg();
1367 regBKilled = isKilled(
MI, regB,
true);
1370 if (ConvertibleTo3Addr) {
1373 if (!regBKilled || isProfitableToConv3Addr(regA, regB)) {
1375 if (convertInstTo3Addr(mi, nmi, regA, regB, Dist)) {
1376 ++NumConvertedTo3Addr;
1401 if (
MI.mayLoad() && !regBKilled) {
1403 unsigned LoadRegIndex;
1405 TII->getOpcodeAfterMemoryUnfold(
MI.getOpcode(),
1410 const MCInstrDesc &UnfoldMCID =
TII->get(NewOpc);
1414 const TargetRegisterClass *RC =
TRI->getAllocatableClass(
1415 TII->getRegClass(UnfoldMCID, LoadRegIndex));
1417 SmallVector<MachineInstr *, 2> NewMIs;
1418 if (!
TII->unfoldMemoryOperand(*MF,
MI,
Reg,
1425 "Unfolded a load into multiple instructions!");
1427 NewMIs[1]->addRegisterKilled(
Reg,
TRI);
1433 DistanceMap.
insert(std::make_pair(NewMIs[0], Dist++));
1434 DistanceMap.
insert(std::make_pair(NewMIs[1], Dist));
1437 <<
"2addr: NEW INST: " << *NewMIs[1]);
1440 unsigned NewDstIdx =
1441 NewMIs[1]->findRegisterDefOperandIdx(regA,
nullptr);
1442 unsigned NewSrcIdx =
1443 NewMIs[1]->findRegisterUseOperandIdx(regB,
nullptr);
1445 bool TransformResult =
1446 tryInstructionTransform(NewMI, mi, NewSrcIdx, NewDstIdx, Dist,
true);
1447 (void)TransformResult;
1448 assert(!TransformResult &&
1449 "tryInstructionTransform() should return false.");
1450 if (NewMIs[1]->getOperand(NewSrcIdx).isKill()) {
1454 for (
const MachineOperand &MO :
MI.operands()) {
1458 if (NewMIs[0]->killsRegister(MO.
getReg(),
nullptr))
1463 "Kill missing after load unfold!");
1468 if (NewMIs[1]->registerDefIsDead(MO.
getReg(),
1474 "Dead flag missing after load unfold!");
1485 for (
const MachineOperand &MO :
MI.operands()) {
1493 MI.eraseFromParent();
1509 NewMIs[0]->eraseFromParent();
1510 NewMIs[1]->eraseFromParent();
1511 DistanceMap.
erase(NewMIs[0]);
1512 DistanceMap.
erase(NewMIs[1]);
1525bool TwoAddressInstructionImpl::collectTiedOperands(
1526 MachineInstr *
MI, TiedOperandMap &TiedOperands) {
1527 bool AnyOps =
false;
1528 unsigned NumOps =
MI->getNumOperands();
1530 for (
unsigned SrcIdx = 0; SrcIdx <
NumOps; ++SrcIdx) {
1531 unsigned DstIdx = 0;
1532 if (!
MI->isRegTiedToDefOperand(SrcIdx, &DstIdx))
1535 MachineOperand &SrcMO =
MI->getOperand(SrcIdx);
1536 MachineOperand &DstMO =
MI->getOperand(DstIdx);
1540 if (SrcReg == DstReg)
1543 assert(SrcReg && SrcMO.
isUse() &&
"two address instruction invalid");
1549 const TargetRegisterClass *RC =
MRI->getRegClass(SrcReg);
1550 MRI->constrainRegClass(DstReg, RC);
1557 TiedOperands[SrcReg].push_back(std::make_pair(SrcIdx, DstIdx));
1564void TwoAddressInstructionImpl::processTiedPairs(MachineInstr *
MI,
1565 TiedPairList &TiedPairs,
1567 bool IsEarlyClobber =
llvm::any_of(TiedPairs, [
MI](
auto const &TP) {
1568 return MI->getOperand(TP.second).isEarlyClobber();
1571 bool RemovedKillFlag =
false;
1572 bool AllUsesCopied =
true;
1574 SlotIndex LastCopyIdx;
1576 unsigned SubRegB = 0;
1577 for (
auto &TP : TiedPairs) {
1578 unsigned SrcIdx = TP.first;
1579 unsigned DstIdx = TP.second;
1581 const MachineOperand &DstMO =
MI->getOperand(DstIdx);
1586 RegB =
MI->getOperand(SrcIdx).getReg();
1587 SubRegB =
MI->getOperand(SrcIdx).getSubReg();
1593 AllUsesCopied =
false;
1596 LastCopiedReg = RegA;
1598 assert(RegB.
isVirtual() &&
"cannot make instruction into two-address form");
1604 for (
unsigned i = 0; i !=
MI->getNumOperands(); ++i)
1606 !
MI->getOperand(i).isReg() ||
1607 MI->getOperand(i).getReg() != RegA);
1611 MachineInstrBuilder MIB =
BuildMI(*
MI->getParent(),
MI,
MI->getDebugLoc(),
1612 TII->get(TargetOpcode::COPY), RegA);
1615 MIB.
addReg(RegB, 0, SubRegB);
1616 const TargetRegisterClass *RC =
MRI->getRegClass(RegB);
1619 assert(
TRI->getMatchingSuperRegClass(RC,
MRI->getRegClass(RegA),
1621 "tied subregister must be a truncation");
1625 assert(
TRI->getMatchingSuperReg(RegA, SubRegB,
MRI->getRegClass(RegB))
1626 &&
"tied subregister must be a truncation");
1633 DistanceMap.
insert(std::make_pair(&*PrevMI, Dist));
1634 DistanceMap[
MI] = ++Dist;
1644 LI.
addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1647 S.addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1650 for (MCRegUnit Unit :
TRI->regunits(RegA)) {
1654 LR->
addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1662 MachineOperand &MO =
MI->getOperand(SrcIdx);
1664 "inconsistent operand info for 2-reg pass");
1665 if (isPlainlyKilled(MO)) {
1667 RemovedKillFlag =
true;
1672 MRI->constrainRegClass(RegA, RC);
1680 if (
MI->isBundle()) {
1684 "tied subregister uses in bundled instructions not supported");
1691 if (AllUsesCopied) {
1694 for (MachineOperand &MO :
MI->all_uses()) {
1695 if (MO.
getReg() == RegB) {
1696 if (MO.
getSubReg() == SubRegB && !IsEarlyClobber) {
1697 if (isPlainlyKilled(MO)) {
1699 RemovedKillFlag =
true;
1701 MO.
setReg(LastCopiedReg);
1704 RemainingUses |=
TRI->getSubRegIndexLaneMask(MO.
getSubReg());
1710 if (RemovedKillFlag && RemainingUses.
none() && LV &&
1717 if (RemovedKillFlag && RemainingUses.
none())
1718 SrcRegMap[LastCopiedReg] = RegB;
1723 auto Shrink = [=](
LiveRange &LR, LaneBitmask LaneMask) {
1727 if ((LaneMask & RemainingUses).
any())
1731 S->
end = LastCopyIdx;
1736 bool ShrinkLI =
true;
1738 ShrinkLI &= Shrink(S, S.LaneMask);
1742 }
else if (RemovedKillFlag) {
1747 for (MachineOperand &MO :
MI->all_uses()) {
1748 if (MO.
getReg() == RegB) {
1763bool TwoAddressInstructionImpl::processStatepoint(
1764 MachineInstr *
MI, TiedOperandMap &TiedOperands) {
1766 bool NeedCopy =
false;
1767 for (
auto &TO : TiedOperands) {
1769 if (TO.second.size() != 1) {
1774 unsigned SrcIdx = TO.second[0].first;
1775 unsigned DstIdx = TO.second[0].second;
1777 MachineOperand &DstMO =
MI->getOperand(DstIdx);
1780 assert(RegB ==
MI->getOperand(SrcIdx).getReg());
1793 if (DefLI.overlaps(UseLI)) {
1795 <<
" UseLI overlaps with DefLI\n");
1804 <<
" not killed by statepoint\n");
1809 if (!
MRI->constrainRegClass(RegB,
MRI->getRegClass(RegA))) {
1811 <<
" to register class of " <<
printReg(RegA,
TRI, 0)
1816 MRI->replaceRegWith(RegA, RegB);
1823 for (
const VNInfo *VNI :
Other.valnos) {
1827 for (
auto &S :
Other) {
1828 VNInfo *VNI = NewVNIs[S.
valno->
id];
1829 LiveRange::Segment NewSeg(S.
start, S.
end, VNI);
1836 if (
MI->getOperand(SrcIdx).isKill())
1838 LiveVariables::VarInfo &SrcInfo = LV->
getVarInfo(RegB);
1839 LiveVariables::VarInfo &DstInfo = LV->
getVarInfo(RegA);
1842 for (
auto *KillMI : DstInfo.
Kills)
1850bool TwoAddressInstructionImpl::run() {
1851 bool MadeChange =
false;
1853 LLVM_DEBUG(
dbgs() <<
"********** REWRITING TWO-ADDR INSTRS **********\n");
1862 TiedOperandMap TiedOperands;
1863 for (MachineBasicBlock &
MBBI : *MF) {
1866 DistanceMap.
clear();
1874 if (mi->isDebugInstr()) {
1881 if (mi->isRegSequence())
1882 eliminateRegSequence(mi);
1884 DistanceMap.
insert(std::make_pair(&*mi, ++Dist));
1890 if (!collectTiedOperands(&*mi, TiedOperands)) {
1891 removeClobberedSrcRegMap(&*mi);
1896 ++NumTwoAddressInstrs;
1903 if (TiedOperands.size() == 1) {
1904 SmallVectorImpl<std::pair<unsigned, unsigned>> &TiedPairs
1905 = TiedOperands.begin()->second;
1906 if (TiedPairs.
size() == 1) {
1907 unsigned SrcIdx = TiedPairs[0].first;
1908 unsigned DstIdx = TiedPairs[0].second;
1909 Register SrcReg = mi->getOperand(SrcIdx).getReg();
1910 Register DstReg = mi->getOperand(DstIdx).getReg();
1911 if (SrcReg != DstReg &&
1912 tryInstructionTransform(mi, nmi, SrcIdx, DstIdx, Dist,
false)) {
1915 TiedOperands.clear();
1916 removeClobberedSrcRegMap(&*mi);
1923 if (mi->getOpcode() == TargetOpcode::STATEPOINT &&
1924 processStatepoint(&*mi, TiedOperands)) {
1925 TiedOperands.clear();
1932 for (
auto &TO : TiedOperands) {
1933 processTiedPairs(&*mi, TO.second, Dist);
1938 if (mi->isInsertSubreg()) {
1941 unsigned SubIdx = mi->getOperand(3).getImm();
1942 mi->removeOperand(3);
1943 assert(mi->getOperand(0).getSubReg() == 0 &&
"Unexpected subreg idx");
1944 mi->getOperand(0).setSubReg(SubIdx);
1945 mi->getOperand(0).setIsUndef(mi->getOperand(1).isUndef());
1946 mi->removeOperand(1);
1947 mi->setDesc(
TII->get(TargetOpcode::COPY));
1957 LaneBitmask LaneMask =
1958 TRI->getSubRegIndexLaneMask(mi->getOperand(0).getSubReg());
1961 if ((S.LaneMask & LaneMask).none()) {
1962 LiveRange::iterator DefSeg = S.FindSegmentContaining(Idx);
1963 if (mi->getOperand(0).isUndef()) {
1964 S.removeValNo(DefSeg->valno);
1966 LiveRange::iterator UseSeg = std::prev(DefSeg);
1967 S.MergeValueNumberInto(DefSeg->valno, UseSeg->valno);
1985 TiedOperands.clear();
1986 removeClobberedSrcRegMap(&*mi);
2004void TwoAddressInstructionImpl::eliminateRegSequence(
2006 MachineInstr &
MI = *
MBBI;
2010 VNInfo *DefVN =
nullptr;
2013 for (
unsigned i = 1, e =
MI.getNumOperands(); i < e; i += 2)
2023 bool DefEmitted =
false;
2024 for (
unsigned i = 1, e =
MI.getNumOperands(); i < e; i += 2) {
2025 MachineOperand &UseMO =
MI.getOperand(i);
2027 unsigned SubIdx =
MI.getOperand(i+1).getImm();
2030 UndefLanes |=
TRI->getSubRegIndexLaneMask(SubIdx);
2036 bool isKill = UseMO.
isKill();
2038 for (
unsigned j = i + 2;
j <
e;
j += 2)
2039 if (
MI.getOperand(j).getReg() == SrcReg) {
2040 MI.getOperand(j).setIsKill();
2047 MachineInstr *CopyMI =
BuildMI(*
MI.getParent(),
MI,
MI.getDebugLoc(),
2048 TII->get(TargetOpcode::COPY))
2073 MI.setDesc(
TII->get(TargetOpcode::IMPLICIT_DEF));
2074 for (
int j =
MI.getNumOperands() - 1, ee = 0; j > ee; --j)
2075 MI.removeOperand(j);
2081 if (UndefLanes.
any() && DefVN &&
MRI->shouldTrackSubRegLiveness(DstReg)) {
2083 for (MachineOperand &UseOp :
MRI->use_operands(DstReg)) {
2091 LaneBitmask LaneMask =
TRI->getSubRegIndexLaneMask(
SubReg);
2092 if ((UndefLanes & LaneMask).
any())
2101 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.
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 & 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.
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.