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 Register 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 Register 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
= Register::isPhysicalRegister(SrcReg
);
422 IsDstPhys
= Register::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
&& Register::isVirtualRegister(Reg
) && !LIS
->isNotInMIMap(*MI
)) {
431 // FIXME: Sometimes tryInstructionTransform() will add instructions and
432 // test whether they can be folded before keeping them. In this case it
433 // sets a kill before recursively calling tryInstructionTransform() again.
434 // If there is no interval available, we assume that this instruction is
435 // one of those. A kill flag is manually inserted on the operand so the
436 // check below will handle it.
437 LiveInterval
&LI
= LIS
->getInterval(Reg
);
438 // This is to match the kill flag version where undefs don't have kill
440 if (!LI
.hasAtLeastOneValue())
443 SlotIndex useIdx
= LIS
->getInstructionIndex(*MI
);
444 LiveInterval::const_iterator I
= LI
.find(useIdx
);
445 assert(I
!= LI
.end() && "Reg must be live-in to use.");
446 return !I
->end
.isBlock() && SlotIndex::isSameInstr(I
->end
, useIdx
);
449 return MI
->killsRegister(Reg
);
452 /// Test if the given register value, which is used by the given
453 /// instruction, is killed by the given instruction. This looks through
454 /// coalescable copies to see if the original value is potentially not killed.
456 /// For example, in this code:
458 /// %reg1034 = copy %reg1024
459 /// %reg1035 = copy killed %reg1025
460 /// %reg1036 = add killed %reg1034, killed %reg1035
462 /// %reg1034 is not considered to be killed, since it is copied from a
463 /// register which is not killed. Treating it as not killed lets the
464 /// normal heuristics commute the (two-address) add, which lets
465 /// coalescing eliminate the extra copy.
467 /// If allowFalsePositives is true then likely kills are treated as kills even
468 /// if it can't be proven that they are kills.
469 static bool isKilled(MachineInstr
&MI
, unsigned Reg
,
470 const MachineRegisterInfo
*MRI
,
471 const TargetInstrInfo
*TII
,
473 bool allowFalsePositives
) {
474 MachineInstr
*DefMI
= &MI
;
476 // All uses of physical registers are likely to be kills.
477 if (Register::isPhysicalRegister(Reg
) &&
478 (allowFalsePositives
|| MRI
->hasOneUse(Reg
)))
480 if (!isPlainlyKilled(DefMI
, Reg
, LIS
))
482 if (Register::isPhysicalRegister(Reg
))
484 MachineRegisterInfo::def_iterator Begin
= MRI
->def_begin(Reg
);
485 // If there are multiple defs, we can't do a simple analysis, so just
486 // go with what the kill flag says.
487 if (std::next(Begin
) != MRI
->def_end())
489 DefMI
= Begin
->getParent();
490 bool IsSrcPhys
, IsDstPhys
;
491 unsigned SrcReg
, DstReg
;
492 // If the def is something other than a copy, then it isn't going to
493 // be coalesced, so follow the kill flag.
494 if (!isCopyToReg(*DefMI
, TII
, SrcReg
, DstReg
, IsSrcPhys
, IsDstPhys
))
500 /// Return true if the specified MI uses the specified register as a two-address
501 /// use. If so, return the destination register by reference.
502 static bool isTwoAddrUse(MachineInstr
&MI
, unsigned Reg
, unsigned &DstReg
) {
503 for (unsigned i
= 0, NumOps
= MI
.getNumOperands(); i
!= NumOps
; ++i
) {
504 const MachineOperand
&MO
= MI
.getOperand(i
);
505 if (!MO
.isReg() || !MO
.isUse() || MO
.getReg() != Reg
)
508 if (MI
.isRegTiedToDefOperand(i
, &ti
)) {
509 DstReg
= MI
.getOperand(ti
).getReg();
516 /// Given a register, if has a single in-basic block use, return the use
517 /// instruction if it's a copy or a two-address use.
519 MachineInstr
*findOnlyInterestingUse(unsigned Reg
, MachineBasicBlock
*MBB
,
520 MachineRegisterInfo
*MRI
,
521 const TargetInstrInfo
*TII
,
523 unsigned &DstReg
, bool &IsDstPhys
) {
524 if (!MRI
->hasOneNonDBGUse(Reg
))
525 // None or more than one use.
527 MachineInstr
&UseMI
= *MRI
->use_instr_nodbg_begin(Reg
);
528 if (UseMI
.getParent() != MBB
)
532 if (isCopyToReg(UseMI
, TII
, SrcReg
, DstReg
, IsSrcPhys
, IsDstPhys
)) {
537 if (isTwoAddrUse(UseMI
, Reg
, DstReg
)) {
538 IsDstPhys
= Register::isPhysicalRegister(DstReg
);
544 /// Return the physical register the specified virtual register might be mapped
547 getMappedReg(unsigned Reg
, DenseMap
<unsigned, unsigned> &RegMap
) {
548 while (Register::isVirtualRegister(Reg
)) {
549 DenseMap
<unsigned, unsigned>::iterator SI
= RegMap
.find(Reg
);
550 if (SI
== RegMap
.end())
554 if (Register::isPhysicalRegister(Reg
))
559 /// Return true if the two registers are equal or aliased.
561 regsAreCompatible(unsigned RegA
, unsigned RegB
, const TargetRegisterInfo
*TRI
) {
566 return TRI
->regsOverlap(RegA
, RegB
);
569 // Returns true if Reg is equal or aliased to at least one register in Set.
570 static bool regOverlapsSet(const SmallVectorImpl
<unsigned> &Set
, unsigned Reg
,
571 const TargetRegisterInfo
*TRI
) {
572 for (unsigned R
: Set
)
573 if (TRI
->regsOverlap(R
, Reg
))
579 /// Return true if it's potentially profitable to commute the two-address
580 /// instruction that's being processed.
582 TwoAddressInstructionPass::
583 isProfitableToCommute(unsigned regA
, unsigned regB
, unsigned regC
,
584 MachineInstr
*MI
, unsigned Dist
) {
585 if (OptLevel
== CodeGenOpt::None
)
588 // Determine if it's profitable to commute this two address instruction. In
589 // general, we want no uses between this instruction and the definition of
590 // the two-address register.
592 // %reg1028 = EXTRACT_SUBREG killed %reg1027, 1
593 // %reg1029 = COPY %reg1028
594 // %reg1029 = SHR8ri %reg1029, 7, implicit dead %eflags
595 // insert => %reg1030 = COPY %reg1028
596 // %reg1030 = ADD8rr killed %reg1028, killed %reg1029, implicit dead %eflags
597 // In this case, it might not be possible to coalesce the second COPY
598 // instruction if the first one is coalesced. So it would be profitable to
600 // %reg1028 = EXTRACT_SUBREG killed %reg1027, 1
601 // %reg1029 = COPY %reg1028
602 // %reg1029 = SHR8ri %reg1029, 7, implicit dead %eflags
603 // insert => %reg1030 = COPY %reg1029
604 // %reg1030 = ADD8rr killed %reg1029, killed %reg1028, implicit dead %eflags
606 if (!isPlainlyKilled(MI
, regC
, LIS
))
609 // Ok, we have something like:
610 // %reg1030 = ADD8rr killed %reg1028, killed %reg1029, implicit dead %eflags
611 // let's see if it's worth commuting it.
613 // Look for situations like this:
616 // %reg1026 = ADD %reg1024, %reg1025
618 // Commute the ADD to hopefully eliminate an otherwise unavoidable copy.
619 unsigned ToRegA
= getMappedReg(regA
, DstRegMap
);
621 unsigned FromRegB
= getMappedReg(regB
, SrcRegMap
);
622 unsigned FromRegC
= getMappedReg(regC
, SrcRegMap
);
623 bool CompB
= FromRegB
&& regsAreCompatible(FromRegB
, ToRegA
, TRI
);
624 bool CompC
= FromRegC
&& regsAreCompatible(FromRegC
, ToRegA
, TRI
);
626 // Compute if any of the following are true:
627 // -RegB is not tied to a register and RegC is compatible with RegA.
628 // -RegB is tied to the wrong physical register, but RegC is.
629 // -RegB is tied to the wrong physical register, and RegC isn't tied.
630 if ((!FromRegB
&& CompC
) || (FromRegB
&& !CompB
&& (!FromRegC
|| CompC
)))
632 // Don't compute if any of the following are true:
633 // -RegC is not tied to a register and RegB is compatible with RegA.
634 // -RegC is tied to the wrong physical register, but RegB is.
635 // -RegC is tied to the wrong physical register, and RegB isn't tied.
636 if ((!FromRegC
&& CompB
) || (FromRegC
&& !CompC
&& (!FromRegB
|| CompB
)))
640 // If there is a use of regC between its last def (could be livein) and this
641 // instruction, then bail.
642 unsigned LastDefC
= 0;
643 if (!noUseAfterLastDef(regC
, Dist
, LastDefC
))
646 // If there is a use of regB between its last def (could be livein) and this
647 // instruction, then go ahead and make this transformation.
648 unsigned LastDefB
= 0;
649 if (!noUseAfterLastDef(regB
, Dist
, LastDefB
))
652 // Look for situation like this:
653 // %reg101 = MOV %reg100
655 // %reg103 = ADD %reg102, %reg101
657 // %reg100 = MOV %reg103
658 // If there is a reversed copy chain from reg101 to reg103, commute the ADD
659 // to eliminate an otherwise unavoidable copy.
661 // We can extend the logic further: If an pair of operands in an insn has
662 // been merged, the insn could be regarded as a virtual copy, and the virtual
663 // copy could also be used to construct a copy chain.
664 // To more generally minimize register copies, ideally the logic of two addr
665 // instruction pass should be integrated with register allocation pass where
666 // interference graph is available.
667 if (isRevCopyChain(regC
, regA
, MaxDataFlowEdge
))
670 if (isRevCopyChain(regB
, regA
, MaxDataFlowEdge
))
673 // Since there are no intervening uses for both registers, then commute
674 // if the def of regC is closer. Its live interval is shorter.
675 return LastDefB
&& LastDefC
&& LastDefC
> LastDefB
;
678 /// Commute a two-address instruction and update the basic block, distance map,
679 /// and live variables if needed. Return true if it is successful.
680 bool TwoAddressInstructionPass::commuteInstruction(MachineInstr
*MI
,
685 Register RegC
= MI
->getOperand(RegCIdx
).getReg();
686 LLVM_DEBUG(dbgs() << "2addr: COMMUTING : " << *MI
);
687 MachineInstr
*NewMI
= TII
->commuteInstruction(*MI
, false, RegBIdx
, RegCIdx
);
689 if (NewMI
== nullptr) {
690 LLVM_DEBUG(dbgs() << "2addr: COMMUTING FAILED!\n");
694 LLVM_DEBUG(dbgs() << "2addr: COMMUTED TO: " << *NewMI
);
695 assert(NewMI
== MI
&&
696 "TargetInstrInfo::commuteInstruction() should not return a new "
697 "instruction unless it was requested.");
699 // Update source register map.
700 unsigned FromRegC
= getMappedReg(RegC
, SrcRegMap
);
702 Register RegA
= MI
->getOperand(DstIdx
).getReg();
703 SrcRegMap
[RegA
] = FromRegC
;
709 /// Return true if it is profitable to convert the given 2-address instruction
710 /// to a 3-address one.
712 TwoAddressInstructionPass::isProfitableToConv3Addr(unsigned RegA
,unsigned RegB
){
713 // Look for situations like this:
716 // %reg1026 = ADD %reg1024, %reg1025
718 // Turn ADD into a 3-address instruction to avoid a copy.
719 unsigned FromRegB
= getMappedReg(RegB
, SrcRegMap
);
722 unsigned ToRegA
= getMappedReg(RegA
, DstRegMap
);
723 return (ToRegA
&& !regsAreCompatible(FromRegB
, ToRegA
, TRI
));
726 /// Convert the specified two-address instruction into a three address one.
727 /// Return true if this transformation was successful.
729 TwoAddressInstructionPass::convertInstTo3Addr(MachineBasicBlock::iterator
&mi
,
730 MachineBasicBlock::iterator
&nmi
,
731 unsigned RegA
, unsigned RegB
,
733 // FIXME: Why does convertToThreeAddress() need an iterator reference?
734 MachineFunction::iterator MFI
= MBB
->getIterator();
735 MachineInstr
*NewMI
= TII
->convertToThreeAddress(MFI
, *mi
, LV
);
736 assert(MBB
->getIterator() == MFI
&&
737 "convertToThreeAddress changed iterator reference");
741 LLVM_DEBUG(dbgs() << "2addr: CONVERTING 2-ADDR: " << *mi
);
742 LLVM_DEBUG(dbgs() << "2addr: TO 3-ADDR: " << *NewMI
);
746 LIS
->ReplaceMachineInstrInMaps(*mi
, *NewMI
);
748 if (NewMI
->findRegisterUseOperand(RegB
, false, TRI
))
749 // FIXME: Temporary workaround. If the new instruction doesn't
750 // uses RegB, convertToThreeAddress must have created more
751 // then one instruction.
752 Sunk
= sink3AddrInstruction(NewMI
, RegB
, mi
);
754 MBB
->erase(mi
); // Nuke the old inst.
757 DistanceMap
.insert(std::make_pair(NewMI
, Dist
));
762 SunkInstrs
.insert(NewMI
);
764 // Update source and destination register maps.
765 SrcRegMap
.erase(RegA
);
766 DstRegMap
.erase(RegB
);
770 /// Scan forward recursively for only uses, update maps if the use is a copy or
771 /// a two-address instruction.
773 TwoAddressInstructionPass::scanUses(unsigned DstReg
) {
774 SmallVector
<unsigned, 4> VirtRegPairs
;
778 unsigned Reg
= DstReg
;
779 while (MachineInstr
*UseMI
= findOnlyInterestingUse(Reg
, MBB
, MRI
, TII
,IsCopy
,
780 NewReg
, IsDstPhys
)) {
781 if (IsCopy
&& !Processed
.insert(UseMI
).second
)
784 DenseMap
<MachineInstr
*, unsigned>::iterator DI
= DistanceMap
.find(UseMI
);
785 if (DI
!= DistanceMap
.end())
786 // Earlier in the same MBB.Reached via a back edge.
790 VirtRegPairs
.push_back(NewReg
);
793 bool isNew
= SrcRegMap
.insert(std::make_pair(NewReg
, Reg
)).second
;
795 assert(SrcRegMap
[NewReg
] == Reg
&& "Can't map to two src registers!");
796 VirtRegPairs
.push_back(NewReg
);
800 if (!VirtRegPairs
.empty()) {
801 unsigned ToReg
= VirtRegPairs
.back();
802 VirtRegPairs
.pop_back();
803 while (!VirtRegPairs
.empty()) {
804 unsigned FromReg
= VirtRegPairs
.back();
805 VirtRegPairs
.pop_back();
806 bool isNew
= DstRegMap
.insert(std::make_pair(FromReg
, ToReg
)).second
;
808 assert(DstRegMap
[FromReg
] == ToReg
&&"Can't map to two dst registers!");
811 bool isNew
= DstRegMap
.insert(std::make_pair(DstReg
, ToReg
)).second
;
813 assert(DstRegMap
[DstReg
] == ToReg
&& "Can't map to two dst registers!");
817 /// If the specified instruction is not yet processed, process it if it's a
818 /// copy. For a copy instruction, we find the physical registers the
819 /// source and destination registers might be mapped to. These are kept in
820 /// point-to maps used to determine future optimizations. e.g.
823 /// v1026 = add v1024, v1025
825 /// If 'add' is a two-address instruction, v1024, v1026 are both potentially
826 /// coalesced to r0 (from the input side). v1025 is mapped to r1. v1026 is
827 /// potentially joined with r1 on the output side. It's worthwhile to commute
828 /// 'add' to eliminate a copy.
829 void TwoAddressInstructionPass::processCopy(MachineInstr
*MI
) {
830 if (Processed
.count(MI
))
833 bool IsSrcPhys
, IsDstPhys
;
834 unsigned SrcReg
, DstReg
;
835 if (!isCopyToReg(*MI
, TII
, SrcReg
, DstReg
, IsSrcPhys
, IsDstPhys
))
838 if (IsDstPhys
&& !IsSrcPhys
)
839 DstRegMap
.insert(std::make_pair(SrcReg
, DstReg
));
840 else if (!IsDstPhys
&& IsSrcPhys
) {
841 bool isNew
= SrcRegMap
.insert(std::make_pair(DstReg
, SrcReg
)).second
;
843 assert(SrcRegMap
[DstReg
] == SrcReg
&&
844 "Can't map to two src physical registers!");
849 Processed
.insert(MI
);
852 /// If there is one more local instruction that reads 'Reg' and it kills 'Reg,
853 /// consider moving the instruction below the kill instruction in order to
854 /// eliminate the need for the copy.
855 bool TwoAddressInstructionPass::
856 rescheduleMIBelowKill(MachineBasicBlock::iterator
&mi
,
857 MachineBasicBlock::iterator
&nmi
,
859 // Bail immediately if we don't have LV or LIS available. We use them to find
860 // kills efficiently.
864 MachineInstr
*MI
= &*mi
;
865 DenseMap
<MachineInstr
*, unsigned>::iterator DI
= DistanceMap
.find(MI
);
866 if (DI
== DistanceMap
.end())
867 // Must be created from unfolded load. Don't waste time trying this.
870 MachineInstr
*KillMI
= nullptr;
872 LiveInterval
&LI
= LIS
->getInterval(Reg
);
873 assert(LI
.end() != LI
.begin() &&
874 "Reg should not have empty live interval.");
876 SlotIndex MBBEndIdx
= LIS
->getMBBEndIdx(MBB
).getPrevSlot();
877 LiveInterval::const_iterator I
= LI
.find(MBBEndIdx
);
878 if (I
!= LI
.end() && I
->start
< MBBEndIdx
)
882 KillMI
= LIS
->getInstructionFromIndex(I
->end
);
884 KillMI
= LV
->getVarInfo(Reg
).findKill(MBB
);
886 if (!KillMI
|| MI
== KillMI
|| KillMI
->isCopy() || KillMI
->isCopyLike())
887 // Don't mess with copies, they may be coalesced later.
890 if (KillMI
->hasUnmodeledSideEffects() || KillMI
->isCall() ||
891 KillMI
->isBranch() || KillMI
->isTerminator())
892 // Don't move pass calls, etc.
896 if (isTwoAddrUse(*KillMI
, Reg
, DstReg
))
899 bool SeenStore
= true;
900 if (!MI
->isSafeToMove(AA
, SeenStore
))
903 if (TII
->getInstrLatency(InstrItins
, *MI
) > 1)
904 // FIXME: Needs more sophisticated heuristics.
907 SmallVector
<unsigned, 2> Uses
;
908 SmallVector
<unsigned, 2> Kills
;
909 SmallVector
<unsigned, 2> Defs
;
910 for (const MachineOperand
&MO
: MI
->operands()) {
913 Register MOReg
= MO
.getReg();
917 Defs
.push_back(MOReg
);
919 Uses
.push_back(MOReg
);
920 if (MOReg
!= Reg
&& (MO
.isKill() ||
921 (LIS
&& isPlainlyKilled(MI
, MOReg
, LIS
))))
922 Kills
.push_back(MOReg
);
926 // Move the copies connected to MI down as well.
927 MachineBasicBlock::iterator Begin
= MI
;
928 MachineBasicBlock::iterator AfterMI
= std::next(Begin
);
929 MachineBasicBlock::iterator End
= AfterMI
;
930 while (End
!= MBB
->end()) {
931 End
= skipDebugInstructionsForward(End
, MBB
->end());
932 if (End
->isCopy() && regOverlapsSet(Defs
, End
->getOperand(1).getReg(), TRI
))
933 Defs
.push_back(End
->getOperand(0).getReg());
939 // Check if the reschedule will not break dependencies.
940 unsigned NumVisited
= 0;
941 MachineBasicBlock::iterator KillPos
= KillMI
;
943 for (MachineInstr
&OtherMI
: make_range(End
, KillPos
)) {
944 // Debug instructions cannot be counted against the limit.
945 if (OtherMI
.isDebugInstr())
947 if (NumVisited
> 10) // FIXME: Arbitrary limit to reduce compile time cost.
950 if (OtherMI
.hasUnmodeledSideEffects() || OtherMI
.isCall() ||
951 OtherMI
.isBranch() || OtherMI
.isTerminator())
952 // Don't move pass calls, etc.
954 for (const MachineOperand
&MO
: OtherMI
.operands()) {
957 Register MOReg
= MO
.getReg();
961 if (regOverlapsSet(Uses
, MOReg
, TRI
))
962 // Physical register use would be clobbered.
964 if (!MO
.isDead() && regOverlapsSet(Defs
, MOReg
, TRI
))
965 // May clobber a physical register def.
966 // FIXME: This may be too conservative. It's ok if the instruction
967 // is sunken completely below the use.
970 if (regOverlapsSet(Defs
, MOReg
, TRI
))
973 MO
.isKill() || (LIS
&& isPlainlyKilled(&OtherMI
, MOReg
, LIS
));
974 if (MOReg
!= Reg
&& ((isKill
&& regOverlapsSet(Uses
, MOReg
, TRI
)) ||
975 regOverlapsSet(Kills
, MOReg
, TRI
)))
976 // Don't want to extend other live ranges and update kills.
978 if (MOReg
== Reg
&& !isKill
)
979 // We can't schedule across a use of the register in question.
981 // Ensure that if this is register in question, its the kill we expect.
982 assert((MOReg
!= Reg
|| &OtherMI
== KillMI
) &&
983 "Found multiple kills of a register in a basic block");
988 // Move debug info as well.
989 while (Begin
!= MBB
->begin() && std::prev(Begin
)->isDebugInstr())
993 MachineBasicBlock::iterator InsertPos
= KillPos
;
995 // We have to move the copies first so that the MBB is still well-formed
996 // when calling handleMove().
997 for (MachineBasicBlock::iterator MBBI
= AfterMI
; MBBI
!= End
;) {
998 auto CopyMI
= MBBI
++;
999 MBB
->splice(InsertPos
, MBB
, CopyMI
);
1000 LIS
->handleMove(*CopyMI
);
1003 End
= std::next(MachineBasicBlock::iterator(MI
));
1006 // Copies following MI may have been moved as well.
1007 MBB
->splice(InsertPos
, MBB
, Begin
, End
);
1008 DistanceMap
.erase(DI
);
1010 // Update live variables
1012 LIS
->handleMove(*MI
);
1014 LV
->removeVirtualRegisterKilled(Reg
, *KillMI
);
1015 LV
->addVirtualRegisterKilled(Reg
, *MI
);
1018 LLVM_DEBUG(dbgs() << "\trescheduled below kill: " << *KillMI
);
1022 /// Return true if the re-scheduling will put the given instruction too close
1023 /// to the defs of its register dependencies.
1024 bool TwoAddressInstructionPass::isDefTooClose(unsigned Reg
, unsigned Dist
,
1026 for (MachineInstr
&DefMI
: MRI
->def_instructions(Reg
)) {
1027 if (DefMI
.getParent() != MBB
|| DefMI
.isCopy() || DefMI
.isCopyLike())
1030 return true; // MI is defining something KillMI uses
1031 DenseMap
<MachineInstr
*, unsigned>::iterator DDI
= DistanceMap
.find(&DefMI
);
1032 if (DDI
== DistanceMap
.end())
1033 return true; // Below MI
1034 unsigned DefDist
= DDI
->second
;
1035 assert(Dist
> DefDist
&& "Visited def already?");
1036 if (TII
->getInstrLatency(InstrItins
, DefMI
) > (Dist
- DefDist
))
1042 /// If there is one more local instruction that reads 'Reg' and it kills 'Reg,
1043 /// consider moving the kill instruction above the current two-address
1044 /// instruction in order to eliminate the need for the copy.
1045 bool TwoAddressInstructionPass::
1046 rescheduleKillAboveMI(MachineBasicBlock::iterator
&mi
,
1047 MachineBasicBlock::iterator
&nmi
,
1049 // Bail immediately if we don't have LV or LIS available. We use them to find
1050 // kills efficiently.
1054 MachineInstr
*MI
= &*mi
;
1055 DenseMap
<MachineInstr
*, unsigned>::iterator DI
= DistanceMap
.find(MI
);
1056 if (DI
== DistanceMap
.end())
1057 // Must be created from unfolded load. Don't waste time trying this.
1060 MachineInstr
*KillMI
= nullptr;
1062 LiveInterval
&LI
= LIS
->getInterval(Reg
);
1063 assert(LI
.end() != LI
.begin() &&
1064 "Reg should not have empty live interval.");
1066 SlotIndex MBBEndIdx
= LIS
->getMBBEndIdx(MBB
).getPrevSlot();
1067 LiveInterval::const_iterator I
= LI
.find(MBBEndIdx
);
1068 if (I
!= LI
.end() && I
->start
< MBBEndIdx
)
1072 KillMI
= LIS
->getInstructionFromIndex(I
->end
);
1074 KillMI
= LV
->getVarInfo(Reg
).findKill(MBB
);
1076 if (!KillMI
|| MI
== KillMI
|| KillMI
->isCopy() || KillMI
->isCopyLike())
1077 // Don't mess with copies, they may be coalesced later.
1081 if (isTwoAddrUse(*KillMI
, Reg
, DstReg
))
1084 bool SeenStore
= true;
1085 if (!KillMI
->isSafeToMove(AA
, SeenStore
))
1088 SmallSet
<unsigned, 2> Uses
;
1089 SmallSet
<unsigned, 2> Kills
;
1090 SmallSet
<unsigned, 2> Defs
;
1091 SmallSet
<unsigned, 2> LiveDefs
;
1092 for (const MachineOperand
&MO
: KillMI
->operands()) {
1095 Register MOReg
= MO
.getReg();
1099 if (isDefTooClose(MOReg
, DI
->second
, MI
))
1101 bool isKill
= MO
.isKill() || (LIS
&& isPlainlyKilled(KillMI
, MOReg
, LIS
));
1102 if (MOReg
== Reg
&& !isKill
)
1105 if (isKill
&& MOReg
!= Reg
)
1106 Kills
.insert(MOReg
);
1107 } else if (Register::isPhysicalRegister(MOReg
)) {
1110 LiveDefs
.insert(MOReg
);
1114 // Check if the reschedule will not break depedencies.
1115 unsigned NumVisited
= 0;
1116 for (MachineInstr
&OtherMI
:
1117 make_range(mi
, MachineBasicBlock::iterator(KillMI
))) {
1118 // Debug instructions cannot be counted against the limit.
1119 if (OtherMI
.isDebugInstr())
1121 if (NumVisited
> 10) // FIXME: Arbitrary limit to reduce compile time cost.
1124 if (OtherMI
.hasUnmodeledSideEffects() || OtherMI
.isCall() ||
1125 OtherMI
.isBranch() || OtherMI
.isTerminator())
1126 // Don't move pass calls, etc.
1128 SmallVector
<unsigned, 2> OtherDefs
;
1129 for (const MachineOperand
&MO
: OtherMI
.operands()) {
1132 Register MOReg
= MO
.getReg();
1136 if (Defs
.count(MOReg
))
1137 // Moving KillMI can clobber the physical register if the def has
1140 if (Kills
.count(MOReg
))
1141 // Don't want to extend other live ranges and update kills.
1143 if (&OtherMI
!= MI
&& MOReg
== Reg
&&
1144 !(MO
.isKill() || (LIS
&& isPlainlyKilled(&OtherMI
, MOReg
, LIS
))))
1145 // We can't schedule across a use of the register in question.
1148 OtherDefs
.push_back(MOReg
);
1152 for (unsigned i
= 0, e
= OtherDefs
.size(); i
!= e
; ++i
) {
1153 unsigned MOReg
= OtherDefs
[i
];
1154 if (Uses
.count(MOReg
))
1156 if (Register::isPhysicalRegister(MOReg
) && LiveDefs
.count(MOReg
))
1158 // Physical register def is seen.
1163 // Move the old kill above MI, don't forget to move debug info as well.
1164 MachineBasicBlock::iterator InsertPos
= mi
;
1165 while (InsertPos
!= MBB
->begin() && std::prev(InsertPos
)->isDebugInstr())
1167 MachineBasicBlock::iterator From
= KillMI
;
1168 MachineBasicBlock::iterator To
= std::next(From
);
1169 while (std::prev(From
)->isDebugInstr())
1171 MBB
->splice(InsertPos
, MBB
, From
, To
);
1173 nmi
= std::prev(InsertPos
); // Backtrack so we process the moved instr.
1174 DistanceMap
.erase(DI
);
1176 // Update live variables
1178 LIS
->handleMove(*KillMI
);
1180 LV
->removeVirtualRegisterKilled(Reg
, *KillMI
);
1181 LV
->addVirtualRegisterKilled(Reg
, *MI
);
1184 LLVM_DEBUG(dbgs() << "\trescheduled kill: " << *KillMI
);
1188 /// Tries to commute the operand 'BaseOpIdx' and some other operand in the
1189 /// given machine instruction to improve opportunities for coalescing and
1190 /// elimination of a register to register copy.
1192 /// 'DstOpIdx' specifies the index of MI def operand.
1193 /// 'BaseOpKilled' specifies if the register associated with 'BaseOpIdx'
1194 /// operand is killed by the given instruction.
1195 /// The 'Dist' arguments provides the distance of MI from the start of the
1196 /// current basic block and it is used to determine if it is profitable
1197 /// to commute operands in the instruction.
1199 /// Returns true if the transformation happened. Otherwise, returns false.
1200 bool TwoAddressInstructionPass::tryInstructionCommute(MachineInstr
*MI
,
1205 if (!MI
->isCommutable())
1208 bool MadeChange
= false;
1209 Register DstOpReg
= MI
->getOperand(DstOpIdx
).getReg();
1210 Register BaseOpReg
= MI
->getOperand(BaseOpIdx
).getReg();
1211 unsigned OpsNum
= MI
->getDesc().getNumOperands();
1212 unsigned OtherOpIdx
= MI
->getDesc().getNumDefs();
1213 for (; OtherOpIdx
< OpsNum
; OtherOpIdx
++) {
1214 // The call of findCommutedOpIndices below only checks if BaseOpIdx
1215 // and OtherOpIdx are commutable, it does not really search for
1216 // other commutable operands and does not change the values of passed
1218 if (OtherOpIdx
== BaseOpIdx
|| !MI
->getOperand(OtherOpIdx
).isReg() ||
1219 !TII
->findCommutedOpIndices(*MI
, BaseOpIdx
, OtherOpIdx
))
1222 Register OtherOpReg
= MI
->getOperand(OtherOpIdx
).getReg();
1223 bool AggressiveCommute
= false;
1225 // If OtherOp dies but BaseOp does not, swap the OtherOp and BaseOp
1226 // operands. This makes the live ranges of DstOp and OtherOp joinable.
1227 bool OtherOpKilled
= isKilled(*MI
, OtherOpReg
, MRI
, TII
, LIS
, false);
1228 bool DoCommute
= !BaseOpKilled
&& OtherOpKilled
;
1231 isProfitableToCommute(DstOpReg
, BaseOpReg
, OtherOpReg
, MI
, Dist
)) {
1233 AggressiveCommute
= true;
1236 // If it's profitable to commute, try to do so.
1237 if (DoCommute
&& commuteInstruction(MI
, DstOpIdx
, BaseOpIdx
, OtherOpIdx
,
1241 if (AggressiveCommute
) {
1243 // There might be more than two commutable operands, update BaseOp and
1244 // continue scanning.
1245 // FIXME: This assumes that the new instruction's operands are in the
1246 // same positions and were simply swapped.
1247 BaseOpReg
= OtherOpReg
;
1248 BaseOpKilled
= OtherOpKilled
;
1249 // Resamples OpsNum in case the number of operands was reduced. This
1250 // happens with X86.
1251 OpsNum
= MI
->getDesc().getNumOperands();
1254 // If this was a commute based on kill, we won't do better continuing.
1261 /// For the case where an instruction has a single pair of tied register
1262 /// operands, attempt some transformations that may either eliminate the tied
1263 /// operands or improve the opportunities for coalescing away the register copy.
1264 /// Returns true if no copy needs to be inserted to untie mi's operands
1265 /// (either because they were untied, or because mi was rescheduled, and will
1266 /// be visited again later). If the shouldOnlyCommute flag is true, only
1267 /// instruction commutation is attempted.
1268 bool TwoAddressInstructionPass::
1269 tryInstructionTransform(MachineBasicBlock::iterator
&mi
,
1270 MachineBasicBlock::iterator
&nmi
,
1271 unsigned SrcIdx
, unsigned DstIdx
,
1272 unsigned Dist
, bool shouldOnlyCommute
) {
1273 if (OptLevel
== CodeGenOpt::None
)
1276 MachineInstr
&MI
= *mi
;
1277 Register regA
= MI
.getOperand(DstIdx
).getReg();
1278 Register regB
= MI
.getOperand(SrcIdx
).getReg();
1280 assert(Register::isVirtualRegister(regB
) &&
1281 "cannot make instruction into two-address form");
1282 bool regBKilled
= isKilled(MI
, regB
, MRI
, TII
, LIS
, true);
1284 if (Register::isVirtualRegister(regA
))
1287 bool Commuted
= tryInstructionCommute(&MI
, DstIdx
, SrcIdx
, regBKilled
, Dist
);
1289 // If the instruction is convertible to 3 Addr, instead
1290 // of returning try 3 Addr transformation aggresively and
1291 // use this variable to check later. Because it might be better.
1292 // For example, we can just use `leal (%rsi,%rdi), %eax` and `ret`
1293 // instead of the following code.
1297 if (Commuted
&& !MI
.isConvertibleTo3Addr())
1300 if (shouldOnlyCommute
)
1303 // If there is one more use of regB later in the same MBB, consider
1304 // re-schedule this MI below it.
1305 if (!Commuted
&& EnableRescheduling
&& rescheduleMIBelowKill(mi
, nmi
, regB
)) {
1310 // If we commuted, regB may have changed so we should re-sample it to avoid
1311 // confusing the three address conversion below.
1313 regB
= MI
.getOperand(SrcIdx
).getReg();
1314 regBKilled
= isKilled(MI
, regB
, MRI
, TII
, LIS
, true);
1317 if (MI
.isConvertibleTo3Addr()) {
1318 // This instruction is potentially convertible to a true
1319 // three-address instruction. Check if it is profitable.
1320 if (!regBKilled
|| isProfitableToConv3Addr(regA
, regB
)) {
1321 // Try to convert it.
1322 if (convertInstTo3Addr(mi
, nmi
, regA
, regB
, Dist
)) {
1323 ++NumConvertedTo3Addr
;
1324 return true; // Done with this instruction.
1329 // Return if it is commuted but 3 addr conversion is failed.
1333 // If there is one more use of regB later in the same MBB, consider
1334 // re-schedule it before this MI if it's legal.
1335 if (EnableRescheduling
&& rescheduleKillAboveMI(mi
, nmi
, regB
)) {
1340 // If this is an instruction with a load folded into it, try unfolding
1341 // the load, e.g. avoid this:
1343 // addq (%rax), %rcx
1344 // in favor of this:
1345 // movq (%rax), %rcx
1347 // because it's preferable to schedule a load than a register copy.
1348 if (MI
.mayLoad() && !regBKilled
) {
1349 // Determine if a load can be unfolded.
1350 unsigned LoadRegIndex
;
1352 TII
->getOpcodeAfterMemoryUnfold(MI
.getOpcode(),
1353 /*UnfoldLoad=*/true,
1354 /*UnfoldStore=*/false,
1357 const MCInstrDesc
&UnfoldMCID
= TII
->get(NewOpc
);
1358 if (UnfoldMCID
.getNumDefs() == 1) {
1360 LLVM_DEBUG(dbgs() << "2addr: UNFOLDING: " << MI
);
1361 const TargetRegisterClass
*RC
=
1362 TRI
->getAllocatableClass(
1363 TII
->getRegClass(UnfoldMCID
, LoadRegIndex
, TRI
, *MF
));
1364 Register Reg
= MRI
->createVirtualRegister(RC
);
1365 SmallVector
<MachineInstr
*, 2> NewMIs
;
1366 if (!TII
->unfoldMemoryOperand(*MF
, MI
, Reg
,
1367 /*UnfoldLoad=*/true,
1368 /*UnfoldStore=*/false, NewMIs
)) {
1369 LLVM_DEBUG(dbgs() << "2addr: ABANDONING UNFOLD\n");
1372 assert(NewMIs
.size() == 2 &&
1373 "Unfolded a load into multiple instructions!");
1374 // The load was previously folded, so this is the only use.
1375 NewMIs
[1]->addRegisterKilled(Reg
, TRI
);
1377 // Tentatively insert the instructions into the block so that they
1378 // look "normal" to the transformation logic.
1379 MBB
->insert(mi
, NewMIs
[0]);
1380 MBB
->insert(mi
, NewMIs
[1]);
1382 LLVM_DEBUG(dbgs() << "2addr: NEW LOAD: " << *NewMIs
[0]
1383 << "2addr: NEW INST: " << *NewMIs
[1]);
1385 // Transform the instruction, now that it no longer has a load.
1386 unsigned NewDstIdx
= NewMIs
[1]->findRegisterDefOperandIdx(regA
);
1387 unsigned NewSrcIdx
= NewMIs
[1]->findRegisterUseOperandIdx(regB
);
1388 MachineBasicBlock::iterator NewMI
= NewMIs
[1];
1389 bool TransformResult
=
1390 tryInstructionTransform(NewMI
, mi
, NewSrcIdx
, NewDstIdx
, Dist
, true);
1391 (void)TransformResult
;
1392 assert(!TransformResult
&&
1393 "tryInstructionTransform() should return false.");
1394 if (NewMIs
[1]->getOperand(NewSrcIdx
).isKill()) {
1395 // Success, or at least we made an improvement. Keep the unfolded
1396 // instructions and discard the original.
1398 for (unsigned i
= 0, e
= MI
.getNumOperands(); i
!= e
; ++i
) {
1399 MachineOperand
&MO
= MI
.getOperand(i
);
1400 if (MO
.isReg() && Register::isVirtualRegister(MO
.getReg())) {
1403 if (NewMIs
[0]->killsRegister(MO
.getReg()))
1404 LV
->replaceKillInstruction(MO
.getReg(), MI
, *NewMIs
[0]);
1406 assert(NewMIs
[1]->killsRegister(MO
.getReg()) &&
1407 "Kill missing after load unfold!");
1408 LV
->replaceKillInstruction(MO
.getReg(), MI
, *NewMIs
[1]);
1411 } else if (LV
->removeVirtualRegisterDead(MO
.getReg(), MI
)) {
1412 if (NewMIs
[1]->registerDefIsDead(MO
.getReg()))
1413 LV
->addVirtualRegisterDead(MO
.getReg(), *NewMIs
[1]);
1415 assert(NewMIs
[0]->registerDefIsDead(MO
.getReg()) &&
1416 "Dead flag missing after load unfold!");
1417 LV
->addVirtualRegisterDead(MO
.getReg(), *NewMIs
[0]);
1422 LV
->addVirtualRegisterKilled(Reg
, *NewMIs
[1]);
1425 SmallVector
<unsigned, 4> OrigRegs
;
1427 for (const MachineOperand
&MO
: MI
.operands()) {
1429 OrigRegs
.push_back(MO
.getReg());
1433 MI
.eraseFromParent();
1435 // Update LiveIntervals.
1437 MachineBasicBlock::iterator
Begin(NewMIs
[0]);
1438 MachineBasicBlock::iterator
End(NewMIs
[1]);
1439 LIS
->repairIntervalsInRange(MBB
, Begin
, End
, OrigRegs
);
1444 // Transforming didn't eliminate the tie and didn't lead to an
1445 // improvement. Clean up the unfolded instructions and keep the
1447 LLVM_DEBUG(dbgs() << "2addr: ABANDONING UNFOLD\n");
1448 NewMIs
[0]->eraseFromParent();
1449 NewMIs
[1]->eraseFromParent();
1458 // Collect tied operands of MI that need to be handled.
1459 // Rewrite trivial cases immediately.
1460 // Return true if any tied operands where found, including the trivial ones.
1461 bool TwoAddressInstructionPass::
1462 collectTiedOperands(MachineInstr
*MI
, TiedOperandMap
&TiedOperands
) {
1463 const MCInstrDesc
&MCID
= MI
->getDesc();
1464 bool AnyOps
= false;
1465 unsigned NumOps
= MI
->getNumOperands();
1467 for (unsigned SrcIdx
= 0; SrcIdx
< NumOps
; ++SrcIdx
) {
1468 unsigned DstIdx
= 0;
1469 if (!MI
->isRegTiedToDefOperand(SrcIdx
, &DstIdx
))
1472 MachineOperand
&SrcMO
= MI
->getOperand(SrcIdx
);
1473 MachineOperand
&DstMO
= MI
->getOperand(DstIdx
);
1474 Register SrcReg
= SrcMO
.getReg();
1475 Register DstReg
= DstMO
.getReg();
1476 // Tied constraint already satisfied?
1477 if (SrcReg
== DstReg
)
1480 assert(SrcReg
&& SrcMO
.isUse() && "two address instruction invalid");
1482 // Deal with undef uses immediately - simply rewrite the src operand.
1483 if (SrcMO
.isUndef() && !DstMO
.getSubReg()) {
1484 // Constrain the DstReg register class if required.
1485 if (Register::isVirtualRegister(DstReg
))
1486 if (const TargetRegisterClass
*RC
= TII
->getRegClass(MCID
, SrcIdx
,
1488 MRI
->constrainRegClass(DstReg
, RC
);
1489 SrcMO
.setReg(DstReg
);
1491 LLVM_DEBUG(dbgs() << "\t\trewrite undef:\t" << *MI
);
1494 TiedOperands
[SrcReg
].push_back(std::make_pair(SrcIdx
, DstIdx
));
1499 // Process a list of tied MI operands that all use the same source register.
1500 // The tied pairs are of the form (SrcIdx, DstIdx).
1502 TwoAddressInstructionPass::processTiedPairs(MachineInstr
*MI
,
1503 TiedPairList
&TiedPairs
,
1505 bool IsEarlyClobber
= false;
1506 for (unsigned tpi
= 0, tpe
= TiedPairs
.size(); tpi
!= tpe
; ++tpi
) {
1507 const MachineOperand
&DstMO
= MI
->getOperand(TiedPairs
[tpi
].second
);
1508 IsEarlyClobber
|= DstMO
.isEarlyClobber();
1511 bool RemovedKillFlag
= false;
1512 bool AllUsesCopied
= true;
1513 unsigned LastCopiedReg
= 0;
1514 SlotIndex LastCopyIdx
;
1516 unsigned SubRegB
= 0;
1517 for (unsigned tpi
= 0, tpe
= TiedPairs
.size(); tpi
!= tpe
; ++tpi
) {
1518 unsigned SrcIdx
= TiedPairs
[tpi
].first
;
1519 unsigned DstIdx
= TiedPairs
[tpi
].second
;
1521 const MachineOperand
&DstMO
= MI
->getOperand(DstIdx
);
1522 Register RegA
= DstMO
.getReg();
1524 // Grab RegB from the instruction because it may have changed if the
1525 // instruction was commuted.
1526 RegB
= MI
->getOperand(SrcIdx
).getReg();
1527 SubRegB
= MI
->getOperand(SrcIdx
).getSubReg();
1530 // The register is tied to multiple destinations (or else we would
1531 // not have continued this far), but this use of the register
1532 // already matches the tied destination. Leave it.
1533 AllUsesCopied
= false;
1536 LastCopiedReg
= RegA
;
1538 assert(Register::isVirtualRegister(RegB
) &&
1539 "cannot make instruction into two-address form");
1542 // First, verify that we don't have a use of "a" in the instruction
1543 // (a = b + a for example) because our transformation will not
1544 // work. This should never occur because we are in SSA form.
1545 for (unsigned i
= 0; i
!= MI
->getNumOperands(); ++i
)
1546 assert(i
== DstIdx
||
1547 !MI
->getOperand(i
).isReg() ||
1548 MI
->getOperand(i
).getReg() != RegA
);
1552 MachineInstrBuilder MIB
= BuildMI(*MI
->getParent(), MI
, MI
->getDebugLoc(),
1553 TII
->get(TargetOpcode::COPY
), RegA
);
1554 // If this operand is folding a truncation, the truncation now moves to the
1555 // copy so that the register classes remain valid for the operands.
1556 MIB
.addReg(RegB
, 0, SubRegB
);
1557 const TargetRegisterClass
*RC
= MRI
->getRegClass(RegB
);
1559 if (Register::isVirtualRegister(RegA
)) {
1560 assert(TRI
->getMatchingSuperRegClass(RC
, MRI
->getRegClass(RegA
),
1562 "tied subregister must be a truncation");
1563 // The superreg class will not be used to constrain the subreg class.
1566 assert(TRI
->getMatchingSuperReg(RegA
, SubRegB
, MRI
->getRegClass(RegB
))
1567 && "tied subregister must be a truncation");
1571 // Update DistanceMap.
1572 MachineBasicBlock::iterator PrevMI
= MI
;
1574 DistanceMap
.insert(std::make_pair(&*PrevMI
, Dist
));
1575 DistanceMap
[MI
] = ++Dist
;
1578 LastCopyIdx
= LIS
->InsertMachineInstrInMaps(*PrevMI
).getRegSlot();
1580 if (Register::isVirtualRegister(RegA
)) {
1581 LiveInterval
&LI
= LIS
->getInterval(RegA
);
1582 VNInfo
*VNI
= LI
.getNextValue(LastCopyIdx
, LIS
->getVNInfoAllocator());
1584 LIS
->getInstructionIndex(*MI
).getRegSlot(IsEarlyClobber
);
1585 LI
.addSegment(LiveInterval::Segment(LastCopyIdx
, endIdx
, VNI
));
1589 LLVM_DEBUG(dbgs() << "\t\tprepend:\t" << *MIB
);
1591 MachineOperand
&MO
= MI
->getOperand(SrcIdx
);
1592 assert(MO
.isReg() && MO
.getReg() == RegB
&& MO
.isUse() &&
1593 "inconsistent operand info for 2-reg pass");
1595 MO
.setIsKill(false);
1596 RemovedKillFlag
= true;
1599 // Make sure regA is a legal regclass for the SrcIdx operand.
1600 if (Register::isVirtualRegister(RegA
) && Register::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 Register SrcReg
= mi
->getOperand(SrcIdx
).getReg();
1743 Register 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 Register DstReg
= MI
.getOperand(0).getReg();
1802 if (MI
.getOperand(0).getSubReg() || Register::isPhysicalRegister(DstReg
) ||
1803 !(MI
.getNumOperands() & 1)) {
1804 LLVM_DEBUG(dbgs() << "Illegal REG_SEQUENCE instruction:" << MI
);
1805 llvm_unreachable(nullptr);
1808 SmallVector
<unsigned, 4> OrigRegs
;
1810 OrigRegs
.push_back(MI
.getOperand(0).getReg());
1811 for (unsigned i
= 1, e
= MI
.getNumOperands(); i
< e
; i
+= 2)
1812 OrigRegs
.push_back(MI
.getOperand(i
).getReg());
1815 bool DefEmitted
= false;
1816 for (unsigned i
= 1, e
= MI
.getNumOperands(); i
< e
; i
+= 2) {
1817 MachineOperand
&UseMO
= MI
.getOperand(i
);
1818 Register SrcReg
= UseMO
.getReg();
1819 unsigned SubIdx
= MI
.getOperand(i
+1).getImm();
1820 // Nothing needs to be inserted for undef operands.
1821 if (UseMO
.isUndef())
1824 // Defer any kill flag to the last operand using SrcReg. Otherwise, we
1825 // might insert a COPY that uses SrcReg after is was killed.
1826 bool isKill
= UseMO
.isKill();
1828 for (unsigned j
= i
+ 2; j
< e
; j
+= 2)
1829 if (MI
.getOperand(j
).getReg() == SrcReg
) {
1830 MI
.getOperand(j
).setIsKill();
1831 UseMO
.setIsKill(false);
1836 // Insert the sub-register copy.
1837 MachineInstr
*CopyMI
= BuildMI(*MI
.getParent(), MI
, MI
.getDebugLoc(),
1838 TII
->get(TargetOpcode::COPY
))
1839 .addReg(DstReg
, RegState::Define
, SubIdx
)
1842 // The first def needs an undef flag because there is no live register
1845 CopyMI
->getOperand(0).setIsUndef(true);
1846 // Return an iterator pointing to the first inserted instr.
1851 // Update LiveVariables' kill info.
1852 if (LV
&& isKill
&& !Register::isPhysicalRegister(SrcReg
))
1853 LV
->replaceKillInstruction(SrcReg
, MI
, *CopyMI
);
1855 LLVM_DEBUG(dbgs() << "Inserted: " << *CopyMI
);
1858 MachineBasicBlock::iterator EndMBBI
=
1859 std::next(MachineBasicBlock::iterator(MI
));
1862 LLVM_DEBUG(dbgs() << "Turned: " << MI
<< " into an IMPLICIT_DEF");
1863 MI
.setDesc(TII
->get(TargetOpcode::IMPLICIT_DEF
));
1864 for (int j
= MI
.getNumOperands() - 1, ee
= 0; j
> ee
; --j
)
1865 MI
.RemoveOperand(j
);
1867 LLVM_DEBUG(dbgs() << "Eliminated: " << MI
);
1868 MI
.eraseFromParent();
1871 // Udpate LiveIntervals.
1873 LIS
->repairIntervalsInRange(MBB
, MBBI
, EndMBBI
, OrigRegs
);