1 //===- StrongPhiElimination.cpp - Eliminate PHI nodes by inserting copies -===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This pass eliminates machine instruction PHI nodes by inserting copy
11 // instructions, using an intelligent copy-folding technique based on
12 // dominator information. This is technique is derived from:
14 // Budimlic, et al. Fast copy coalescing and live-range identification.
15 // In Proceedings of the ACM SIGPLAN 2002 Conference on Programming Language
16 // Design and Implementation (Berlin, Germany, June 17 - 19, 2002).
17 // PLDI '02. ACM, New York, NY, 25-32.
18 // DOI= http://doi.acm.org/10.1145/512529.512534
20 //===----------------------------------------------------------------------===//
22 #define DEBUG_TYPE "strongphielim"
23 #include "llvm/CodeGen/Passes.h"
24 #include "llvm/CodeGen/LiveIntervalAnalysis.h"
25 #include "llvm/CodeGen/MachineDominators.h"
26 #include "llvm/CodeGen/MachineFunctionPass.h"
27 #include "llvm/CodeGen/MachineInstr.h"
28 #include "llvm/CodeGen/MachineInstrBuilder.h"
29 #include "llvm/CodeGen/MachineLoopInfo.h"
30 #include "llvm/CodeGen/MachineRegisterInfo.h"
31 #include "llvm/CodeGen/RegisterCoalescer.h"
32 #include "llvm/Target/TargetInstrInfo.h"
33 #include "llvm/Target/TargetMachine.h"
34 #include "llvm/ADT/DepthFirstIterator.h"
35 #include "llvm/ADT/Statistic.h"
36 #include "llvm/Support/Debug.h"
40 struct StrongPHIElimination
: public MachineFunctionPass
{
41 static char ID
; // Pass identification, replacement for typeid
42 StrongPHIElimination() : MachineFunctionPass(ID
) {
43 initializeStrongPHIEliminationPass(*PassRegistry::getPassRegistry());
46 // Waiting stores, for each MBB, the set of copies that need to
47 // be inserted into that MBB
48 DenseMap
<MachineBasicBlock
*,
49 std::multimap
<unsigned, unsigned> > Waiting
;
51 // Stacks holds the renaming stack for each register
52 std::map
<unsigned, std::vector
<unsigned> > Stacks
;
54 // Registers in UsedByAnother are PHI nodes that are themselves
55 // used as operands to another PHI node
56 std::set
<unsigned> UsedByAnother
;
58 // RenameSets are the is a map from a PHI-defined register
59 // to the input registers to be coalesced along with the
60 // predecessor block for those input registers.
61 std::map
<unsigned, std::map
<unsigned, MachineBasicBlock
*> > RenameSets
;
63 // PhiValueNumber holds the ID numbers of the VNs for each phi that we're
64 // eliminating, indexed by the register defined by that phi.
65 std::map
<unsigned, unsigned> PhiValueNumber
;
67 // Store the DFS-in number of each block
68 DenseMap
<MachineBasicBlock
*, unsigned> preorder
;
70 // Store the DFS-out number of each block
71 DenseMap
<MachineBasicBlock
*, unsigned> maxpreorder
;
73 bool runOnMachineFunction(MachineFunction
&Fn
);
75 virtual void getAnalysisUsage(AnalysisUsage
&AU
) const {
77 AU
.addRequired
<MachineDominatorTree
>();
78 AU
.addRequired
<SlotIndexes
>();
79 AU
.addPreserved
<SlotIndexes
>();
80 AU
.addRequired
<LiveIntervals
>();
82 // TODO: Actually make this true.
83 AU
.addPreserved
<LiveIntervals
>();
84 AU
.addPreserved
<RegisterCoalescer
>();
85 MachineFunctionPass::getAnalysisUsage(AU
);
88 virtual void releaseMemory() {
94 UsedByAnother
.clear();
100 /// DomForestNode - Represents a node in the "dominator forest". This is
101 /// a forest in which the nodes represent registers and the edges
102 /// represent a dominance relation in the block defining those registers.
103 struct DomForestNode
{
105 // Store references to our children
106 std::vector
<DomForestNode
*> children
;
107 // The register we represent
110 // Add another node as our child
111 void addChild(DomForestNode
* DFN
) { children
.push_back(DFN
); }
114 typedef std::vector
<DomForestNode
*>::iterator iterator
;
116 // Create a DomForestNode by providing the register it represents, and
117 // the node to be its parent. The virtual root node has register 0
118 // and a null parent.
119 DomForestNode(unsigned r
, DomForestNode
* parent
) : reg(r
) {
121 parent
->addChild(this);
125 for (iterator I
= begin(), E
= end(); I
!= E
; ++I
)
129 /// getReg - Return the regiser that this node represents
130 inline unsigned getReg() { return reg
; }
132 // Provide iterator access to our children
133 inline DomForestNode::iterator
begin() { return children
.begin(); }
134 inline DomForestNode::iterator
end() { return children
.end(); }
137 void computeDFS(MachineFunction
& MF
);
138 void processBlock(MachineBasicBlock
* MBB
);
140 std::vector
<DomForestNode
*> computeDomForest(
141 std::map
<unsigned, MachineBasicBlock
*>& instrs
,
142 MachineRegisterInfo
& MRI
);
143 void processPHIUnion(MachineInstr
* Inst
,
144 std::map
<unsigned, MachineBasicBlock
*>& PHIUnion
,
145 std::vector
<StrongPHIElimination::DomForestNode
*>& DF
,
146 std::vector
<std::pair
<unsigned, unsigned> >& locals
);
147 void ScheduleCopies(MachineBasicBlock
* MBB
, std::set
<unsigned>& pushed
);
148 void InsertCopies(MachineDomTreeNode
* MBB
,
149 SmallPtrSet
<MachineBasicBlock
*, 16>& v
);
150 bool mergeLiveIntervals(unsigned primary
, unsigned secondary
);
154 char StrongPHIElimination::ID
= 0;
155 INITIALIZE_PASS_BEGIN(StrongPHIElimination
, "strong-phi-node-elimination",
156 "Eliminate PHI nodes for register allocation, intelligently", false, false)
157 INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree
)
158 INITIALIZE_PASS_DEPENDENCY(SlotIndexes
)
159 INITIALIZE_PASS_DEPENDENCY(LiveIntervals
)
160 INITIALIZE_PASS_END(StrongPHIElimination
, "strong-phi-node-elimination",
161 "Eliminate PHI nodes for register allocation, intelligently", false, false)
163 char &llvm::StrongPHIEliminationID
= StrongPHIElimination::ID
;
165 /// computeDFS - Computes the DFS-in and DFS-out numbers of the dominator tree
166 /// of the given MachineFunction. These numbers are then used in other parts
167 /// of the PHI elimination process.
168 void StrongPHIElimination::computeDFS(MachineFunction
& MF
) {
169 SmallPtrSet
<MachineDomTreeNode
*, 8> frontier
;
170 SmallPtrSet
<MachineDomTreeNode
*, 8> visited
;
174 MachineDominatorTree
& DT
= getAnalysis
<MachineDominatorTree
>();
176 MachineDomTreeNode
* node
= DT
.getRootNode();
178 std::vector
<MachineDomTreeNode
*> worklist
;
179 worklist
.push_back(node
);
181 while (!worklist
.empty()) {
182 MachineDomTreeNode
* currNode
= worklist
.back();
184 if (!frontier
.count(currNode
)) {
185 frontier
.insert(currNode
);
187 preorder
.insert(std::make_pair(currNode
->getBlock(), time
));
190 bool inserted
= false;
191 for (MachineDomTreeNode::iterator I
= currNode
->begin(), E
= currNode
->end();
193 if (!frontier
.count(*I
) && !visited
.count(*I
)) {
194 worklist
.push_back(*I
);
200 frontier
.erase(currNode
);
201 visited
.insert(currNode
);
202 maxpreorder
.insert(std::make_pair(currNode
->getBlock(), time
));
211 /// PreorderSorter - a helper class that is used to sort registers
212 /// according to the preorder number of their defining blocks
213 class PreorderSorter
{
215 DenseMap
<MachineBasicBlock
*, unsigned>& preorder
;
216 MachineRegisterInfo
& MRI
;
219 PreorderSorter(DenseMap
<MachineBasicBlock
*, unsigned>& p
,
220 MachineRegisterInfo
& M
) : preorder(p
), MRI(M
) { }
222 bool operator()(unsigned A
, unsigned B
) {
226 MachineBasicBlock
* ABlock
= MRI
.getVRegDef(A
)->getParent();
227 MachineBasicBlock
* BBlock
= MRI
.getVRegDef(B
)->getParent();
229 if (preorder
[ABlock
] < preorder
[BBlock
])
231 else if (preorder
[ABlock
] > preorder
[BBlock
])
240 /// computeDomForest - compute the subforest of the DomTree corresponding
241 /// to the defining blocks of the registers in question
242 std::vector
<StrongPHIElimination::DomForestNode
*>
243 StrongPHIElimination::computeDomForest(
244 std::map
<unsigned, MachineBasicBlock
*>& regs
,
245 MachineRegisterInfo
& MRI
) {
246 // Begin by creating a virtual root node, since the actual results
247 // may well be a forest. Assume this node has maximum DFS-out number.
248 DomForestNode
* VirtualRoot
= new DomForestNode(0, 0);
249 maxpreorder
.insert(std::make_pair((MachineBasicBlock
*)0, ~0UL));
251 // Populate a worklist with the registers
252 std::vector
<unsigned> worklist
;
253 worklist
.reserve(regs
.size());
254 for (std::map
<unsigned, MachineBasicBlock
*>::iterator I
= regs
.begin(),
255 E
= regs
.end(); I
!= E
; ++I
)
256 worklist
.push_back(I
->first
);
258 // Sort the registers by the DFS-in number of their defining block
259 PreorderSorter
PS(preorder
, MRI
);
260 std::sort(worklist
.begin(), worklist
.end(), PS
);
262 // Create a "current parent" stack, and put the virtual root on top of it
263 DomForestNode
* CurrentParent
= VirtualRoot
;
264 std::vector
<DomForestNode
*> stack
;
265 stack
.push_back(VirtualRoot
);
267 // Iterate over all the registers in the previously computed order
268 for (std::vector
<unsigned>::iterator I
= worklist
.begin(), E
= worklist
.end();
270 unsigned pre
= preorder
[MRI
.getVRegDef(*I
)->getParent()];
271 MachineBasicBlock
* parentBlock
= CurrentParent
->getReg() ?
272 MRI
.getVRegDef(CurrentParent
->getReg())->getParent() :
275 // If the DFS-in number of the register is greater than the DFS-out number
276 // of the current parent, repeatedly pop the parent stack until it isn't.
277 while (pre
> maxpreorder
[parentBlock
]) {
279 CurrentParent
= stack
.back();
281 parentBlock
= CurrentParent
->getReg() ?
282 MRI
.getVRegDef(CurrentParent
->getReg())->getParent() :
286 // Now that we've found the appropriate parent, create a DomForestNode for
287 // this register and attach it to the forest
288 DomForestNode
* child
= new DomForestNode(*I
, CurrentParent
);
290 // Push this new node on the "current parent" stack
291 stack
.push_back(child
);
292 CurrentParent
= child
;
295 // Return a vector containing the children of the virtual root node
296 std::vector
<DomForestNode
*> ret
;
297 ret
.insert(ret
.end(), VirtualRoot
->begin(), VirtualRoot
->end());
301 /// isLiveIn - helper method that determines, from a regno, if a register
302 /// is live into a block
303 static bool isLiveIn(unsigned r
, MachineBasicBlock
* MBB
,
305 LiveInterval
& I
= LI
.getOrCreateInterval(r
);
306 SlotIndex idx
= LI
.getMBBStartIdx(MBB
);
307 return I
.liveAt(idx
);
310 /// isLiveOut - help method that determines, from a regno, if a register is
311 /// live out of a block.
312 static bool isLiveOut(unsigned r
, MachineBasicBlock
* MBB
,
314 for (MachineBasicBlock::succ_iterator PI
= MBB
->succ_begin(),
315 E
= MBB
->succ_end(); PI
!= E
; ++PI
)
316 if (isLiveIn(r
, *PI
, LI
))
322 /// interferes - checks for local interferences by scanning a block. The only
323 /// trick parameter is 'mode' which tells it the relationship of the two
324 /// registers. 0 - defined in the same block, 1 - first properly dominates
325 /// second, 2 - second properly dominates first
326 static bool interferes(unsigned a
, unsigned b
, MachineBasicBlock
* scan
,
327 LiveIntervals
& LV
, unsigned mode
) {
328 MachineInstr
* def
= 0;
329 MachineInstr
* kill
= 0;
331 // The code is still in SSA form at this point, so there is only one
332 // definition per VReg. Thus we can safely use MRI->getVRegDef().
333 const MachineRegisterInfo
* MRI
= &scan
->getParent()->getRegInfo();
335 bool interference
= false;
337 // Wallk the block, checking for interferences
338 for (MachineBasicBlock::iterator MBI
= scan
->begin(), MBE
= scan
->end();
340 MachineInstr
* curr
= MBI
;
342 // Same defining block...
344 if (curr
== MRI
->getVRegDef(a
)) {
345 // If we find our first definition, save it
348 // If there's already an unkilled definition, then
349 // this is an interference
353 // If there's a definition followed by a KillInst, then
354 // they can't interfere
356 interference
= false;
359 // Symmetric with the above
360 } else if (curr
== MRI
->getVRegDef(b
)) {
367 interference
= false;
370 // Store KillInsts if they match up with the definition
371 } else if (curr
->killsRegister(a
)) {
372 if (def
== MRI
->getVRegDef(a
)) {
374 } else if (curr
->killsRegister(b
)) {
375 if (def
== MRI
->getVRegDef(b
)) {
380 // First properly dominates second...
381 } else if (mode
== 1) {
382 if (curr
== MRI
->getVRegDef(b
)) {
383 // Definition of second without kill of first is an interference
387 // Definition after a kill is a non-interference
389 interference
= false;
392 // Save KillInsts of First
393 } else if (curr
->killsRegister(a
)) {
396 // Symmetric with the above
397 } else if (mode
== 2) {
398 if (curr
== MRI
->getVRegDef(a
)) {
403 interference
= false;
406 } else if (curr
->killsRegister(b
)) {
415 /// processBlock - Determine how to break up PHIs in the current block. Each
416 /// PHI is broken up by some combination of renaming its operands and inserting
417 /// copies. This method is responsible for determining which operands receive
419 void StrongPHIElimination::processBlock(MachineBasicBlock
* MBB
) {
420 LiveIntervals
& LI
= getAnalysis
<LiveIntervals
>();
421 MachineRegisterInfo
& MRI
= MBB
->getParent()->getRegInfo();
423 // Holds names that have been added to a set in any PHI within this block
424 // before the current one.
425 std::set
<unsigned> ProcessedNames
;
427 // Iterate over all the PHI nodes in this block
428 MachineBasicBlock::iterator P
= MBB
->begin();
429 while (P
!= MBB
->end() && P
->isPHI()) {
430 unsigned DestReg
= P
->getOperand(0).getReg();
432 // Don't both doing PHI elimination for dead PHI's.
433 if (P
->registerDefIsDead(DestReg
)) {
438 LiveInterval
& PI
= LI
.getOrCreateInterval(DestReg
);
439 SlotIndex pIdx
= LI
.getInstructionIndex(P
).getDefIndex();
440 VNInfo
* PVN
= PI
.getLiveRangeContaining(pIdx
)->valno
;
441 PhiValueNumber
.insert(std::make_pair(DestReg
, PVN
->id
));
443 // PHIUnion is the set of incoming registers to the PHI node that
444 // are going to be renames rather than having copies inserted. This set
445 // is refinded over the course of this function. UnionedBlocks is the set
446 // of corresponding MBBs.
447 std::map
<unsigned, MachineBasicBlock
*> PHIUnion
;
448 SmallPtrSet
<MachineBasicBlock
*, 8> UnionedBlocks
;
450 // Iterate over the operands of the PHI node
451 for (int i
= P
->getNumOperands() - 1; i
>= 2; i
-=2) {
452 unsigned SrcReg
= P
->getOperand(i
-1).getReg();
454 // Don't need to try to coalesce a register with itself.
455 if (SrcReg
== DestReg
) {
456 ProcessedNames
.insert(SrcReg
);
460 // We don't need to insert copies for implicit_defs.
461 MachineInstr
* DefMI
= MRI
.getVRegDef(SrcReg
);
462 if (DefMI
->isImplicitDef())
463 ProcessedNames
.insert(SrcReg
);
465 // Check for trivial interferences via liveness information, allowing us
466 // to avoid extra work later. Any registers that interfere cannot both
467 // be in the renaming set, so choose one and add copies for it instead.
468 // The conditions are:
469 // 1) if the operand is live into the PHI node's block OR
470 // 2) if the PHI node is live out of the operand's defining block OR
471 // 3) if the operand is itself a PHI node and the original PHI is
472 // live into the operand's defining block OR
473 // 4) if the operand is already being renamed for another PHI node
475 // 5) if any two operands are defined in the same block, insert copies
477 if (isLiveIn(SrcReg
, P
->getParent(), LI
) ||
478 isLiveOut(P
->getOperand(0).getReg(),
479 MRI
.getVRegDef(SrcReg
)->getParent(), LI
) ||
480 ( MRI
.getVRegDef(SrcReg
)->isPHI() &&
481 isLiveIn(P
->getOperand(0).getReg(),
482 MRI
.getVRegDef(SrcReg
)->getParent(), LI
) ) ||
483 ProcessedNames
.count(SrcReg
) ||
484 UnionedBlocks
.count(MRI
.getVRegDef(SrcReg
)->getParent())) {
486 // Add a copy for the selected register
487 MachineBasicBlock
* From
= P
->getOperand(i
).getMBB();
488 Waiting
[From
].insert(std::make_pair(SrcReg
, DestReg
));
489 UsedByAnother
.insert(SrcReg
);
491 // Otherwise, add it to the renaming set
492 PHIUnion
.insert(std::make_pair(SrcReg
,P
->getOperand(i
).getMBB()));
493 UnionedBlocks
.insert(MRI
.getVRegDef(SrcReg
)->getParent());
497 // Compute the dominator forest for the renaming set. This is a forest
498 // where the nodes are the registers and the edges represent dominance
499 // relations between the defining blocks of the registers
500 std::vector
<StrongPHIElimination::DomForestNode
*> DF
=
501 computeDomForest(PHIUnion
, MRI
);
503 // Walk DomForest to resolve interferences at an inter-block level. This
504 // will remove registers from the renaming set (and insert copies for them)
505 // if interferences are found.
506 std::vector
<std::pair
<unsigned, unsigned> > localInterferences
;
507 processPHIUnion(P
, PHIUnion
, DF
, localInterferences
);
509 // If one of the inputs is defined in the same block as the current PHI
510 // then we need to check for a local interference between that input and
512 for (std::map
<unsigned, MachineBasicBlock
*>::iterator I
= PHIUnion
.begin(),
513 E
= PHIUnion
.end(); I
!= E
; ++I
)
514 if (MRI
.getVRegDef(I
->first
)->getParent() == P
->getParent())
515 localInterferences
.push_back(std::make_pair(I
->first
,
516 P
->getOperand(0).getReg()));
518 // The dominator forest walk may have returned some register pairs whose
519 // interference cannot be determined from dominator analysis. We now
520 // examine these pairs for local interferences.
521 for (std::vector
<std::pair
<unsigned, unsigned> >::iterator I
=
522 localInterferences
.begin(), E
= localInterferences
.end(); I
!= E
; ++I
) {
523 std::pair
<unsigned, unsigned> p
= *I
;
525 MachineDominatorTree
& MDT
= getAnalysis
<MachineDominatorTree
>();
527 // Determine the block we need to scan and the relationship between
529 MachineBasicBlock
* scan
= 0;
531 if (MRI
.getVRegDef(p
.first
)->getParent() ==
532 MRI
.getVRegDef(p
.second
)->getParent()) {
533 scan
= MRI
.getVRegDef(p
.first
)->getParent();
534 mode
= 0; // Same block
535 } else if (MDT
.dominates(MRI
.getVRegDef(p
.first
)->getParent(),
536 MRI
.getVRegDef(p
.second
)->getParent())) {
537 scan
= MRI
.getVRegDef(p
.second
)->getParent();
538 mode
= 1; // First dominates second
540 scan
= MRI
.getVRegDef(p
.first
)->getParent();
541 mode
= 2; // Second dominates first
544 // If there's an interference, we need to insert copies
545 if (interferes(p
.first
, p
.second
, scan
, LI
, mode
)) {
546 // Insert copies for First
547 for (int i
= P
->getNumOperands() - 1; i
>= 2; i
-=2) {
548 if (P
->getOperand(i
-1).getReg() == p
.first
) {
549 unsigned SrcReg
= p
.first
;
550 MachineBasicBlock
* From
= P
->getOperand(i
).getMBB();
552 Waiting
[From
].insert(std::make_pair(SrcReg
,
553 P
->getOperand(0).getReg()));
554 UsedByAnother
.insert(SrcReg
);
556 PHIUnion
.erase(SrcReg
);
562 // Add the renaming set for this PHI node to our overall renaming information
563 for (std::map
<unsigned, MachineBasicBlock
*>::iterator QI
= PHIUnion
.begin(),
564 QE
= PHIUnion
.end(); QI
!= QE
; ++QI
) {
565 DEBUG(dbgs() << "Adding Renaming: " << QI
->first
<< " -> "
566 << P
->getOperand(0).getReg() << "\n");
569 RenameSets
.insert(std::make_pair(P
->getOperand(0).getReg(), PHIUnion
));
571 // Remember which registers are already renamed, so that we don't try to
572 // rename them for another PHI node in this block
573 for (std::map
<unsigned, MachineBasicBlock
*>::iterator I
= PHIUnion
.begin(),
574 E
= PHIUnion
.end(); I
!= E
; ++I
)
575 ProcessedNames
.insert(I
->first
);
581 /// processPHIUnion - Take a set of candidate registers to be coalesced when
582 /// decomposing the PHI instruction. Use the DominanceForest to remove the ones
583 /// that are known to interfere, and flag others that need to be checked for
584 /// local interferences.
585 void StrongPHIElimination::processPHIUnion(MachineInstr
* Inst
,
586 std::map
<unsigned, MachineBasicBlock
*>& PHIUnion
,
587 std::vector
<StrongPHIElimination::DomForestNode
*>& DF
,
588 std::vector
<std::pair
<unsigned, unsigned> >& locals
) {
590 std::vector
<DomForestNode
*> worklist(DF
.begin(), DF
.end());
591 SmallPtrSet
<DomForestNode
*, 4> visited
;
593 // Code is still in SSA form, so we can use MRI::getVRegDef()
594 MachineRegisterInfo
& MRI
= Inst
->getParent()->getParent()->getRegInfo();
596 LiveIntervals
& LI
= getAnalysis
<LiveIntervals
>();
597 unsigned DestReg
= Inst
->getOperand(0).getReg();
599 // DF walk on the DomForest
600 while (!worklist
.empty()) {
601 DomForestNode
* DFNode
= worklist
.back();
603 visited
.insert(DFNode
);
605 bool inserted
= false;
606 for (DomForestNode::iterator CI
= DFNode
->begin(), CE
= DFNode
->end();
608 DomForestNode
* child
= *CI
;
610 // If the current node is live-out of the defining block of one of its
611 // children, insert a copy for it. NOTE: The paper actually calls for
612 // a more elaborate heuristic for determining whether to insert copies
613 // for the child or the parent. In the interest of simplicity, we're
614 // just always choosing the parent.
615 if (isLiveOut(DFNode
->getReg(),
616 MRI
.getVRegDef(child
->getReg())->getParent(), LI
)) {
617 // Insert copies for parent
618 for (int i
= Inst
->getNumOperands() - 1; i
>= 2; i
-=2) {
619 if (Inst
->getOperand(i
-1).getReg() == DFNode
->getReg()) {
620 unsigned SrcReg
= DFNode
->getReg();
621 MachineBasicBlock
* From
= Inst
->getOperand(i
).getMBB();
623 Waiting
[From
].insert(std::make_pair(SrcReg
, DestReg
));
624 UsedByAnother
.insert(SrcReg
);
626 PHIUnion
.erase(SrcReg
);
630 // If a node is live-in to the defining block of one of its children, but
631 // not live-out, then we need to scan that block for local interferences.
632 } else if (isLiveIn(DFNode
->getReg(),
633 MRI
.getVRegDef(child
->getReg())->getParent(), LI
) ||
634 MRI
.getVRegDef(DFNode
->getReg())->getParent() ==
635 MRI
.getVRegDef(child
->getReg())->getParent()) {
636 // Add (p, c) to possible local interferences
637 locals
.push_back(std::make_pair(DFNode
->getReg(), child
->getReg()));
640 if (!visited
.count(child
)) {
641 worklist
.push_back(child
);
646 if (!inserted
) worklist
.pop_back();
650 /// ScheduleCopies - Insert copies into predecessor blocks, scheduling
651 /// them properly so as to avoid the 'lost copy' and the 'virtual swap'
654 /// Based on "Practical Improvements to the Construction and Destruction
655 /// of Static Single Assignment Form" by Briggs, et al.
656 void StrongPHIElimination::ScheduleCopies(MachineBasicBlock
* MBB
,
657 std::set
<unsigned>& pushed
) {
658 // FIXME: This function needs to update LiveIntervals
659 std::multimap
<unsigned, unsigned>& copy_set
= Waiting
[MBB
];
661 std::multimap
<unsigned, unsigned> worklist
;
662 std::map
<unsigned, unsigned> map
;
664 // Setup worklist of initial copies
665 for (std::multimap
<unsigned, unsigned>::iterator I
= copy_set
.begin(),
666 E
= copy_set
.end(); I
!= E
; ) {
667 map
.insert(std::make_pair(I
->first
, I
->first
));
668 map
.insert(std::make_pair(I
->second
, I
->second
));
670 if (!UsedByAnother
.count(I
->second
)) {
673 // Avoid iterator invalidation
674 std::multimap
<unsigned, unsigned>::iterator OI
= I
;
682 LiveIntervals
& LI
= getAnalysis
<LiveIntervals
>();
683 MachineFunction
* MF
= MBB
->getParent();
684 MachineRegisterInfo
& MRI
= MF
->getRegInfo();
685 const TargetInstrInfo
*TII
= MF
->getTarget().getInstrInfo();
687 SmallVector
<std::pair
<unsigned, MachineInstr
*>, 4> InsertedPHIDests
;
689 // Iterate over the worklist, inserting copies
690 while (!worklist
.empty() || !copy_set
.empty()) {
691 while (!worklist
.empty()) {
692 std::multimap
<unsigned, unsigned>::iterator WI
= worklist
.begin();
693 std::pair
<unsigned, unsigned> curr
= *WI
;
696 const TargetRegisterClass
*RC
= MF
->getRegInfo().getRegClass(curr
.first
);
698 if (isLiveOut(curr
.second
, MBB
, LI
)) {
699 // Create a temporary
700 unsigned t
= MF
->getRegInfo().createVirtualRegister(RC
);
702 // Insert copy from curr.second to a temporary at
703 // the Phi defining curr.second
704 MachineBasicBlock::iterator PI
= MRI
.getVRegDef(curr
.second
);
705 BuildMI(*PI
->getParent(), PI
, DebugLoc(), TII
->get(TargetOpcode::COPY
),
706 t
).addReg(curr
.second
);
707 DEBUG(dbgs() << "Inserted copy from " << curr
.second
<< " to " << t
710 // Push temporary on Stacks
711 Stacks
[curr
.second
].push_back(t
);
713 // Insert curr.second in pushed
714 pushed
.insert(curr
.second
);
716 // Create a live interval for this temporary
717 InsertedPHIDests
.push_back(std::make_pair(t
, --PI
));
720 // Insert copy from map[curr.first] to curr.second
721 BuildMI(*MBB
, MBB
->getFirstTerminator(), DebugLoc(),
722 TII
->get(TargetOpcode::COPY
), curr
.second
).addReg(map
[curr
.first
]);
723 map
[curr
.first
] = curr
.second
;
724 DEBUG(dbgs() << "Inserted copy from " << curr
.first
<< " to "
725 << curr
.second
<< "\n");
727 // Push this copy onto InsertedPHICopies so we can
728 // update LiveIntervals with it.
729 MachineBasicBlock::iterator MI
= MBB
->getFirstTerminator();
730 InsertedPHIDests
.push_back(std::make_pair(curr
.second
, --MI
));
732 // If curr.first is a destination in copy_set...
733 for (std::multimap
<unsigned, unsigned>::iterator I
= copy_set
.begin(),
734 E
= copy_set
.end(); I
!= E
; )
735 if (curr
.first
== I
->second
) {
736 std::pair
<unsigned, unsigned> temp
= *I
;
737 worklist
.insert(temp
);
739 // Avoid iterator invalidation
740 std::multimap
<unsigned, unsigned>::iterator OI
= I
;
750 if (!copy_set
.empty()) {
751 std::multimap
<unsigned, unsigned>::iterator CI
= copy_set
.begin();
752 std::pair
<unsigned, unsigned> curr
= *CI
;
753 worklist
.insert(curr
);
756 LiveInterval
& I
= LI
.getInterval(curr
.second
);
757 MachineBasicBlock::iterator term
= MBB
->getFirstTerminator();
758 SlotIndex endIdx
= SlotIndex();
759 if (term
!= MBB
->end())
760 endIdx
= LI
.getInstructionIndex(term
);
762 endIdx
= LI
.getMBBEndIdx(MBB
);
764 if (I
.liveAt(endIdx
)) {
765 const TargetRegisterClass
*RC
=
766 MF
->getRegInfo().getRegClass(curr
.first
);
768 // Insert a copy from dest to a new temporary t at the end of b
769 unsigned t
= MF
->getRegInfo().createVirtualRegister(RC
);
770 BuildMI(*MBB
, MBB
->getFirstTerminator(), DebugLoc(),
771 TII
->get(TargetOpcode::COPY
), t
).addReg(curr
.second
);
772 map
[curr
.second
] = t
;
774 MachineBasicBlock::iterator TI
= MBB
->getFirstTerminator();
775 InsertedPHIDests
.push_back(std::make_pair(t
, --TI
));
780 // Renumber the instructions so that we can perform the index computations
781 // needed to create new live intervals.
784 // For copies that we inserted at the ends of predecessors, we construct
785 // live intervals. This is pretty easy, since we know that the destination
786 // register cannot have be in live at that point previously. We just have
787 // to make sure that, for registers that serve as inputs to more than one
788 // PHI, we don't create multiple overlapping live intervals.
789 std::set
<unsigned> RegHandled
;
790 for (SmallVector
<std::pair
<unsigned, MachineInstr
*>, 4>::iterator I
=
791 InsertedPHIDests
.begin(), E
= InsertedPHIDests
.end(); I
!= E
; ++I
) {
792 if (RegHandled
.insert(I
->first
).second
) {
793 LiveInterval
& Int
= LI
.getOrCreateInterval(I
->first
);
794 SlotIndex instrIdx
= LI
.getInstructionIndex(I
->second
);
795 if (Int
.liveAt(instrIdx
.getDefIndex()))
796 Int
.removeRange(instrIdx
.getDefIndex(),
797 LI
.getMBBEndIdx(I
->second
->getParent()).getNextSlot(),
800 LiveRange R
= LI
.addLiveRangeToEndOfBlock(I
->first
, I
->second
);
801 R
.valno
->setCopy(I
->second
);
802 R
.valno
->def
= LI
.getInstructionIndex(I
->second
).getDefIndex();
807 /// InsertCopies - insert copies into MBB and all of its successors
808 void StrongPHIElimination::InsertCopies(MachineDomTreeNode
* MDTN
,
809 SmallPtrSet
<MachineBasicBlock
*, 16>& visited
) {
810 MachineBasicBlock
* MBB
= MDTN
->getBlock();
813 std::set
<unsigned> pushed
;
815 LiveIntervals
& LI
= getAnalysis
<LiveIntervals
>();
816 // Rewrite register uses from Stacks
817 for (MachineBasicBlock::iterator I
= MBB
->begin(), E
= MBB
->end();
822 for (unsigned i
= 0; i
< I
->getNumOperands(); ++i
)
823 if (I
->getOperand(i
).isReg() &&
824 Stacks
[I
->getOperand(i
).getReg()].size()) {
825 // Remove the live range for the old vreg.
826 LiveInterval
& OldInt
= LI
.getInterval(I
->getOperand(i
).getReg());
827 LiveInterval::iterator OldLR
=
828 OldInt
.FindLiveRangeContaining(LI
.getInstructionIndex(I
).getUseIndex());
829 if (OldLR
!= OldInt
.end())
830 OldInt
.removeRange(*OldLR
, true);
832 // Change the register
833 I
->getOperand(i
).setReg(Stacks
[I
->getOperand(i
).getReg()].back());
835 // Add a live range for the new vreg
836 LiveInterval
& Int
= LI
.getInterval(I
->getOperand(i
).getReg());
837 VNInfo
* FirstVN
= *Int
.vni_begin();
838 FirstVN
->setHasPHIKill(false);
839 LiveRange
LR (LI
.getMBBStartIdx(I
->getParent()),
840 LI
.getInstructionIndex(I
).getUseIndex().getNextSlot(),
847 // Schedule the copies for this block
848 ScheduleCopies(MBB
, pushed
);
850 // Recur down the dominator tree.
851 for (MachineDomTreeNode::iterator I
= MDTN
->begin(),
852 E
= MDTN
->end(); I
!= E
; ++I
)
853 if (!visited
.count((*I
)->getBlock()))
854 InsertCopies(*I
, visited
);
856 // As we exit this block, pop the names we pushed while processing it
857 for (std::set
<unsigned>::iterator I
= pushed
.begin(),
858 E
= pushed
.end(); I
!= E
; ++I
)
859 Stacks
[*I
].pop_back();
862 bool StrongPHIElimination::mergeLiveIntervals(unsigned primary
,
863 unsigned secondary
) {
865 LiveIntervals
& LI
= getAnalysis
<LiveIntervals
>();
866 LiveInterval
& LHS
= LI
.getOrCreateInterval(primary
);
867 LiveInterval
& RHS
= LI
.getOrCreateInterval(secondary
);
871 DenseMap
<VNInfo
*, VNInfo
*> VNMap
;
872 for (LiveInterval::iterator I
= RHS
.begin(), E
= RHS
.end(); I
!= E
; ++I
) {
875 SlotIndex Start
= R
.start
;
876 SlotIndex End
= R
.end
;
877 if (LHS
.getLiveRangeContaining(Start
))
880 if (LHS
.getLiveRangeContaining(End
))
883 LiveInterval::iterator RI
= std::upper_bound(LHS
.begin(), LHS
.end(), R
);
884 if (RI
!= LHS
.end() && RI
->start
< End
)
888 for (LiveInterval::iterator I
= RHS
.begin(), E
= RHS
.end(); I
!= E
; ++I
) {
890 VNInfo
* OldVN
= R
.valno
;
891 VNInfo
*& NewVN
= VNMap
[OldVN
];
893 NewVN
= LHS
.createValueCopy(OldVN
, LI
.getVNInfoAllocator());
896 LiveRange
LR (R
.start
, R
.end
, NewVN
);
900 LI
.removeInterval(RHS
.reg
);
905 bool StrongPHIElimination::runOnMachineFunction(MachineFunction
&Fn
) {
906 LiveIntervals
& LI
= getAnalysis
<LiveIntervals
>();
908 // Compute DFS numbers of each block
911 // Determine which phi node operands need copies
912 for (MachineFunction::iterator I
= Fn
.begin(), E
= Fn
.end(); I
!= E
; ++I
)
913 if (!I
->empty() && I
->begin()->isPHI())
916 // Break interferences where two different phis want to coalesce
917 // in the same register.
918 std::set
<unsigned> seen
;
919 typedef std::map
<unsigned, std::map
<unsigned, MachineBasicBlock
*> >
921 for (RenameSetType::iterator I
= RenameSets
.begin(), E
= RenameSets
.end();
923 for (std::map
<unsigned, MachineBasicBlock
*>::iterator
924 OI
= I
->second
.begin(), OE
= I
->second
.end(); OI
!= OE
; ) {
925 if (!seen
.count(OI
->first
)) {
926 seen
.insert(OI
->first
);
929 Waiting
[OI
->second
].insert(std::make_pair(OI
->first
, I
->first
));
930 unsigned reg
= OI
->first
;
932 I
->second
.erase(reg
);
933 DEBUG(dbgs() << "Removing Renaming: " << reg
<< " -> " << I
->first
940 // FIXME: This process should probably preserve LiveIntervals
941 SmallPtrSet
<MachineBasicBlock
*, 16> visited
;
942 MachineDominatorTree
& MDT
= getAnalysis
<MachineDominatorTree
>();
943 InsertCopies(MDT
.getRootNode(), visited
);
946 for (RenameSetType::iterator I
= RenameSets
.begin(), E
= RenameSets
.end();
948 while (I
->second
.size()) {
949 std::map
<unsigned, MachineBasicBlock
*>::iterator SI
= I
->second
.begin();
951 DEBUG(dbgs() << "Renaming: " << SI
->first
<< " -> " << I
->first
<< "\n");
953 if (SI
->first
!= I
->first
) {
954 if (mergeLiveIntervals(I
->first
, SI
->first
)) {
955 Fn
.getRegInfo().replaceRegWith(SI
->first
, I
->first
);
957 if (RenameSets
.count(SI
->first
)) {
958 I
->second
.insert(RenameSets
[SI
->first
].begin(),
959 RenameSets
[SI
->first
].end());
960 RenameSets
.erase(SI
->first
);
963 // Insert a last-minute copy if a conflict was detected.
964 const TargetInstrInfo
*TII
= Fn
.getTarget().getInstrInfo();
965 BuildMI(*SI
->second
, SI
->second
->getFirstTerminator(), DebugLoc(),
966 TII
->get(TargetOpcode::COPY
), I
->first
).addReg(SI
->first
);
970 LiveInterval
& Int
= LI
.getOrCreateInterval(I
->first
);
972 LI
.getInstructionIndex(--SI
->second
->getFirstTerminator());
973 if (Int
.liveAt(instrIdx
.getDefIndex()))
974 Int
.removeRange(instrIdx
.getDefIndex(),
975 LI
.getMBBEndIdx(SI
->second
).getNextSlot(), true);
977 LiveRange R
= LI
.addLiveRangeToEndOfBlock(I
->first
,
978 --SI
->second
->getFirstTerminator());
979 R
.valno
->setCopy(--SI
->second
->getFirstTerminator());
980 R
.valno
->def
= instrIdx
.getDefIndex();
982 DEBUG(dbgs() << "Renaming failed: " << SI
->first
<< " -> "
983 << I
->first
<< "\n");
987 LiveInterval
& Int
= LI
.getOrCreateInterval(I
->first
);
988 const LiveRange
* LR
=
989 Int
.getLiveRangeContaining(LI
.getMBBEndIdx(SI
->second
));
990 LR
->valno
->setHasPHIKill(true);
992 I
->second
.erase(SI
->first
);
996 std::vector
<MachineInstr
*> phis
;
997 for (MachineFunction::iterator I
= Fn
.begin(), E
= Fn
.end(); I
!= E
; ++I
) {
998 for (MachineBasicBlock::iterator BI
= I
->begin(), BE
= I
->end();
1004 for (std::vector
<MachineInstr
*>::iterator I
= phis
.begin(), E
= phis
.end();
1006 MachineInstr
* PInstr
= *(I
++);
1008 // If this is a dead PHI node, then remove it from LiveIntervals.
1009 unsigned DestReg
= PInstr
->getOperand(0).getReg();
1010 LiveInterval
& PI
= LI
.getInterval(DestReg
);
1011 if (PInstr
->registerDefIsDead(DestReg
)) {
1012 if (PI
.containsOneValue()) {
1013 LI
.removeInterval(DestReg
);
1015 SlotIndex idx
= LI
.getInstructionIndex(PInstr
).getDefIndex();
1016 PI
.removeRange(*PI
.getLiveRangeContaining(idx
), true);
1019 // Trim live intervals of input registers. They are no longer live into
1020 // this block if they died after the PHI. If they lived after it, don't
1021 // trim them because they might have other legitimate uses.
1022 for (unsigned i
= 1; i
< PInstr
->getNumOperands(); i
+= 2) {
1023 unsigned reg
= PInstr
->getOperand(i
).getReg();
1025 MachineBasicBlock
* MBB
= PInstr
->getOperand(i
+1).getMBB();
1026 LiveInterval
& InputI
= LI
.getInterval(reg
);
1027 if (MBB
!= PInstr
->getParent() &&
1028 InputI
.liveAt(LI
.getMBBStartIdx(PInstr
->getParent())) &&
1029 InputI
.expiredAt(LI
.getInstructionIndex(PInstr
).getNextIndex()))
1030 InputI
.removeRange(LI
.getMBBStartIdx(PInstr
->getParent()),
1031 LI
.getInstructionIndex(PInstr
),
1035 // If the PHI is not dead, then the valno defined by the PHI
1036 // now has an unknown def.
1037 SlotIndex idx
= LI
.getInstructionIndex(PInstr
).getDefIndex();
1038 const LiveRange
* PLR
= PI
.getLiveRangeContaining(idx
);
1039 PLR
->valno
->setIsPHIDef(true);
1040 LiveRange
R (LI
.getMBBStartIdx(PInstr
->getParent()),
1041 PLR
->start
, PLR
->valno
);
1045 LI
.RemoveMachineInstrFromMaps(PInstr
);
1046 PInstr
->eraseFromParent();