1 //===- TwoAddressInstructionPass.cpp - Two-Address instruction pass -------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file implements the TwoAddress instruction pass which is used
10 // by most register allocators. Two-Address instructions are rewritten
20 // Note that if a register allocator chooses to use this pass, that it
21 // has to be capable of handling the non-SSA nature of these rewritten
24 // It is also worth noting that the duplicate operand of the two
25 // address instruction is removed.
27 //===----------------------------------------------------------------------===//
29 #include "llvm/ADT/DenseMap.h"
30 #include "llvm/ADT/SmallPtrSet.h"
31 #include "llvm/ADT/SmallSet.h"
32 #include "llvm/ADT/SmallVector.h"
33 #include "llvm/ADT/Statistic.h"
34 #include "llvm/ADT/iterator_range.h"
35 #include "llvm/Analysis/AliasAnalysis.h"
36 #include "llvm/CodeGen/LiveInterval.h"
37 #include "llvm/CodeGen/LiveIntervals.h"
38 #include "llvm/CodeGen/LiveVariables.h"
39 #include "llvm/CodeGen/MachineBasicBlock.h"
40 #include "llvm/CodeGen/MachineFunction.h"
41 #include "llvm/CodeGen/MachineFunctionPass.h"
42 #include "llvm/CodeGen/MachineInstr.h"
43 #include "llvm/CodeGen/MachineInstrBuilder.h"
44 #include "llvm/CodeGen/MachineOperand.h"
45 #include "llvm/CodeGen/MachineRegisterInfo.h"
46 #include "llvm/CodeGen/Passes.h"
47 #include "llvm/CodeGen/SlotIndexes.h"
48 #include "llvm/CodeGen/TargetInstrInfo.h"
49 #include "llvm/CodeGen/TargetOpcodes.h"
50 #include "llvm/CodeGen/TargetRegisterInfo.h"
51 #include "llvm/CodeGen/TargetSubtargetInfo.h"
52 #include "llvm/MC/MCInstrDesc.h"
53 #include "llvm/MC/MCInstrItineraries.h"
54 #include "llvm/Pass.h"
55 #include "llvm/Support/CodeGen.h"
56 #include "llvm/Support/CommandLine.h"
57 #include "llvm/Support/Debug.h"
58 #include "llvm/Support/ErrorHandling.h"
59 #include "llvm/Support/raw_ostream.h"
60 #include "llvm/Target/TargetMachine.h"
67 #define DEBUG_TYPE "twoaddressinstruction"
69 STATISTIC(NumTwoAddressInstrs
, "Number of two-address instructions");
70 STATISTIC(NumCommuted
, "Number of instructions commuted to coalesce");
71 STATISTIC(NumAggrCommuted
, "Number of instructions aggressively commuted");
72 STATISTIC(NumConvertedTo3Addr
, "Number of instructions promoted to 3-address");
73 STATISTIC(Num3AddrSunk
, "Number of 3-address instructions sunk");
74 STATISTIC(NumReSchedUps
, "Number of instructions re-scheduled up");
75 STATISTIC(NumReSchedDowns
, "Number of instructions re-scheduled down");
77 // Temporary flag to disable rescheduling.
79 EnableRescheduling("twoaddr-reschedule",
80 cl::desc("Coalesce copies by rescheduling (default=true)"),
81 cl::init(true), cl::Hidden
);
83 // Limit the number of dataflow edges to traverse when evaluating the benefit
84 // of commuting operands.
85 static cl::opt
<unsigned> MaxDataFlowEdge(
86 "dataflow-edge-limit", cl::Hidden
, cl::init(3),
87 cl::desc("Maximum number of dataflow edges to traverse when evaluating "
88 "the benefit of commuting operands"));
92 class TwoAddressInstructionPass
: public MachineFunctionPass
{
94 const TargetInstrInfo
*TII
;
95 const TargetRegisterInfo
*TRI
;
96 const InstrItineraryData
*InstrItins
;
97 MachineRegisterInfo
*MRI
;
101 CodeGenOpt::Level OptLevel
;
103 // The current basic block being processed.
104 MachineBasicBlock
*MBB
;
106 // Keep track the distance of a MI from the start of the current basic block.
107 DenseMap
<MachineInstr
*, unsigned> DistanceMap
;
109 // Set of already processed instructions in the current block.
110 SmallPtrSet
<MachineInstr
*, 8> Processed
;
112 // Set of instructions converted to three-address by target and then sunk
113 // down current basic block.
114 SmallPtrSet
<MachineInstr
*, 8> SunkInstrs
;
116 // A map from virtual registers to physical registers which are likely targets
117 // to be coalesced to due to copies from physical registers to virtual
118 // registers. e.g. v1024 = move r0.
119 DenseMap
<unsigned, unsigned> SrcRegMap
;
121 // A map from virtual registers to physical registers which are likely targets
122 // to be coalesced to due to copies to physical registers from virtual
123 // registers. e.g. r1 = move v1024.
124 DenseMap
<unsigned, unsigned> DstRegMap
;
126 bool sink3AddrInstruction(MachineInstr
*MI
, unsigned Reg
,
127 MachineBasicBlock::iterator OldPos
);
129 bool isRevCopyChain(unsigned FromReg
, unsigned ToReg
, int Maxlen
);
131 bool noUseAfterLastDef(unsigned Reg
, unsigned Dist
, unsigned &LastDef
);
133 bool isProfitableToCommute(unsigned regA
, unsigned regB
, unsigned regC
,
134 MachineInstr
*MI
, unsigned Dist
);
136 bool commuteInstruction(MachineInstr
*MI
, unsigned DstIdx
,
137 unsigned RegBIdx
, unsigned RegCIdx
, unsigned Dist
);
139 bool isProfitableToConv3Addr(unsigned RegA
, unsigned RegB
);
141 bool convertInstTo3Addr(MachineBasicBlock::iterator
&mi
,
142 MachineBasicBlock::iterator
&nmi
,
143 unsigned RegA
, unsigned RegB
, unsigned Dist
);
145 bool isDefTooClose(unsigned Reg
, unsigned Dist
, MachineInstr
*MI
);
147 bool rescheduleMIBelowKill(MachineBasicBlock::iterator
&mi
,
148 MachineBasicBlock::iterator
&nmi
,
150 bool rescheduleKillAboveMI(MachineBasicBlock::iterator
&mi
,
151 MachineBasicBlock::iterator
&nmi
,
154 bool tryInstructionTransform(MachineBasicBlock::iterator
&mi
,
155 MachineBasicBlock::iterator
&nmi
,
156 unsigned SrcIdx
, unsigned DstIdx
,
157 unsigned Dist
, bool shouldOnlyCommute
);
159 bool tryInstructionCommute(MachineInstr
*MI
,
164 void scanUses(unsigned DstReg
);
166 void processCopy(MachineInstr
*MI
);
168 using TiedPairList
= SmallVector
<std::pair
<unsigned, unsigned>, 4>;
169 using TiedOperandMap
= SmallDenseMap
<unsigned, TiedPairList
>;
171 bool collectTiedOperands(MachineInstr
*MI
, TiedOperandMap
&);
172 void processTiedPairs(MachineInstr
*MI
, TiedPairList
&, unsigned &Dist
);
173 void eliminateRegSequence(MachineBasicBlock::iterator
&);
176 static char ID
; // Pass identification, replacement for typeid
178 TwoAddressInstructionPass() : MachineFunctionPass(ID
) {
179 initializeTwoAddressInstructionPassPass(*PassRegistry::getPassRegistry());
182 void getAnalysisUsage(AnalysisUsage
&AU
) const override
{
183 AU
.setPreservesCFG();
184 AU
.addUsedIfAvailable
<AAResultsWrapperPass
>();
185 AU
.addUsedIfAvailable
<LiveVariables
>();
186 AU
.addPreserved
<LiveVariables
>();
187 AU
.addPreserved
<SlotIndexes
>();
188 AU
.addPreserved
<LiveIntervals
>();
189 AU
.addPreservedID(MachineLoopInfoID
);
190 AU
.addPreservedID(MachineDominatorsID
);
191 MachineFunctionPass::getAnalysisUsage(AU
);
194 /// Pass entry point.
195 bool runOnMachineFunction(MachineFunction
&) override
;
198 } // end anonymous namespace
200 char TwoAddressInstructionPass::ID
= 0;
202 char &llvm::TwoAddressInstructionPassID
= TwoAddressInstructionPass::ID
;
204 INITIALIZE_PASS_BEGIN(TwoAddressInstructionPass
, DEBUG_TYPE
,
205 "Two-Address instruction pass", false, false)
206 INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass
)
207 INITIALIZE_PASS_END(TwoAddressInstructionPass
, DEBUG_TYPE
,
208 "Two-Address instruction pass", false, false)
210 static bool isPlainlyKilled(MachineInstr
*MI
, unsigned Reg
, LiveIntervals
*LIS
);
212 /// A two-address instruction has been converted to a three-address instruction
213 /// to avoid clobbering a register. Try to sink it past the instruction that
214 /// would kill the above mentioned register to reduce register pressure.
215 bool TwoAddressInstructionPass::
216 sink3AddrInstruction(MachineInstr
*MI
, unsigned SavedReg
,
217 MachineBasicBlock::iterator OldPos
) {
218 // FIXME: Shouldn't we be trying to do this before we three-addressify the
219 // instruction? After this transformation is done, we no longer need
220 // the instruction to be in three-address form.
222 // Check if it's safe to move this instruction.
223 bool SeenStore
= true; // Be conservative.
224 if (!MI
->isSafeToMove(AA
, SeenStore
))
228 SmallSet
<unsigned, 4> UseRegs
;
230 for (const MachineOperand
&MO
: MI
->operands()) {
233 unsigned MOReg
= MO
.getReg();
236 if (MO
.isUse() && MOReg
!= SavedReg
)
237 UseRegs
.insert(MO
.getReg());
241 // Don't try to move it if it implicitly defines a register.
244 // For now, don't move any instructions that define multiple registers.
246 DefReg
= MO
.getReg();
249 // Find the instruction that kills SavedReg.
250 MachineInstr
*KillMI
= nullptr;
252 LiveInterval
&LI
= LIS
->getInterval(SavedReg
);
253 assert(LI
.end() != LI
.begin() &&
254 "Reg should not have empty live interval.");
256 SlotIndex MBBEndIdx
= LIS
->getMBBEndIdx(MBB
).getPrevSlot();
257 LiveInterval::const_iterator I
= LI
.find(MBBEndIdx
);
258 if (I
!= LI
.end() && I
->start
< MBBEndIdx
)
262 KillMI
= LIS
->getInstructionFromIndex(I
->end
);
265 for (MachineOperand
&UseMO
: MRI
->use_nodbg_operands(SavedReg
)) {
268 KillMI
= UseMO
.getParent();
273 // If we find the instruction that kills SavedReg, and it is in an
274 // appropriate location, we can try to sink the current instruction
276 if (!KillMI
|| KillMI
->getParent() != MBB
|| KillMI
== MI
||
277 MachineBasicBlock::iterator(KillMI
) == OldPos
|| KillMI
->isTerminator())
280 // If any of the definitions are used by another instruction between the
281 // position and the kill use, then it's not safe to sink it.
283 // FIXME: This can be sped up if there is an easy way to query whether an
284 // instruction is before or after another instruction. Then we can use
285 // MachineRegisterInfo def / use instead.
286 MachineOperand
*KillMO
= nullptr;
287 MachineBasicBlock::iterator KillPos
= KillMI
;
290 unsigned NumVisited
= 0;
291 for (MachineInstr
&OtherMI
: make_range(std::next(OldPos
), KillPos
)) {
292 // Debug instructions cannot be counted against the limit.
293 if (OtherMI
.isDebugInstr())
295 if (NumVisited
> 30) // FIXME: Arbitrary limit to reduce compile time cost.
298 for (unsigned i
= 0, e
= OtherMI
.getNumOperands(); i
!= e
; ++i
) {
299 MachineOperand
&MO
= OtherMI
.getOperand(i
);
302 unsigned MOReg
= MO
.getReg();
308 if (MO
.isKill() || (LIS
&& isPlainlyKilled(&OtherMI
, MOReg
, LIS
))) {
309 if (&OtherMI
== KillMI
&& MOReg
== SavedReg
)
310 // Save the operand that kills the register. We want to unset the kill
311 // marker if we can sink MI past it.
313 else if (UseRegs
.count(MOReg
))
314 // One of the uses is killed before the destination.
319 assert(KillMO
&& "Didn't find kill");
322 // Update kill and LV information.
323 KillMO
->setIsKill(false);
324 KillMO
= MI
->findRegisterUseOperand(SavedReg
, false, TRI
);
325 KillMO
->setIsKill(true);
328 LV
->replaceKillInstruction(SavedReg
, *KillMI
, *MI
);
331 // Move instruction to its destination.
333 MBB
->insert(KillPos
, MI
);
336 LIS
->handleMove(*MI
);
342 /// Return the MachineInstr* if it is the single def of the Reg in current BB.
343 static MachineInstr
*getSingleDef(unsigned Reg
, MachineBasicBlock
*BB
,
344 const MachineRegisterInfo
*MRI
) {
345 MachineInstr
*Ret
= nullptr;
346 for (MachineInstr
&DefMI
: MRI
->def_instructions(Reg
)) {
347 if (DefMI
.getParent() != BB
|| DefMI
.isDebugValue())
351 else if (Ret
!= &DefMI
)
357 /// Check if there is a reversed copy chain from FromReg to ToReg:
358 /// %Tmp1 = copy %Tmp2;
359 /// %FromReg = copy %Tmp1;
360 /// %ToReg = add %FromReg ...
361 /// %Tmp2 = copy %ToReg;
362 /// MaxLen specifies the maximum length of the copy chain the func
363 /// can walk through.
364 bool TwoAddressInstructionPass::isRevCopyChain(unsigned FromReg
, unsigned ToReg
,
366 unsigned TmpReg
= FromReg
;
367 for (int i
= 0; i
< Maxlen
; i
++) {
368 MachineInstr
*Def
= getSingleDef(TmpReg
, MBB
, MRI
);
369 if (!Def
|| !Def
->isCopy())
372 TmpReg
= Def
->getOperand(1).getReg();
380 /// Return true if there are no intervening uses between the last instruction
381 /// in the MBB that defines the specified register and the two-address
382 /// instruction which is being processed. It also returns the last def location
384 bool TwoAddressInstructionPass::noUseAfterLastDef(unsigned Reg
, unsigned Dist
,
387 unsigned LastUse
= Dist
;
388 for (MachineOperand
&MO
: MRI
->reg_operands(Reg
)) {
389 MachineInstr
*MI
= MO
.getParent();
390 if (MI
->getParent() != MBB
|| MI
->isDebugValue())
392 DenseMap
<MachineInstr
*, unsigned>::iterator DI
= DistanceMap
.find(MI
);
393 if (DI
== DistanceMap
.end())
395 if (MO
.isUse() && DI
->second
< LastUse
)
396 LastUse
= DI
->second
;
397 if (MO
.isDef() && DI
->second
> LastDef
)
398 LastDef
= DI
->second
;
401 return !(LastUse
> LastDef
&& LastUse
< Dist
);
404 /// Return true if the specified MI is a copy instruction or an extract_subreg
405 /// instruction. It also returns the source and destination registers and
406 /// whether they are physical registers by reference.
407 static bool isCopyToReg(MachineInstr
&MI
, const TargetInstrInfo
*TII
,
408 unsigned &SrcReg
, unsigned &DstReg
,
409 bool &IsSrcPhys
, bool &IsDstPhys
) {
413 DstReg
= MI
.getOperand(0).getReg();
414 SrcReg
= MI
.getOperand(1).getReg();
415 } else if (MI
.isInsertSubreg() || MI
.isSubregToReg()) {
416 DstReg
= MI
.getOperand(0).getReg();
417 SrcReg
= MI
.getOperand(2).getReg();
421 IsSrcPhys
= TargetRegisterInfo::isPhysicalRegister(SrcReg
);
422 IsDstPhys
= TargetRegisterInfo::isPhysicalRegister(DstReg
);
426 /// Test if the given register value, which is used by the
427 /// given instruction, is killed by the given instruction.
428 static bool isPlainlyKilled(MachineInstr
*MI
, unsigned Reg
,
429 LiveIntervals
*LIS
) {
430 if (LIS
&& TargetRegisterInfo::isVirtualRegister(Reg
) &&
431 !LIS
->isNotInMIMap(*MI
)) {
432 // FIXME: Sometimes tryInstructionTransform() will add instructions and
433 // test whether they can be folded before keeping them. In this case it
434 // sets a kill before recursively calling tryInstructionTransform() again.
435 // If there is no interval available, we assume that this instruction is
436 // one of those. A kill flag is manually inserted on the operand so the
437 // check below will handle it.
438 LiveInterval
&LI
= LIS
->getInterval(Reg
);
439 // This is to match the kill flag version where undefs don't have kill
441 if (!LI
.hasAtLeastOneValue())
444 SlotIndex useIdx
= LIS
->getInstructionIndex(*MI
);
445 LiveInterval::const_iterator I
= LI
.find(useIdx
);
446 assert(I
!= LI
.end() && "Reg must be live-in to use.");
447 return !I
->end
.isBlock() && SlotIndex::isSameInstr(I
->end
, useIdx
);
450 return MI
->killsRegister(Reg
);
453 /// Test if the given register value, which is used by the given
454 /// instruction, is killed by the given instruction. This looks through
455 /// coalescable copies to see if the original value is potentially not killed.
457 /// For example, in this code:
459 /// %reg1034 = copy %reg1024
460 /// %reg1035 = copy killed %reg1025
461 /// %reg1036 = add killed %reg1034, killed %reg1035
463 /// %reg1034 is not considered to be killed, since it is copied from a
464 /// register which is not killed. Treating it as not killed lets the
465 /// normal heuristics commute the (two-address) add, which lets
466 /// coalescing eliminate the extra copy.
468 /// If allowFalsePositives is true then likely kills are treated as kills even
469 /// if it can't be proven that they are kills.
470 static bool isKilled(MachineInstr
&MI
, unsigned Reg
,
471 const MachineRegisterInfo
*MRI
,
472 const TargetInstrInfo
*TII
,
474 bool allowFalsePositives
) {
475 MachineInstr
*DefMI
= &MI
;
477 // All uses of physical registers are likely to be kills.
478 if (TargetRegisterInfo::isPhysicalRegister(Reg
) &&
479 (allowFalsePositives
|| MRI
->hasOneUse(Reg
)))
481 if (!isPlainlyKilled(DefMI
, Reg
, LIS
))
483 if (TargetRegisterInfo::isPhysicalRegister(Reg
))
485 MachineRegisterInfo::def_iterator Begin
= MRI
->def_begin(Reg
);
486 // If there are multiple defs, we can't do a simple analysis, so just
487 // go with what the kill flag says.
488 if (std::next(Begin
) != MRI
->def_end())
490 DefMI
= Begin
->getParent();
491 bool IsSrcPhys
, IsDstPhys
;
492 unsigned SrcReg
, DstReg
;
493 // If the def is something other than a copy, then it isn't going to
494 // be coalesced, so follow the kill flag.
495 if (!isCopyToReg(*DefMI
, TII
, SrcReg
, DstReg
, IsSrcPhys
, IsDstPhys
))
501 /// Return true if the specified MI uses the specified register as a two-address
502 /// use. If so, return the destination register by reference.
503 static bool isTwoAddrUse(MachineInstr
&MI
, unsigned Reg
, unsigned &DstReg
) {
504 for (unsigned i
= 0, NumOps
= MI
.getNumOperands(); i
!= NumOps
; ++i
) {
505 const MachineOperand
&MO
= MI
.getOperand(i
);
506 if (!MO
.isReg() || !MO
.isUse() || MO
.getReg() != Reg
)
509 if (MI
.isRegTiedToDefOperand(i
, &ti
)) {
510 DstReg
= MI
.getOperand(ti
).getReg();
517 /// Given a register, if has a single in-basic block use, return the use
518 /// instruction if it's a copy or a two-address use.
520 MachineInstr
*findOnlyInterestingUse(unsigned Reg
, MachineBasicBlock
*MBB
,
521 MachineRegisterInfo
*MRI
,
522 const TargetInstrInfo
*TII
,
524 unsigned &DstReg
, bool &IsDstPhys
) {
525 if (!MRI
->hasOneNonDBGUse(Reg
))
526 // None or more than one use.
528 MachineInstr
&UseMI
= *MRI
->use_instr_nodbg_begin(Reg
);
529 if (UseMI
.getParent() != MBB
)
533 if (isCopyToReg(UseMI
, TII
, SrcReg
, DstReg
, IsSrcPhys
, IsDstPhys
)) {
538 if (isTwoAddrUse(UseMI
, Reg
, DstReg
)) {
539 IsDstPhys
= TargetRegisterInfo::isPhysicalRegister(DstReg
);
545 /// Return the physical register the specified virtual register might be mapped
548 getMappedReg(unsigned Reg
, DenseMap
<unsigned, unsigned> &RegMap
) {
549 while (TargetRegisterInfo::isVirtualRegister(Reg
)) {
550 DenseMap
<unsigned, unsigned>::iterator SI
= RegMap
.find(Reg
);
551 if (SI
== RegMap
.end())
555 if (TargetRegisterInfo::isPhysicalRegister(Reg
))
560 /// Return true if the two registers are equal or aliased.
562 regsAreCompatible(unsigned RegA
, unsigned RegB
, const TargetRegisterInfo
*TRI
) {
567 return TRI
->regsOverlap(RegA
, RegB
);
570 // Returns true if Reg is equal or aliased to at least one register in Set.
571 static bool regOverlapsSet(const SmallVectorImpl
<unsigned> &Set
, unsigned Reg
,
572 const TargetRegisterInfo
*TRI
) {
573 for (unsigned R
: Set
)
574 if (TRI
->regsOverlap(R
, Reg
))
580 /// Return true if it's potentially profitable to commute the two-address
581 /// instruction that's being processed.
583 TwoAddressInstructionPass::
584 isProfitableToCommute(unsigned regA
, unsigned regB
, unsigned regC
,
585 MachineInstr
*MI
, unsigned Dist
) {
586 if (OptLevel
== CodeGenOpt::None
)
589 // Determine if it's profitable to commute this two address instruction. In
590 // general, we want no uses between this instruction and the definition of
591 // the two-address register.
593 // %reg1028 = EXTRACT_SUBREG killed %reg1027, 1
594 // %reg1029 = COPY %reg1028
595 // %reg1029 = SHR8ri %reg1029, 7, implicit dead %eflags
596 // insert => %reg1030 = COPY %reg1028
597 // %reg1030 = ADD8rr killed %reg1028, killed %reg1029, implicit dead %eflags
598 // In this case, it might not be possible to coalesce the second COPY
599 // instruction if the first one is coalesced. So it would be profitable to
601 // %reg1028 = EXTRACT_SUBREG killed %reg1027, 1
602 // %reg1029 = COPY %reg1028
603 // %reg1029 = SHR8ri %reg1029, 7, implicit dead %eflags
604 // insert => %reg1030 = COPY %reg1029
605 // %reg1030 = ADD8rr killed %reg1029, killed %reg1028, implicit dead %eflags
607 if (!isPlainlyKilled(MI
, regC
, LIS
))
610 // Ok, we have something like:
611 // %reg1030 = ADD8rr killed %reg1028, killed %reg1029, implicit dead %eflags
612 // let's see if it's worth commuting it.
614 // Look for situations like this:
617 // %reg1026 = ADD %reg1024, %reg1025
619 // Commute the ADD to hopefully eliminate an otherwise unavoidable copy.
620 unsigned ToRegA
= getMappedReg(regA
, DstRegMap
);
622 unsigned FromRegB
= getMappedReg(regB
, SrcRegMap
);
623 unsigned FromRegC
= getMappedReg(regC
, SrcRegMap
);
624 bool CompB
= FromRegB
&& regsAreCompatible(FromRegB
, ToRegA
, TRI
);
625 bool CompC
= FromRegC
&& regsAreCompatible(FromRegC
, ToRegA
, TRI
);
627 // Compute if any of the following are true:
628 // -RegB is not tied to a register and RegC is compatible with RegA.
629 // -RegB is tied to the wrong physical register, but RegC is.
630 // -RegB is tied to the wrong physical register, and RegC isn't tied.
631 if ((!FromRegB
&& CompC
) || (FromRegB
&& !CompB
&& (!FromRegC
|| CompC
)))
633 // Don't compute if any of the following are true:
634 // -RegC is not tied to a register and RegB is compatible with RegA.
635 // -RegC is tied to the wrong physical register, but RegB is.
636 // -RegC is tied to the wrong physical register, and RegB isn't tied.
637 if ((!FromRegC
&& CompB
) || (FromRegC
&& !CompC
&& (!FromRegB
|| CompB
)))
641 // If there is a use of regC between its last def (could be livein) and this
642 // instruction, then bail.
643 unsigned LastDefC
= 0;
644 if (!noUseAfterLastDef(regC
, Dist
, LastDefC
))
647 // If there is a use of regB between its last def (could be livein) and this
648 // instruction, then go ahead and make this transformation.
649 unsigned LastDefB
= 0;
650 if (!noUseAfterLastDef(regB
, Dist
, LastDefB
))
653 // Look for situation like this:
654 // %reg101 = MOV %reg100
656 // %reg103 = ADD %reg102, %reg101
658 // %reg100 = MOV %reg103
659 // If there is a reversed copy chain from reg101 to reg103, commute the ADD
660 // to eliminate an otherwise unavoidable copy.
662 // We can extend the logic further: If an pair of operands in an insn has
663 // been merged, the insn could be regarded as a virtual copy, and the virtual
664 // copy could also be used to construct a copy chain.
665 // To more generally minimize register copies, ideally the logic of two addr
666 // instruction pass should be integrated with register allocation pass where
667 // interference graph is available.
668 if (isRevCopyChain(regC
, regA
, MaxDataFlowEdge
))
671 if (isRevCopyChain(regB
, regA
, MaxDataFlowEdge
))
674 // Since there are no intervening uses for both registers, then commute
675 // if the def of regC is closer. Its live interval is shorter.
676 return LastDefB
&& LastDefC
&& LastDefC
> LastDefB
;
679 /// Commute a two-address instruction and update the basic block, distance map,
680 /// and live variables if needed. Return true if it is successful.
681 bool TwoAddressInstructionPass::commuteInstruction(MachineInstr
*MI
,
686 unsigned RegC
= MI
->getOperand(RegCIdx
).getReg();
687 LLVM_DEBUG(dbgs() << "2addr: COMMUTING : " << *MI
);
688 MachineInstr
*NewMI
= TII
->commuteInstruction(*MI
, false, RegBIdx
, RegCIdx
);
690 if (NewMI
== nullptr) {
691 LLVM_DEBUG(dbgs() << "2addr: COMMUTING FAILED!\n");
695 LLVM_DEBUG(dbgs() << "2addr: COMMUTED TO: " << *NewMI
);
696 assert(NewMI
== MI
&&
697 "TargetInstrInfo::commuteInstruction() should not return a new "
698 "instruction unless it was requested.");
700 // Update source register map.
701 unsigned FromRegC
= getMappedReg(RegC
, SrcRegMap
);
703 unsigned RegA
= MI
->getOperand(DstIdx
).getReg();
704 SrcRegMap
[RegA
] = FromRegC
;
710 /// Return true if it is profitable to convert the given 2-address instruction
711 /// to a 3-address one.
713 TwoAddressInstructionPass::isProfitableToConv3Addr(unsigned RegA
,unsigned RegB
){
714 // Look for situations like this:
717 // %reg1026 = ADD %reg1024, %reg1025
719 // Turn ADD into a 3-address instruction to avoid a copy.
720 unsigned FromRegB
= getMappedReg(RegB
, SrcRegMap
);
723 unsigned ToRegA
= getMappedReg(RegA
, DstRegMap
);
724 return (ToRegA
&& !regsAreCompatible(FromRegB
, ToRegA
, TRI
));
727 /// Convert the specified two-address instruction into a three address one.
728 /// Return true if this transformation was successful.
730 TwoAddressInstructionPass::convertInstTo3Addr(MachineBasicBlock::iterator
&mi
,
731 MachineBasicBlock::iterator
&nmi
,
732 unsigned RegA
, unsigned RegB
,
734 // FIXME: Why does convertToThreeAddress() need an iterator reference?
735 MachineFunction::iterator MFI
= MBB
->getIterator();
736 MachineInstr
*NewMI
= TII
->convertToThreeAddress(MFI
, *mi
, LV
);
737 assert(MBB
->getIterator() == MFI
&&
738 "convertToThreeAddress changed iterator reference");
742 LLVM_DEBUG(dbgs() << "2addr: CONVERTING 2-ADDR: " << *mi
);
743 LLVM_DEBUG(dbgs() << "2addr: TO 3-ADDR: " << *NewMI
);
747 LIS
->ReplaceMachineInstrInMaps(*mi
, *NewMI
);
749 if (NewMI
->findRegisterUseOperand(RegB
, false, TRI
))
750 // FIXME: Temporary workaround. If the new instruction doesn't
751 // uses RegB, convertToThreeAddress must have created more
752 // then one instruction.
753 Sunk
= sink3AddrInstruction(NewMI
, RegB
, mi
);
755 MBB
->erase(mi
); // Nuke the old inst.
758 DistanceMap
.insert(std::make_pair(NewMI
, Dist
));
763 SunkInstrs
.insert(NewMI
);
765 // Update source and destination register maps.
766 SrcRegMap
.erase(RegA
);
767 DstRegMap
.erase(RegB
);
771 /// Scan forward recursively for only uses, update maps if the use is a copy or
772 /// a two-address instruction.
774 TwoAddressInstructionPass::scanUses(unsigned DstReg
) {
775 SmallVector
<unsigned, 4> VirtRegPairs
;
779 unsigned Reg
= DstReg
;
780 while (MachineInstr
*UseMI
= findOnlyInterestingUse(Reg
, MBB
, MRI
, TII
,IsCopy
,
781 NewReg
, IsDstPhys
)) {
782 if (IsCopy
&& !Processed
.insert(UseMI
).second
)
785 DenseMap
<MachineInstr
*, unsigned>::iterator DI
= DistanceMap
.find(UseMI
);
786 if (DI
!= DistanceMap
.end())
787 // Earlier in the same MBB.Reached via a back edge.
791 VirtRegPairs
.push_back(NewReg
);
794 bool isNew
= SrcRegMap
.insert(std::make_pair(NewReg
, Reg
)).second
;
796 assert(SrcRegMap
[NewReg
] == Reg
&& "Can't map to two src registers!");
797 VirtRegPairs
.push_back(NewReg
);
801 if (!VirtRegPairs
.empty()) {
802 unsigned ToReg
= VirtRegPairs
.back();
803 VirtRegPairs
.pop_back();
804 while (!VirtRegPairs
.empty()) {
805 unsigned FromReg
= VirtRegPairs
.back();
806 VirtRegPairs
.pop_back();
807 bool isNew
= DstRegMap
.insert(std::make_pair(FromReg
, ToReg
)).second
;
809 assert(DstRegMap
[FromReg
] == ToReg
&&"Can't map to two dst registers!");
812 bool isNew
= DstRegMap
.insert(std::make_pair(DstReg
, ToReg
)).second
;
814 assert(DstRegMap
[DstReg
] == ToReg
&& "Can't map to two dst registers!");
818 /// If the specified instruction is not yet processed, process it if it's a
819 /// copy. For a copy instruction, we find the physical registers the
820 /// source and destination registers might be mapped to. These are kept in
821 /// point-to maps used to determine future optimizations. e.g.
824 /// v1026 = add v1024, v1025
826 /// If 'add' is a two-address instruction, v1024, v1026 are both potentially
827 /// coalesced to r0 (from the input side). v1025 is mapped to r1. v1026 is
828 /// potentially joined with r1 on the output side. It's worthwhile to commute
829 /// 'add' to eliminate a copy.
830 void TwoAddressInstructionPass::processCopy(MachineInstr
*MI
) {
831 if (Processed
.count(MI
))
834 bool IsSrcPhys
, IsDstPhys
;
835 unsigned SrcReg
, DstReg
;
836 if (!isCopyToReg(*MI
, TII
, SrcReg
, DstReg
, IsSrcPhys
, IsDstPhys
))
839 if (IsDstPhys
&& !IsSrcPhys
)
840 DstRegMap
.insert(std::make_pair(SrcReg
, DstReg
));
841 else if (!IsDstPhys
&& IsSrcPhys
) {
842 bool isNew
= SrcRegMap
.insert(std::make_pair(DstReg
, SrcReg
)).second
;
844 assert(SrcRegMap
[DstReg
] == SrcReg
&&
845 "Can't map to two src physical registers!");
850 Processed
.insert(MI
);
853 /// If there is one more local instruction that reads 'Reg' and it kills 'Reg,
854 /// consider moving the instruction below the kill instruction in order to
855 /// eliminate the need for the copy.
856 bool TwoAddressInstructionPass::
857 rescheduleMIBelowKill(MachineBasicBlock::iterator
&mi
,
858 MachineBasicBlock::iterator
&nmi
,
860 // Bail immediately if we don't have LV or LIS available. We use them to find
861 // kills efficiently.
865 MachineInstr
*MI
= &*mi
;
866 DenseMap
<MachineInstr
*, unsigned>::iterator DI
= DistanceMap
.find(MI
);
867 if (DI
== DistanceMap
.end())
868 // Must be created from unfolded load. Don't waste time trying this.
871 MachineInstr
*KillMI
= nullptr;
873 LiveInterval
&LI
= LIS
->getInterval(Reg
);
874 assert(LI
.end() != LI
.begin() &&
875 "Reg should not have empty live interval.");
877 SlotIndex MBBEndIdx
= LIS
->getMBBEndIdx(MBB
).getPrevSlot();
878 LiveInterval::const_iterator I
= LI
.find(MBBEndIdx
);
879 if (I
!= LI
.end() && I
->start
< MBBEndIdx
)
883 KillMI
= LIS
->getInstructionFromIndex(I
->end
);
885 KillMI
= LV
->getVarInfo(Reg
).findKill(MBB
);
887 if (!KillMI
|| MI
== KillMI
|| KillMI
->isCopy() || KillMI
->isCopyLike())
888 // Don't mess with copies, they may be coalesced later.
891 if (KillMI
->hasUnmodeledSideEffects() || KillMI
->isCall() ||
892 KillMI
->isBranch() || KillMI
->isTerminator())
893 // Don't move pass calls, etc.
897 if (isTwoAddrUse(*KillMI
, Reg
, DstReg
))
900 bool SeenStore
= true;
901 if (!MI
->isSafeToMove(AA
, SeenStore
))
904 if (TII
->getInstrLatency(InstrItins
, *MI
) > 1)
905 // FIXME: Needs more sophisticated heuristics.
908 SmallVector
<unsigned, 2> Uses
;
909 SmallVector
<unsigned, 2> Kills
;
910 SmallVector
<unsigned, 2> Defs
;
911 for (const MachineOperand
&MO
: MI
->operands()) {
914 unsigned MOReg
= MO
.getReg();
918 Defs
.push_back(MOReg
);
920 Uses
.push_back(MOReg
);
921 if (MOReg
!= Reg
&& (MO
.isKill() ||
922 (LIS
&& isPlainlyKilled(MI
, MOReg
, LIS
))))
923 Kills
.push_back(MOReg
);
927 // Move the copies connected to MI down as well.
928 MachineBasicBlock::iterator Begin
= MI
;
929 MachineBasicBlock::iterator AfterMI
= std::next(Begin
);
930 MachineBasicBlock::iterator End
= AfterMI
;
931 while (End
!= MBB
->end()) {
932 End
= skipDebugInstructionsForward(End
, MBB
->end());
933 if (End
->isCopy() && regOverlapsSet(Defs
, End
->getOperand(1).getReg(), TRI
))
934 Defs
.push_back(End
->getOperand(0).getReg());
940 // Check if the reschedule will not break dependencies.
941 unsigned NumVisited
= 0;
942 MachineBasicBlock::iterator KillPos
= KillMI
;
944 for (MachineInstr
&OtherMI
: make_range(End
, KillPos
)) {
945 // Debug instructions cannot be counted against the limit.
946 if (OtherMI
.isDebugInstr())
948 if (NumVisited
> 10) // FIXME: Arbitrary limit to reduce compile time cost.
951 if (OtherMI
.hasUnmodeledSideEffects() || OtherMI
.isCall() ||
952 OtherMI
.isBranch() || OtherMI
.isTerminator())
953 // Don't move pass calls, etc.
955 for (const MachineOperand
&MO
: OtherMI
.operands()) {
958 unsigned MOReg
= MO
.getReg();
962 if (regOverlapsSet(Uses
, MOReg
, TRI
))
963 // Physical register use would be clobbered.
965 if (!MO
.isDead() && regOverlapsSet(Defs
, MOReg
, TRI
))
966 // May clobber a physical register def.
967 // FIXME: This may be too conservative. It's ok if the instruction
968 // is sunken completely below the use.
971 if (regOverlapsSet(Defs
, MOReg
, TRI
))
974 MO
.isKill() || (LIS
&& isPlainlyKilled(&OtherMI
, MOReg
, LIS
));
975 if (MOReg
!= Reg
&& ((isKill
&& regOverlapsSet(Uses
, MOReg
, TRI
)) ||
976 regOverlapsSet(Kills
, MOReg
, TRI
)))
977 // Don't want to extend other live ranges and update kills.
979 if (MOReg
== Reg
&& !isKill
)
980 // We can't schedule across a use of the register in question.
982 // Ensure that if this is register in question, its the kill we expect.
983 assert((MOReg
!= Reg
|| &OtherMI
== KillMI
) &&
984 "Found multiple kills of a register in a basic block");
989 // Move debug info as well.
990 while (Begin
!= MBB
->begin() && std::prev(Begin
)->isDebugInstr())
994 MachineBasicBlock::iterator InsertPos
= KillPos
;
996 // We have to move the copies first so that the MBB is still well-formed
997 // when calling handleMove().
998 for (MachineBasicBlock::iterator MBBI
= AfterMI
; MBBI
!= End
;) {
999 auto CopyMI
= MBBI
++;
1000 MBB
->splice(InsertPos
, MBB
, CopyMI
);
1001 LIS
->handleMove(*CopyMI
);
1004 End
= std::next(MachineBasicBlock::iterator(MI
));
1007 // Copies following MI may have been moved as well.
1008 MBB
->splice(InsertPos
, MBB
, Begin
, End
);
1009 DistanceMap
.erase(DI
);
1011 // Update live variables
1013 LIS
->handleMove(*MI
);
1015 LV
->removeVirtualRegisterKilled(Reg
, *KillMI
);
1016 LV
->addVirtualRegisterKilled(Reg
, *MI
);
1019 LLVM_DEBUG(dbgs() << "\trescheduled below kill: " << *KillMI
);
1023 /// Return true if the re-scheduling will put the given instruction too close
1024 /// to the defs of its register dependencies.
1025 bool TwoAddressInstructionPass::isDefTooClose(unsigned Reg
, unsigned Dist
,
1027 for (MachineInstr
&DefMI
: MRI
->def_instructions(Reg
)) {
1028 if (DefMI
.getParent() != MBB
|| DefMI
.isCopy() || DefMI
.isCopyLike())
1031 return true; // MI is defining something KillMI uses
1032 DenseMap
<MachineInstr
*, unsigned>::iterator DDI
= DistanceMap
.find(&DefMI
);
1033 if (DDI
== DistanceMap
.end())
1034 return true; // Below MI
1035 unsigned DefDist
= DDI
->second
;
1036 assert(Dist
> DefDist
&& "Visited def already?");
1037 if (TII
->getInstrLatency(InstrItins
, DefMI
) > (Dist
- DefDist
))
1043 /// If there is one more local instruction that reads 'Reg' and it kills 'Reg,
1044 /// consider moving the kill instruction above the current two-address
1045 /// instruction in order to eliminate the need for the copy.
1046 bool TwoAddressInstructionPass::
1047 rescheduleKillAboveMI(MachineBasicBlock::iterator
&mi
,
1048 MachineBasicBlock::iterator
&nmi
,
1050 // Bail immediately if we don't have LV or LIS available. We use them to find
1051 // kills efficiently.
1055 MachineInstr
*MI
= &*mi
;
1056 DenseMap
<MachineInstr
*, unsigned>::iterator DI
= DistanceMap
.find(MI
);
1057 if (DI
== DistanceMap
.end())
1058 // Must be created from unfolded load. Don't waste time trying this.
1061 MachineInstr
*KillMI
= nullptr;
1063 LiveInterval
&LI
= LIS
->getInterval(Reg
);
1064 assert(LI
.end() != LI
.begin() &&
1065 "Reg should not have empty live interval.");
1067 SlotIndex MBBEndIdx
= LIS
->getMBBEndIdx(MBB
).getPrevSlot();
1068 LiveInterval::const_iterator I
= LI
.find(MBBEndIdx
);
1069 if (I
!= LI
.end() && I
->start
< MBBEndIdx
)
1073 KillMI
= LIS
->getInstructionFromIndex(I
->end
);
1075 KillMI
= LV
->getVarInfo(Reg
).findKill(MBB
);
1077 if (!KillMI
|| MI
== KillMI
|| KillMI
->isCopy() || KillMI
->isCopyLike())
1078 // Don't mess with copies, they may be coalesced later.
1082 if (isTwoAddrUse(*KillMI
, Reg
, DstReg
))
1085 bool SeenStore
= true;
1086 if (!KillMI
->isSafeToMove(AA
, SeenStore
))
1089 SmallSet
<unsigned, 2> Uses
;
1090 SmallSet
<unsigned, 2> Kills
;
1091 SmallSet
<unsigned, 2> Defs
;
1092 SmallSet
<unsigned, 2> LiveDefs
;
1093 for (const MachineOperand
&MO
: KillMI
->operands()) {
1096 unsigned MOReg
= MO
.getReg();
1100 if (isDefTooClose(MOReg
, DI
->second
, MI
))
1102 bool isKill
= MO
.isKill() || (LIS
&& isPlainlyKilled(KillMI
, MOReg
, LIS
));
1103 if (MOReg
== Reg
&& !isKill
)
1106 if (isKill
&& MOReg
!= Reg
)
1107 Kills
.insert(MOReg
);
1108 } else if (TargetRegisterInfo::isPhysicalRegister(MOReg
)) {
1111 LiveDefs
.insert(MOReg
);
1115 // Check if the reschedule will not break depedencies.
1116 unsigned NumVisited
= 0;
1117 for (MachineInstr
&OtherMI
:
1118 make_range(mi
, MachineBasicBlock::iterator(KillMI
))) {
1119 // Debug instructions cannot be counted against the limit.
1120 if (OtherMI
.isDebugInstr())
1122 if (NumVisited
> 10) // FIXME: Arbitrary limit to reduce compile time cost.
1125 if (OtherMI
.hasUnmodeledSideEffects() || OtherMI
.isCall() ||
1126 OtherMI
.isBranch() || OtherMI
.isTerminator())
1127 // Don't move pass calls, etc.
1129 SmallVector
<unsigned, 2> OtherDefs
;
1130 for (const MachineOperand
&MO
: OtherMI
.operands()) {
1133 unsigned MOReg
= MO
.getReg();
1137 if (Defs
.count(MOReg
))
1138 // Moving KillMI can clobber the physical register if the def has
1141 if (Kills
.count(MOReg
))
1142 // Don't want to extend other live ranges and update kills.
1144 if (&OtherMI
!= MI
&& MOReg
== Reg
&&
1145 !(MO
.isKill() || (LIS
&& isPlainlyKilled(&OtherMI
, MOReg
, LIS
))))
1146 // We can't schedule across a use of the register in question.
1149 OtherDefs
.push_back(MOReg
);
1153 for (unsigned i
= 0, e
= OtherDefs
.size(); i
!= e
; ++i
) {
1154 unsigned MOReg
= OtherDefs
[i
];
1155 if (Uses
.count(MOReg
))
1157 if (TargetRegisterInfo::isPhysicalRegister(MOReg
) &&
1158 LiveDefs
.count(MOReg
))
1160 // Physical register def is seen.
1165 // Move the old kill above MI, don't forget to move debug info as well.
1166 MachineBasicBlock::iterator InsertPos
= mi
;
1167 while (InsertPos
!= MBB
->begin() && std::prev(InsertPos
)->isDebugInstr())
1169 MachineBasicBlock::iterator From
= KillMI
;
1170 MachineBasicBlock::iterator To
= std::next(From
);
1171 while (std::prev(From
)->isDebugInstr())
1173 MBB
->splice(InsertPos
, MBB
, From
, To
);
1175 nmi
= std::prev(InsertPos
); // Backtrack so we process the moved instr.
1176 DistanceMap
.erase(DI
);
1178 // Update live variables
1180 LIS
->handleMove(*KillMI
);
1182 LV
->removeVirtualRegisterKilled(Reg
, *KillMI
);
1183 LV
->addVirtualRegisterKilled(Reg
, *MI
);
1186 LLVM_DEBUG(dbgs() << "\trescheduled kill: " << *KillMI
);
1190 /// Tries to commute the operand 'BaseOpIdx' and some other operand in the
1191 /// given machine instruction to improve opportunities for coalescing and
1192 /// elimination of a register to register copy.
1194 /// 'DstOpIdx' specifies the index of MI def operand.
1195 /// 'BaseOpKilled' specifies if the register associated with 'BaseOpIdx'
1196 /// operand is killed by the given instruction.
1197 /// The 'Dist' arguments provides the distance of MI from the start of the
1198 /// current basic block and it is used to determine if it is profitable
1199 /// to commute operands in the instruction.
1201 /// Returns true if the transformation happened. Otherwise, returns false.
1202 bool TwoAddressInstructionPass::tryInstructionCommute(MachineInstr
*MI
,
1207 if (!MI
->isCommutable())
1210 bool MadeChange
= false;
1211 unsigned DstOpReg
= MI
->getOperand(DstOpIdx
).getReg();
1212 unsigned BaseOpReg
= MI
->getOperand(BaseOpIdx
).getReg();
1213 unsigned OpsNum
= MI
->getDesc().getNumOperands();
1214 unsigned OtherOpIdx
= MI
->getDesc().getNumDefs();
1215 for (; OtherOpIdx
< OpsNum
; OtherOpIdx
++) {
1216 // The call of findCommutedOpIndices below only checks if BaseOpIdx
1217 // and OtherOpIdx are commutable, it does not really search for
1218 // other commutable operands and does not change the values of passed
1220 if (OtherOpIdx
== BaseOpIdx
|| !MI
->getOperand(OtherOpIdx
).isReg() ||
1221 !TII
->findCommutedOpIndices(*MI
, BaseOpIdx
, OtherOpIdx
))
1224 unsigned OtherOpReg
= MI
->getOperand(OtherOpIdx
).getReg();
1225 bool AggressiveCommute
= false;
1227 // If OtherOp dies but BaseOp does not, swap the OtherOp and BaseOp
1228 // operands. This makes the live ranges of DstOp and OtherOp joinable.
1229 bool OtherOpKilled
= isKilled(*MI
, OtherOpReg
, MRI
, TII
, LIS
, false);
1230 bool DoCommute
= !BaseOpKilled
&& OtherOpKilled
;
1233 isProfitableToCommute(DstOpReg
, BaseOpReg
, OtherOpReg
, MI
, Dist
)) {
1235 AggressiveCommute
= true;
1238 // If it's profitable to commute, try to do so.
1239 if (DoCommute
&& commuteInstruction(MI
, DstOpIdx
, BaseOpIdx
, OtherOpIdx
,
1243 if (AggressiveCommute
) {
1245 // There might be more than two commutable operands, update BaseOp and
1246 // continue scanning.
1247 BaseOpReg
= OtherOpReg
;
1248 BaseOpKilled
= OtherOpKilled
;
1251 // If this was a commute based on kill, we won't do better continuing.
1258 /// For the case where an instruction has a single pair of tied register
1259 /// operands, attempt some transformations that may either eliminate the tied
1260 /// operands or improve the opportunities for coalescing away the register copy.
1261 /// Returns true if no copy needs to be inserted to untie mi's operands
1262 /// (either because they were untied, or because mi was rescheduled, and will
1263 /// be visited again later). If the shouldOnlyCommute flag is true, only
1264 /// instruction commutation is attempted.
1265 bool TwoAddressInstructionPass::
1266 tryInstructionTransform(MachineBasicBlock::iterator
&mi
,
1267 MachineBasicBlock::iterator
&nmi
,
1268 unsigned SrcIdx
, unsigned DstIdx
,
1269 unsigned Dist
, bool shouldOnlyCommute
) {
1270 if (OptLevel
== CodeGenOpt::None
)
1273 MachineInstr
&MI
= *mi
;
1274 unsigned regA
= MI
.getOperand(DstIdx
).getReg();
1275 unsigned regB
= MI
.getOperand(SrcIdx
).getReg();
1277 assert(TargetRegisterInfo::isVirtualRegister(regB
) &&
1278 "cannot make instruction into two-address form");
1279 bool regBKilled
= isKilled(MI
, regB
, MRI
, TII
, LIS
, true);
1281 if (TargetRegisterInfo::isVirtualRegister(regA
))
1284 bool Commuted
= tryInstructionCommute(&MI
, DstIdx
, SrcIdx
, regBKilled
, Dist
);
1286 // If the instruction is convertible to 3 Addr, instead
1287 // of returning try 3 Addr transformation aggresively and
1288 // use this variable to check later. Because it might be better.
1289 // For example, we can just use `leal (%rsi,%rdi), %eax` and `ret`
1290 // instead of the following code.
1294 if (Commuted
&& !MI
.isConvertibleTo3Addr())
1297 if (shouldOnlyCommute
)
1300 // If there is one more use of regB later in the same MBB, consider
1301 // re-schedule this MI below it.
1302 if (!Commuted
&& EnableRescheduling
&& rescheduleMIBelowKill(mi
, nmi
, regB
)) {
1307 // If we commuted, regB may have changed so we should re-sample it to avoid
1308 // confusing the three address conversion below.
1310 regB
= MI
.getOperand(SrcIdx
).getReg();
1311 regBKilled
= isKilled(MI
, regB
, MRI
, TII
, LIS
, true);
1314 if (MI
.isConvertibleTo3Addr()) {
1315 // This instruction is potentially convertible to a true
1316 // three-address instruction. Check if it is profitable.
1317 if (!regBKilled
|| isProfitableToConv3Addr(regA
, regB
)) {
1318 // Try to convert it.
1319 if (convertInstTo3Addr(mi
, nmi
, regA
, regB
, Dist
)) {
1320 ++NumConvertedTo3Addr
;
1321 return true; // Done with this instruction.
1326 // Return if it is commuted but 3 addr conversion is failed.
1330 // If there is one more use of regB later in the same MBB, consider
1331 // re-schedule it before this MI if it's legal.
1332 if (EnableRescheduling
&& rescheduleKillAboveMI(mi
, nmi
, regB
)) {
1337 // If this is an instruction with a load folded into it, try unfolding
1338 // the load, e.g. avoid this:
1340 // addq (%rax), %rcx
1341 // in favor of this:
1342 // movq (%rax), %rcx
1344 // because it's preferable to schedule a load than a register copy.
1345 if (MI
.mayLoad() && !regBKilled
) {
1346 // Determine if a load can be unfolded.
1347 unsigned LoadRegIndex
;
1349 TII
->getOpcodeAfterMemoryUnfold(MI
.getOpcode(),
1350 /*UnfoldLoad=*/true,
1351 /*UnfoldStore=*/false,
1354 const MCInstrDesc
&UnfoldMCID
= TII
->get(NewOpc
);
1355 if (UnfoldMCID
.getNumDefs() == 1) {
1357 LLVM_DEBUG(dbgs() << "2addr: UNFOLDING: " << MI
);
1358 const TargetRegisterClass
*RC
=
1359 TRI
->getAllocatableClass(
1360 TII
->getRegClass(UnfoldMCID
, LoadRegIndex
, TRI
, *MF
));
1361 unsigned Reg
= MRI
->createVirtualRegister(RC
);
1362 SmallVector
<MachineInstr
*, 2> NewMIs
;
1363 if (!TII
->unfoldMemoryOperand(*MF
, MI
, Reg
,
1364 /*UnfoldLoad=*/true,
1365 /*UnfoldStore=*/false, NewMIs
)) {
1366 LLVM_DEBUG(dbgs() << "2addr: ABANDONING UNFOLD\n");
1369 assert(NewMIs
.size() == 2 &&
1370 "Unfolded a load into multiple instructions!");
1371 // The load was previously folded, so this is the only use.
1372 NewMIs
[1]->addRegisterKilled(Reg
, TRI
);
1374 // Tentatively insert the instructions into the block so that they
1375 // look "normal" to the transformation logic.
1376 MBB
->insert(mi
, NewMIs
[0]);
1377 MBB
->insert(mi
, NewMIs
[1]);
1379 LLVM_DEBUG(dbgs() << "2addr: NEW LOAD: " << *NewMIs
[0]
1380 << "2addr: NEW INST: " << *NewMIs
[1]);
1382 // Transform the instruction, now that it no longer has a load.
1383 unsigned NewDstIdx
= NewMIs
[1]->findRegisterDefOperandIdx(regA
);
1384 unsigned NewSrcIdx
= NewMIs
[1]->findRegisterUseOperandIdx(regB
);
1385 MachineBasicBlock::iterator NewMI
= NewMIs
[1];
1386 bool TransformResult
=
1387 tryInstructionTransform(NewMI
, mi
, NewSrcIdx
, NewDstIdx
, Dist
, true);
1388 (void)TransformResult
;
1389 assert(!TransformResult
&&
1390 "tryInstructionTransform() should return false.");
1391 if (NewMIs
[1]->getOperand(NewSrcIdx
).isKill()) {
1392 // Success, or at least we made an improvement. Keep the unfolded
1393 // instructions and discard the original.
1395 for (unsigned i
= 0, e
= MI
.getNumOperands(); i
!= e
; ++i
) {
1396 MachineOperand
&MO
= MI
.getOperand(i
);
1398 TargetRegisterInfo::isVirtualRegister(MO
.getReg())) {
1401 if (NewMIs
[0]->killsRegister(MO
.getReg()))
1402 LV
->replaceKillInstruction(MO
.getReg(), MI
, *NewMIs
[0]);
1404 assert(NewMIs
[1]->killsRegister(MO
.getReg()) &&
1405 "Kill missing after load unfold!");
1406 LV
->replaceKillInstruction(MO
.getReg(), MI
, *NewMIs
[1]);
1409 } else if (LV
->removeVirtualRegisterDead(MO
.getReg(), MI
)) {
1410 if (NewMIs
[1]->registerDefIsDead(MO
.getReg()))
1411 LV
->addVirtualRegisterDead(MO
.getReg(), *NewMIs
[1]);
1413 assert(NewMIs
[0]->registerDefIsDead(MO
.getReg()) &&
1414 "Dead flag missing after load unfold!");
1415 LV
->addVirtualRegisterDead(MO
.getReg(), *NewMIs
[0]);
1420 LV
->addVirtualRegisterKilled(Reg
, *NewMIs
[1]);
1423 SmallVector
<unsigned, 4> OrigRegs
;
1425 for (const MachineOperand
&MO
: MI
.operands()) {
1427 OrigRegs
.push_back(MO
.getReg());
1431 MI
.eraseFromParent();
1433 // Update LiveIntervals.
1435 MachineBasicBlock::iterator
Begin(NewMIs
[0]);
1436 MachineBasicBlock::iterator
End(NewMIs
[1]);
1437 LIS
->repairIntervalsInRange(MBB
, Begin
, End
, OrigRegs
);
1442 // Transforming didn't eliminate the tie and didn't lead to an
1443 // improvement. Clean up the unfolded instructions and keep the
1445 LLVM_DEBUG(dbgs() << "2addr: ABANDONING UNFOLD\n");
1446 NewMIs
[0]->eraseFromParent();
1447 NewMIs
[1]->eraseFromParent();
1456 // Collect tied operands of MI that need to be handled.
1457 // Rewrite trivial cases immediately.
1458 // Return true if any tied operands where found, including the trivial ones.
1459 bool TwoAddressInstructionPass::
1460 collectTiedOperands(MachineInstr
*MI
, TiedOperandMap
&TiedOperands
) {
1461 const MCInstrDesc
&MCID
= MI
->getDesc();
1462 bool AnyOps
= false;
1463 unsigned NumOps
= MI
->getNumOperands();
1465 for (unsigned SrcIdx
= 0; SrcIdx
< NumOps
; ++SrcIdx
) {
1466 unsigned DstIdx
= 0;
1467 if (!MI
->isRegTiedToDefOperand(SrcIdx
, &DstIdx
))
1470 MachineOperand
&SrcMO
= MI
->getOperand(SrcIdx
);
1471 MachineOperand
&DstMO
= MI
->getOperand(DstIdx
);
1472 unsigned SrcReg
= SrcMO
.getReg();
1473 unsigned DstReg
= DstMO
.getReg();
1474 // Tied constraint already satisfied?
1475 if (SrcReg
== DstReg
)
1478 assert(SrcReg
&& SrcMO
.isUse() && "two address instruction invalid");
1480 // Deal with undef uses immediately - simply rewrite the src operand.
1481 if (SrcMO
.isUndef() && !DstMO
.getSubReg()) {
1482 // Constrain the DstReg register class if required.
1483 if (TargetRegisterInfo::isVirtualRegister(DstReg
))
1484 if (const TargetRegisterClass
*RC
= TII
->getRegClass(MCID
, SrcIdx
,
1486 MRI
->constrainRegClass(DstReg
, RC
);
1487 SrcMO
.setReg(DstReg
);
1489 LLVM_DEBUG(dbgs() << "\t\trewrite undef:\t" << *MI
);
1492 TiedOperands
[SrcReg
].push_back(std::make_pair(SrcIdx
, DstIdx
));
1497 // Process a list of tied MI operands that all use the same source register.
1498 // The tied pairs are of the form (SrcIdx, DstIdx).
1500 TwoAddressInstructionPass::processTiedPairs(MachineInstr
*MI
,
1501 TiedPairList
&TiedPairs
,
1503 bool IsEarlyClobber
= false;
1504 for (unsigned tpi
= 0, tpe
= TiedPairs
.size(); tpi
!= tpe
; ++tpi
) {
1505 const MachineOperand
&DstMO
= MI
->getOperand(TiedPairs
[tpi
].second
);
1506 IsEarlyClobber
|= DstMO
.isEarlyClobber();
1509 bool RemovedKillFlag
= false;
1510 bool AllUsesCopied
= true;
1511 unsigned LastCopiedReg
= 0;
1512 SlotIndex LastCopyIdx
;
1514 unsigned SubRegB
= 0;
1515 for (unsigned tpi
= 0, tpe
= TiedPairs
.size(); tpi
!= tpe
; ++tpi
) {
1516 unsigned SrcIdx
= TiedPairs
[tpi
].first
;
1517 unsigned DstIdx
= TiedPairs
[tpi
].second
;
1519 const MachineOperand
&DstMO
= MI
->getOperand(DstIdx
);
1520 unsigned RegA
= DstMO
.getReg();
1522 // Grab RegB from the instruction because it may have changed if the
1523 // instruction was commuted.
1524 RegB
= MI
->getOperand(SrcIdx
).getReg();
1525 SubRegB
= MI
->getOperand(SrcIdx
).getSubReg();
1528 // The register is tied to multiple destinations (or else we would
1529 // not have continued this far), but this use of the register
1530 // already matches the tied destination. Leave it.
1531 AllUsesCopied
= false;
1534 LastCopiedReg
= RegA
;
1536 assert(TargetRegisterInfo::isVirtualRegister(RegB
) &&
1537 "cannot make instruction into two-address form");
1540 // First, verify that we don't have a use of "a" in the instruction
1541 // (a = b + a for example) because our transformation will not
1542 // work. This should never occur because we are in SSA form.
1543 for (unsigned i
= 0; i
!= MI
->getNumOperands(); ++i
)
1544 assert(i
== DstIdx
||
1545 !MI
->getOperand(i
).isReg() ||
1546 MI
->getOperand(i
).getReg() != RegA
);
1550 MachineInstrBuilder MIB
= BuildMI(*MI
->getParent(), MI
, MI
->getDebugLoc(),
1551 TII
->get(TargetOpcode::COPY
), RegA
);
1552 // If this operand is folding a truncation, the truncation now moves to the
1553 // copy so that the register classes remain valid for the operands.
1554 MIB
.addReg(RegB
, 0, SubRegB
);
1555 const TargetRegisterClass
*RC
= MRI
->getRegClass(RegB
);
1557 if (TargetRegisterInfo::isVirtualRegister(RegA
)) {
1558 assert(TRI
->getMatchingSuperRegClass(RC
, MRI
->getRegClass(RegA
),
1560 "tied subregister must be a truncation");
1561 // The superreg class will not be used to constrain the subreg class.
1565 assert(TRI
->getMatchingSuperReg(RegA
, SubRegB
, MRI
->getRegClass(RegB
))
1566 && "tied subregister must be a truncation");
1570 // Update DistanceMap.
1571 MachineBasicBlock::iterator PrevMI
= MI
;
1573 DistanceMap
.insert(std::make_pair(&*PrevMI
, Dist
));
1574 DistanceMap
[MI
] = ++Dist
;
1577 LastCopyIdx
= LIS
->InsertMachineInstrInMaps(*PrevMI
).getRegSlot();
1579 if (TargetRegisterInfo::isVirtualRegister(RegA
)) {
1580 LiveInterval
&LI
= LIS
->getInterval(RegA
);
1581 VNInfo
*VNI
= LI
.getNextValue(LastCopyIdx
, LIS
->getVNInfoAllocator());
1583 LIS
->getInstructionIndex(*MI
).getRegSlot(IsEarlyClobber
);
1584 LI
.addSegment(LiveInterval::Segment(LastCopyIdx
, endIdx
, VNI
));
1588 LLVM_DEBUG(dbgs() << "\t\tprepend:\t" << *MIB
);
1590 MachineOperand
&MO
= MI
->getOperand(SrcIdx
);
1591 assert(MO
.isReg() && MO
.getReg() == RegB
&& MO
.isUse() &&
1592 "inconsistent operand info for 2-reg pass");
1594 MO
.setIsKill(false);
1595 RemovedKillFlag
= true;
1598 // Make sure regA is a legal regclass for the SrcIdx operand.
1599 if (TargetRegisterInfo::isVirtualRegister(RegA
) &&
1600 TargetRegisterInfo::isVirtualRegister(RegB
))
1601 MRI
->constrainRegClass(RegA
, RC
);
1603 // The getMatchingSuper asserts guarantee that the register class projected
1604 // by SubRegB is compatible with RegA with no subregister. So regardless of
1605 // whether the dest oper writes a subreg, the source oper should not.
1608 // Propagate SrcRegMap.
1609 SrcRegMap
[RegA
] = RegB
;
1612 if (AllUsesCopied
) {
1613 bool ReplacedAllUntiedUses
= true;
1614 if (!IsEarlyClobber
) {
1615 // Replace other (un-tied) uses of regB with LastCopiedReg.
1616 for (MachineOperand
&MO
: MI
->operands()) {
1617 if (MO
.isReg() && MO
.getReg() == RegB
&& MO
.isUse()) {
1618 if (MO
.getSubReg() == SubRegB
) {
1620 MO
.setIsKill(false);
1621 RemovedKillFlag
= true;
1623 MO
.setReg(LastCopiedReg
);
1626 ReplacedAllUntiedUses
= false;
1632 // Update live variables for regB.
1633 if (RemovedKillFlag
&& ReplacedAllUntiedUses
&&
1634 LV
&& LV
->getVarInfo(RegB
).removeKill(*MI
)) {
1635 MachineBasicBlock::iterator PrevMI
= MI
;
1637 LV
->addVirtualRegisterKilled(RegB
, *PrevMI
);
1640 // Update LiveIntervals.
1642 LiveInterval
&LI
= LIS
->getInterval(RegB
);
1643 SlotIndex MIIdx
= LIS
->getInstructionIndex(*MI
);
1644 LiveInterval::const_iterator I
= LI
.find(MIIdx
);
1645 assert(I
!= LI
.end() && "RegB must be live-in to use.");
1647 SlotIndex UseIdx
= MIIdx
.getRegSlot(IsEarlyClobber
);
1648 if (I
->end
== UseIdx
)
1649 LI
.removeSegment(LastCopyIdx
, UseIdx
);
1651 } else if (RemovedKillFlag
) {
1652 // Some tied uses of regB matched their destination registers, so
1653 // regB is still used in this instruction, but a kill flag was
1654 // removed from a different tied use of regB, so now we need to add
1655 // a kill flag to one of the remaining uses of regB.
1656 for (MachineOperand
&MO
: MI
->operands()) {
1657 if (MO
.isReg() && MO
.getReg() == RegB
&& MO
.isUse()) {
1665 /// Reduce two-address instructions to two operands.
1666 bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction
&Func
) {
1668 const TargetMachine
&TM
= MF
->getTarget();
1669 MRI
= &MF
->getRegInfo();
1670 TII
= MF
->getSubtarget().getInstrInfo();
1671 TRI
= MF
->getSubtarget().getRegisterInfo();
1672 InstrItins
= MF
->getSubtarget().getInstrItineraryData();
1673 LV
= getAnalysisIfAvailable
<LiveVariables
>();
1674 LIS
= getAnalysisIfAvailable
<LiveIntervals
>();
1675 if (auto *AAPass
= getAnalysisIfAvailable
<AAResultsWrapperPass
>())
1676 AA
= &AAPass
->getAAResults();
1679 OptLevel
= TM
.getOptLevel();
1680 // Disable optimizations if requested. We cannot skip the whole pass as some
1681 // fixups are necessary for correctness.
1682 if (skipFunction(Func
.getFunction()))
1683 OptLevel
= CodeGenOpt::None
;
1685 bool MadeChange
= false;
1687 LLVM_DEBUG(dbgs() << "********** REWRITING TWO-ADDR INSTRS **********\n");
1688 LLVM_DEBUG(dbgs() << "********** Function: " << MF
->getName() << '\n');
1690 // This pass takes the function out of SSA form.
1693 TiedOperandMap TiedOperands
;
1694 for (MachineFunction::iterator MBBI
= MF
->begin(), MBBE
= MF
->end();
1695 MBBI
!= MBBE
; ++MBBI
) {
1698 DistanceMap
.clear();
1703 for (MachineBasicBlock::iterator mi
= MBB
->begin(), me
= MBB
->end();
1705 MachineBasicBlock::iterator nmi
= std::next(mi
);
1706 // Don't revisit an instruction previously converted by target. It may
1707 // contain undef register operands (%noreg), which are not handled.
1708 if (mi
->isDebugInstr() || SunkInstrs
.count(&*mi
)) {
1713 // Expand REG_SEQUENCE instructions. This will position mi at the first
1714 // expanded instruction.
1715 if (mi
->isRegSequence())
1716 eliminateRegSequence(mi
);
1718 DistanceMap
.insert(std::make_pair(&*mi
, ++Dist
));
1722 // First scan through all the tied register uses in this instruction
1723 // and record a list of pairs of tied operands for each register.
1724 if (!collectTiedOperands(&*mi
, TiedOperands
)) {
1729 ++NumTwoAddressInstrs
;
1731 LLVM_DEBUG(dbgs() << '\t' << *mi
);
1733 // If the instruction has a single pair of tied operands, try some
1734 // transformations that may either eliminate the tied operands or
1735 // improve the opportunities for coalescing away the register copy.
1736 if (TiedOperands
.size() == 1) {
1737 SmallVectorImpl
<std::pair
<unsigned, unsigned>> &TiedPairs
1738 = TiedOperands
.begin()->second
;
1739 if (TiedPairs
.size() == 1) {
1740 unsigned SrcIdx
= TiedPairs
[0].first
;
1741 unsigned DstIdx
= TiedPairs
[0].second
;
1742 unsigned SrcReg
= mi
->getOperand(SrcIdx
).getReg();
1743 unsigned DstReg
= mi
->getOperand(DstIdx
).getReg();
1744 if (SrcReg
!= DstReg
&&
1745 tryInstructionTransform(mi
, nmi
, SrcIdx
, DstIdx
, Dist
, false)) {
1746 // The tied operands have been eliminated or shifted further down
1747 // the block to ease elimination. Continue processing with 'nmi'.
1748 TiedOperands
.clear();
1755 // Now iterate over the information collected above.
1756 for (auto &TO
: TiedOperands
) {
1757 processTiedPairs(&*mi
, TO
.second
, Dist
);
1758 LLVM_DEBUG(dbgs() << "\t\trewrite to:\t" << *mi
);
1761 // Rewrite INSERT_SUBREG as COPY now that we no longer need SSA form.
1762 if (mi
->isInsertSubreg()) {
1763 // From %reg = INSERT_SUBREG %reg, %subreg, subidx
1764 // To %reg:subidx = COPY %subreg
1765 unsigned SubIdx
= mi
->getOperand(3).getImm();
1766 mi
->RemoveOperand(3);
1767 assert(mi
->getOperand(0).getSubReg() == 0 && "Unexpected subreg idx");
1768 mi
->getOperand(0).setSubReg(SubIdx
);
1769 mi
->getOperand(0).setIsUndef(mi
->getOperand(1).isUndef());
1770 mi
->RemoveOperand(1);
1771 mi
->setDesc(TII
->get(TargetOpcode::COPY
));
1772 LLVM_DEBUG(dbgs() << "\t\tconvert to:\t" << *mi
);
1775 // Clear TiedOperands here instead of at the top of the loop
1776 // since most instructions do not have tied operands.
1777 TiedOperands
.clear();
1783 MF
->verify(this, "After two-address instruction pass");
1788 /// Eliminate a REG_SEQUENCE instruction as part of the de-ssa process.
1790 /// The instruction is turned into a sequence of sub-register copies:
1792 /// %dst = REG_SEQUENCE %v1, ssub0, %v2, ssub1
1796 /// undef %dst:ssub0 = COPY %v1
1797 /// %dst:ssub1 = COPY %v2
1798 void TwoAddressInstructionPass::
1799 eliminateRegSequence(MachineBasicBlock::iterator
&MBBI
) {
1800 MachineInstr
&MI
= *MBBI
;
1801 unsigned DstReg
= MI
.getOperand(0).getReg();
1802 if (MI
.getOperand(0).getSubReg() ||
1803 TargetRegisterInfo::isPhysicalRegister(DstReg
) ||
1804 !(MI
.getNumOperands() & 1)) {
1805 LLVM_DEBUG(dbgs() << "Illegal REG_SEQUENCE instruction:" << MI
);
1806 llvm_unreachable(nullptr);
1809 SmallVector
<unsigned, 4> OrigRegs
;
1811 OrigRegs
.push_back(MI
.getOperand(0).getReg());
1812 for (unsigned i
= 1, e
= MI
.getNumOperands(); i
< e
; i
+= 2)
1813 OrigRegs
.push_back(MI
.getOperand(i
).getReg());
1816 bool DefEmitted
= false;
1817 for (unsigned i
= 1, e
= MI
.getNumOperands(); i
< e
; i
+= 2) {
1818 MachineOperand
&UseMO
= MI
.getOperand(i
);
1819 unsigned SrcReg
= UseMO
.getReg();
1820 unsigned SubIdx
= MI
.getOperand(i
+1).getImm();
1821 // Nothing needs to be inserted for undef operands.
1822 if (UseMO
.isUndef())
1825 // Defer any kill flag to the last operand using SrcReg. Otherwise, we
1826 // might insert a COPY that uses SrcReg after is was killed.
1827 bool isKill
= UseMO
.isKill();
1829 for (unsigned j
= i
+ 2; j
< e
; j
+= 2)
1830 if (MI
.getOperand(j
).getReg() == SrcReg
) {
1831 MI
.getOperand(j
).setIsKill();
1832 UseMO
.setIsKill(false);
1837 // Insert the sub-register copy.
1838 MachineInstr
*CopyMI
= BuildMI(*MI
.getParent(), MI
, MI
.getDebugLoc(),
1839 TII
->get(TargetOpcode::COPY
))
1840 .addReg(DstReg
, RegState::Define
, SubIdx
)
1843 // The first def needs an undef flag because there is no live register
1846 CopyMI
->getOperand(0).setIsUndef(true);
1847 // Return an iterator pointing to the first inserted instr.
1852 // Update LiveVariables' kill info.
1853 if (LV
&& isKill
&& !TargetRegisterInfo::isPhysicalRegister(SrcReg
))
1854 LV
->replaceKillInstruction(SrcReg
, MI
, *CopyMI
);
1856 LLVM_DEBUG(dbgs() << "Inserted: " << *CopyMI
);
1859 MachineBasicBlock::iterator EndMBBI
=
1860 std::next(MachineBasicBlock::iterator(MI
));
1863 LLVM_DEBUG(dbgs() << "Turned: " << MI
<< " into an IMPLICIT_DEF");
1864 MI
.setDesc(TII
->get(TargetOpcode::IMPLICIT_DEF
));
1865 for (int j
= MI
.getNumOperands() - 1, ee
= 0; j
> ee
; --j
)
1866 MI
.RemoveOperand(j
);
1868 LLVM_DEBUG(dbgs() << "Eliminated: " << MI
);
1869 MI
.eraseFromParent();
1872 // Udpate LiveIntervals.
1874 LIS
->repairIntervalsInRange(MBB
, MBBI
, EndMBBI
, OrigRegs
);