1 //===-- llvm/CodeGen/Splitter.cpp - Splitter -----------------------------===//
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 #define DEBUG_TYPE "loopsplitter"
14 #include "RegisterCoalescer.h"
15 #include "llvm/Module.h"
16 #include "llvm/CodeGen/CalcSpillWeights.h"
17 #include "llvm/CodeGen/LiveIntervalAnalysis.h"
18 #include "llvm/CodeGen/LiveStackAnalysis.h"
19 #include "llvm/CodeGen/MachineDominators.h"
20 #include "llvm/CodeGen/MachineInstrBuilder.h"
21 #include "llvm/CodeGen/MachineFunction.h"
22 #include "llvm/CodeGen/MachineRegisterInfo.h"
23 #include "llvm/CodeGen/SlotIndexes.h"
24 #include "llvm/Support/Debug.h"
25 #include "llvm/Support/raw_ostream.h"
26 #include "llvm/Target/TargetMachine.h"
27 #include "llvm/Target/TargetInstrInfo.h"
31 char LoopSplitter::ID
= 0;
32 INITIALIZE_PASS_BEGIN(LoopSplitter
, "loop-splitting",
33 "Split virtual regists across loop boundaries.", false, false)
34 INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree
)
35 INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo
)
36 INITIALIZE_PASS_DEPENDENCY(SlotIndexes
)
37 INITIALIZE_PASS_DEPENDENCY(LiveIntervals
)
38 INITIALIZE_PASS_END(LoopSplitter
, "loop-splitting",
39 "Split virtual regists across loop boundaries.", false, false)
43 class StartSlotComparator
{
45 StartSlotComparator(LiveIntervals
&lis
) : lis(lis
) {}
46 bool operator()(const MachineBasicBlock
*mbb1
,
47 const MachineBasicBlock
*mbb2
) const {
48 return lis
.getMBBStartIdx(mbb1
) < lis
.getMBBStartIdx(mbb2
);
56 LoopSplit(LoopSplitter
&ls
, LiveInterval
&li
, MachineLoop
&loop
)
57 : ls(ls
), li(li
), loop(loop
), valid(true), inSplit(false), newLI(0) {
58 assert(TargetRegisterInfo::isVirtualRegister(li
.reg
) &&
59 "Cannot split physical registers.");
62 LiveInterval
& getLI() const { return li
; }
64 MachineLoop
& getLoop() const { return loop
; }
66 bool isValid() const { return valid
; }
68 bool isWorthwhile() const { return valid
&& (inSplit
|| !outSplits
.empty()); }
70 void invalidate() { valid
= false; }
72 void splitIncoming() { inSplit
= true; }
74 void splitOutgoing(MachineLoop::Edge
&edge
) { outSplits
.insert(edge
); }
76 void addLoopInstr(MachineInstr
*i
) { loopInstrs
.push_back(i
); }
79 assert(valid
&& "Attempt to apply invalid split.");
91 std::set
<MachineLoop::Edge
> outSplits
;
92 std::vector
<MachineInstr
*> loopInstrs
;
95 std::map
<VNInfo
*, VNInfo
*> vniMap
;
97 LiveInterval
* getNewLI() {
99 const TargetRegisterClass
*trc
= ls
.mri
->getRegClass(li
.reg
);
100 unsigned vreg
= ls
.mri
->createVirtualRegister(trc
);
101 newLI
= &ls
.lis
->getOrCreateInterval(vreg
);
106 VNInfo
* getNewVNI(VNInfo
*oldVNI
) {
107 VNInfo
*newVNI
= vniMap
[oldVNI
];
110 newVNI
= getNewLI()->createValueCopy(oldVNI
,
111 ls
.lis
->getVNInfoAllocator());
112 vniMap
[oldVNI
] = newVNI
;
118 void applyIncoming() {
123 MachineBasicBlock
*preHeader
= loop
.getLoopPreheader();
124 if (preHeader
== 0) {
125 assert(ls
.canInsertPreHeader(loop
) &&
126 "Can't insert required preheader.");
127 preHeader
= &ls
.insertPreHeader(loop
);
130 LiveRange
*preHeaderRange
=
131 ls
.lis
->findExitingRange(li
, preHeader
);
132 assert(preHeaderRange
!= 0 && "Range not live into preheader.");
134 // Insert the new copy.
135 MachineInstr
*copy
= BuildMI(*preHeader
,
136 preHeader
->getFirstTerminator(),
138 ls
.tii
->get(TargetOpcode::COPY
))
139 .addReg(getNewLI()->reg
, RegState::Define
)
140 .addReg(li
.reg
, RegState::Kill
);
142 ls
.lis
->InsertMachineInstrInMaps(copy
);
144 SlotIndex copyDefIdx
= ls
.lis
->getInstructionIndex(copy
).getDefIndex();
146 VNInfo
*newVal
= getNewVNI(preHeaderRange
->valno
);
147 newVal
->def
= copyDefIdx
;
148 newVal
->setCopy(copy
);
149 li
.removeRange(copyDefIdx
, ls
.lis
->getMBBEndIdx(preHeader
), true);
151 getNewLI()->addRange(LiveRange(copyDefIdx
,
152 ls
.lis
->getMBBEndIdx(preHeader
),
156 void applyOutgoing() {
158 for (std::set
<MachineLoop::Edge
>::iterator osItr
= outSplits
.begin(),
159 osEnd
= outSplits
.end();
160 osItr
!= osEnd
; ++osItr
) {
161 MachineLoop::Edge edge
= *osItr
;
162 MachineBasicBlock
*outBlock
= edge
.second
;
163 if (ls
.isCriticalEdge(edge
)) {
164 assert(ls
.canSplitEdge(edge
) && "Unsplitable critical edge.");
165 outBlock
= &ls
.splitEdge(edge
, loop
);
167 LiveRange
*outRange
= ls
.lis
->findEnteringRange(li
, outBlock
);
168 assert(outRange
!= 0 && "No exiting range?");
170 MachineInstr
*copy
= BuildMI(*outBlock
, outBlock
->begin(),
172 ls
.tii
->get(TargetOpcode::COPY
))
173 .addReg(li
.reg
, RegState::Define
)
174 .addReg(getNewLI()->reg
, RegState::Kill
);
176 ls
.lis
->InsertMachineInstrInMaps(copy
);
178 SlotIndex copyDefIdx
= ls
.lis
->getInstructionIndex(copy
).getDefIndex();
180 // Blow away output range definition.
181 outRange
->valno
->def
= ls
.lis
->getInvalidIndex();
182 li
.removeRange(ls
.lis
->getMBBStartIdx(outBlock
), copyDefIdx
);
184 SlotIndex newDefIdx
= ls
.lis
->getMBBStartIdx(outBlock
);
185 assert(ls
.lis
->getInstructionFromIndex(newDefIdx
) == 0 &&
186 "PHI def index points at actual instruction.");
188 getNewLI()->getNextValue(newDefIdx
, 0, ls
.lis
->getVNInfoAllocator());
190 getNewLI()->addRange(LiveRange(ls
.lis
->getMBBStartIdx(outBlock
),
191 copyDefIdx
, newVal
));
196 void copyRange(LiveRange
&lr
) {
197 std::pair
<bool, LoopSplitter::SlotPair
> lsr
=
198 ls
.getLoopSubRange(lr
, loop
);
203 LiveRange
loopRange(lsr
.second
.first
, lsr
.second
.second
,
204 getNewVNI(lr
.valno
));
206 li
.removeRange(loopRange
.start
, loopRange
.end
, true);
208 getNewLI()->addRange(loopRange
);
212 for (std::vector
<MachineInstr
*>::iterator iItr
= loopInstrs
.begin(),
213 iEnd
= loopInstrs
.end();
214 iItr
!= iEnd
; ++iItr
) {
215 MachineInstr
&instr
= **iItr
;
216 SlotIndex instrIdx
= ls
.lis
->getInstructionIndex(&instr
);
217 if (instr
.modifiesRegister(li
.reg
, 0)) {
218 LiveRange
*defRange
=
219 li
.getLiveRangeContaining(instrIdx
.getDefIndex());
220 if (defRange
!= 0) // May have caught this already.
221 copyRange(*defRange
);
223 if (instr
.readsRegister(li
.reg
, 0)) {
224 LiveRange
*useRange
=
225 li
.getLiveRangeContaining(instrIdx
.getUseIndex());
226 if (useRange
!= 0) { // May have caught this already.
227 copyRange(*useRange
);
232 for (MachineLoop::block_iterator bbItr
= loop
.block_begin(),
233 bbEnd
= loop
.block_end();
234 bbItr
!= bbEnd
; ++bbItr
) {
235 MachineBasicBlock
&loopBlock
= **bbItr
;
236 LiveRange
*enteringRange
=
237 ls
.lis
->findEnteringRange(li
, &loopBlock
);
238 if (enteringRange
!= 0) {
239 copyRange(*enteringRange
);
244 void renameInside() {
245 for (std::vector
<MachineInstr
*>::iterator iItr
= loopInstrs
.begin(),
246 iEnd
= loopInstrs
.end();
247 iItr
!= iEnd
; ++iItr
) {
248 MachineInstr
&instr
= **iItr
;
249 for (unsigned i
= 0; i
< instr
.getNumOperands(); ++i
) {
250 MachineOperand
&mop
= instr
.getOperand(i
);
251 if (mop
.isReg() && mop
.getReg() == li
.reg
) {
252 mop
.setReg(getNewLI()->reg
);
260 void LoopSplitter::getAnalysisUsage(AnalysisUsage
&au
) const {
261 au
.addRequired
<MachineDominatorTree
>();
262 au
.addPreserved
<MachineDominatorTree
>();
263 au
.addRequired
<MachineLoopInfo
>();
264 au
.addPreserved
<MachineLoopInfo
>();
265 au
.addPreserved
<RegisterCoalescer
>();
266 au
.addPreserved
<CalculateSpillWeights
>();
267 au
.addPreserved
<LiveStacks
>();
268 au
.addRequired
<SlotIndexes
>();
269 au
.addPreserved
<SlotIndexes
>();
270 au
.addRequired
<LiveIntervals
>();
271 au
.addPreserved
<LiveIntervals
>();
272 MachineFunctionPass::getAnalysisUsage(au
);
275 bool LoopSplitter::runOnMachineFunction(MachineFunction
&fn
) {
278 mri
= &mf
->getRegInfo();
279 tii
= mf
->getTarget().getInstrInfo();
280 tri
= mf
->getTarget().getRegisterInfo();
281 sis
= &getAnalysis
<SlotIndexes
>();
282 lis
= &getAnalysis
<LiveIntervals
>();
283 mli
= &getAnalysis
<MachineLoopInfo
>();
284 mdt
= &getAnalysis
<MachineDominatorTree
>();
286 fqn
= mf
->getFunction()->getParent()->getModuleIdentifier() + "." +
287 mf
->getFunction()->getName().str();
289 dbgs() << "Splitting " << mf
->getFunction()->getName() << ".";
291 dumpOddTerminators();
293 // dbgs() << "----------------------------------------\n";
295 // dbgs() << "----------------------------------------\n";
297 // std::deque<MachineLoop*> loops;
298 // std::copy(mli->begin(), mli->end(), std::back_inserter(loops));
299 // dbgs() << "Loops:\n";
300 // while (!loops.empty()) {
301 // MachineLoop &loop = *loops.front();
302 // loops.pop_front();
303 // std::copy(loop.begin(), loop.end(), std::back_inserter(loops));
305 // dumpLoopInfo(loop);
311 // Setup initial intervals.
312 for (LiveIntervals::iterator liItr
= lis
->begin(), liEnd
= lis
->end();
313 liItr
!= liEnd
; ++liItr
) {
314 LiveInterval
*li
= liItr
->second
;
316 if (TargetRegisterInfo::isVirtualRegister(li
->reg
) &&
317 !lis
->intervalIsInOneMBB(*li
)) {
318 intervals
.push_back(li
);
326 // dbgs() << "----------------------------------------\n";
328 // dbgs() << "----------------------------------------\n";
330 dumpOddTerminators();
337 void LoopSplitter::releaseMemory() {
340 loopRangeMap
.clear();
343 void LoopSplitter::dumpOddTerminators() {
344 for (MachineFunction::iterator bbItr
= mf
->begin(), bbEnd
= mf
->end();
345 bbItr
!= bbEnd
; ++bbItr
) {
346 MachineBasicBlock
*mbb
= &*bbItr
;
347 MachineBasicBlock
*a
= 0, *b
= 0;
348 SmallVector
<MachineOperand
, 4> c
;
349 if (tii
->AnalyzeBranch(*mbb
, a
, b
, c
)) {
350 dbgs() << "MBB#" << mbb
->getNumber() << " has multiway terminator.\n";
351 dbgs() << " Terminators:\n";
352 for (MachineBasicBlock::iterator iItr
= mbb
->begin(), iEnd
= mbb
->end();
353 iItr
!= iEnd
; ++iItr
) {
354 MachineInstr
*instr
= &*iItr
;
355 dbgs() << " " << *instr
<< "";
357 dbgs() << "\n Listed successors: [ ";
358 for (MachineBasicBlock::succ_iterator sItr
= mbb
->succ_begin(), sEnd
= mbb
->succ_end();
359 sItr
!= sEnd
; ++sItr
) {
360 MachineBasicBlock
*succMBB
= *sItr
;
361 dbgs() << succMBB
->getNumber() << " ";
368 void LoopSplitter::dumpLoopInfo(MachineLoop
&loop
) {
369 MachineBasicBlock
&headerBlock
= *loop
.getHeader();
370 typedef SmallVector
<MachineLoop::Edge
, 8> ExitEdgesList
;
371 ExitEdgesList exitEdges
;
372 loop
.getExitEdges(exitEdges
);
374 dbgs() << " Header: BB#" << headerBlock
.getNumber() << ", Contains: [ ";
375 for (std::vector
<MachineBasicBlock
*>::const_iterator
376 subBlockItr
= loop
.getBlocks().begin(),
377 subBlockEnd
= loop
.getBlocks().end();
378 subBlockItr
!= subBlockEnd
; ++subBlockItr
) {
379 MachineBasicBlock
&subBlock
= **subBlockItr
;
380 dbgs() << "BB#" << subBlock
.getNumber() << " ";
382 dbgs() << "], Exit edges: [ ";
383 for (ExitEdgesList::iterator exitEdgeItr
= exitEdges
.begin(),
384 exitEdgeEnd
= exitEdges
.end();
385 exitEdgeItr
!= exitEdgeEnd
; ++exitEdgeItr
) {
386 MachineLoop::Edge
&exitEdge
= *exitEdgeItr
;
387 dbgs() << "(MBB#" << exitEdge
.first
->getNumber()
388 << ", MBB#" << exitEdge
.second
->getNumber() << ") ";
390 dbgs() << "], Sub-Loop Headers: [ ";
391 for (MachineLoop::iterator subLoopItr
= loop
.begin(),
392 subLoopEnd
= loop
.end();
393 subLoopItr
!= subLoopEnd
; ++subLoopItr
) {
394 MachineLoop
&subLoop
= **subLoopItr
;
395 MachineBasicBlock
&subLoopBlock
= *subLoop
.getHeader();
396 dbgs() << "BB#" << subLoopBlock
.getNumber() << " ";
401 void LoopSplitter::updateTerminators(MachineBasicBlock
&mbb
) {
402 mbb
.updateTerminator();
404 for (MachineBasicBlock::iterator miItr
= mbb
.begin(), miEnd
= mbb
.end();
405 miItr
!= miEnd
; ++miItr
) {
406 if (lis
->isNotInMIMap(miItr
)) {
407 lis
->InsertMachineInstrInMaps(miItr
);
412 bool LoopSplitter::canInsertPreHeader(MachineLoop
&loop
) {
413 MachineBasicBlock
*header
= loop
.getHeader();
414 MachineBasicBlock
*a
= 0, *b
= 0;
415 SmallVector
<MachineOperand
, 4> c
;
417 for (MachineBasicBlock::pred_iterator pbItr
= header
->pred_begin(),
418 pbEnd
= header
->pred_end();
419 pbItr
!= pbEnd
; ++pbItr
) {
420 MachineBasicBlock
*predBlock
= *pbItr
;
421 if (!!tii
->AnalyzeBranch(*predBlock
, a
, b
, c
)) {
426 MachineFunction::iterator
headerItr(header
);
427 if (headerItr
== mf
->begin())
429 MachineBasicBlock
*headerLayoutPred
= llvm::prior(headerItr
);
430 assert(headerLayoutPred
!= 0 && "Header should have layout pred.");
432 return (!tii
->AnalyzeBranch(*headerLayoutPred
, a
, b
, c
));
435 MachineBasicBlock
& LoopSplitter::insertPreHeader(MachineLoop
&loop
) {
436 assert(loop
.getLoopPreheader() == 0 && "Loop already has preheader.");
438 MachineBasicBlock
&header
= *loop
.getHeader();
440 // Save the preds - we'll need to update them once we insert the preheader.
441 typedef std::set
<MachineBasicBlock
*> HeaderPreds
;
442 HeaderPreds headerPreds
;
444 for (MachineBasicBlock::pred_iterator predItr
= header
.pred_begin(),
445 predEnd
= header
.pred_end();
446 predItr
!= predEnd
; ++predItr
) {
447 if (!loop
.contains(*predItr
))
448 headerPreds
.insert(*predItr
);
451 assert(!headerPreds
.empty() && "No predecessors for header?");
453 //dbgs() << fqn << " MBB#" << header.getNumber() << " inserting preheader...";
455 MachineBasicBlock
*preHeader
=
456 mf
->CreateMachineBasicBlock(header
.getBasicBlock());
458 assert(preHeader
!= 0 && "Failed to create pre-header.");
460 mf
->insert(header
, preHeader
);
462 for (HeaderPreds::iterator hpItr
= headerPreds
.begin(),
463 hpEnd
= headerPreds
.end();
464 hpItr
!= hpEnd
; ++hpItr
) {
465 assert(*hpItr
!= 0 && "How'd a null predecessor get into this set?");
466 MachineBasicBlock
&hp
= **hpItr
;
467 hp
.ReplaceUsesOfBlockWith(&header
, preHeader
);
469 preHeader
->addSuccessor(&header
);
471 MachineBasicBlock
*oldLayoutPred
=
472 llvm::prior(MachineFunction::iterator(preHeader
));
473 if (oldLayoutPred
!= 0) {
474 updateTerminators(*oldLayoutPred
);
477 lis
->InsertMBBInMaps(preHeader
);
479 if (MachineLoop
*parentLoop
= loop
.getParentLoop()) {
480 assert(parentLoop
->getHeader() != loop
.getHeader() &&
481 "Parent loop has same header?");
482 parentLoop
->addBasicBlockToLoop(preHeader
, mli
->getBase());
484 // Invalidate all parent loop ranges.
485 while (parentLoop
!= 0) {
486 loopRangeMap
.erase(parentLoop
);
487 parentLoop
= parentLoop
->getParentLoop();
491 for (LiveIntervals::iterator liItr
= lis
->begin(),
493 liItr
!= liEnd
; ++liItr
) {
494 LiveInterval
&li
= *liItr
->second
;
496 // Is this safe for physregs?
497 // TargetRegisterInfo::isPhysicalRegister(li.reg) ||
498 if (!lis
->isLiveInToMBB(li
, &header
))
501 if (lis
->isLiveInToMBB(li
, preHeader
)) {
502 assert(lis
->isLiveOutOfMBB(li
, preHeader
) &&
503 "Range terminates in newly added preheader?");
507 bool insertRange
= false;
509 for (MachineBasicBlock::pred_iterator predItr
= preHeader
->pred_begin(),
510 predEnd
= preHeader
->pred_end();
511 predItr
!= predEnd
; ++predItr
) {
512 MachineBasicBlock
*predMBB
= *predItr
;
513 if (lis
->isLiveOutOfMBB(li
, predMBB
)) {
522 SlotIndex newDefIdx
= lis
->getMBBStartIdx(preHeader
);
523 assert(lis
->getInstructionFromIndex(newDefIdx
) == 0 &&
524 "PHI def index points at actual instruction.");
525 VNInfo
*newVal
= li
.getNextValue(newDefIdx
, 0, lis
->getVNInfoAllocator());
526 li
.addRange(LiveRange(lis
->getMBBStartIdx(preHeader
),
527 lis
->getMBBEndIdx(preHeader
),
532 //dbgs() << "Dumping SlotIndexes:\n";
535 //dbgs() << "done. (Added MBB#" << preHeader->getNumber() << ")\n";
540 bool LoopSplitter::isCriticalEdge(MachineLoop::Edge
&edge
) {
541 assert(edge
.first
->succ_size() > 1 && "Non-sensical edge.");
542 if (edge
.second
->pred_size() > 1)
547 bool LoopSplitter::canSplitEdge(MachineLoop::Edge
&edge
) {
548 MachineFunction::iterator
outBlockItr(edge
.second
);
549 if (outBlockItr
== mf
->begin())
551 MachineBasicBlock
*outBlockLayoutPred
= llvm::prior(outBlockItr
);
552 assert(outBlockLayoutPred
!= 0 && "Should have a layout pred if out!=begin.");
553 MachineBasicBlock
*a
= 0, *b
= 0;
554 SmallVector
<MachineOperand
, 4> c
;
555 return (!tii
->AnalyzeBranch(*outBlockLayoutPred
, a
, b
, c
) &&
556 !tii
->AnalyzeBranch(*edge
.first
, a
, b
, c
));
559 MachineBasicBlock
& LoopSplitter::splitEdge(MachineLoop::Edge
&edge
,
562 MachineBasicBlock
&inBlock
= *edge
.first
;
563 MachineBasicBlock
&outBlock
= *edge
.second
;
565 assert((inBlock
.succ_size() > 1) && (outBlock
.pred_size() > 1) &&
566 "Splitting non-critical edge?");
568 //dbgs() << fqn << " Splitting edge (MBB#" << inBlock.getNumber()
569 // << " -> MBB#" << outBlock.getNumber() << ")...";
571 MachineBasicBlock
*splitBlock
=
572 mf
->CreateMachineBasicBlock();
574 assert(splitBlock
!= 0 && "Failed to create split block.");
576 mf
->insert(&outBlock
, splitBlock
);
578 inBlock
.ReplaceUsesOfBlockWith(&outBlock
, splitBlock
);
579 splitBlock
->addSuccessor(&outBlock
);
581 MachineBasicBlock
*oldLayoutPred
=
582 llvm::prior(MachineFunction::iterator(splitBlock
));
583 if (oldLayoutPred
!= 0) {
584 updateTerminators(*oldLayoutPred
);
587 lis
->InsertMBBInMaps(splitBlock
);
589 loopRangeMap
.erase(&loop
);
591 MachineLoop
*splitParentLoop
= loop
.getParentLoop();
592 while (splitParentLoop
!= 0 &&
593 !splitParentLoop
->contains(&outBlock
)) {
594 splitParentLoop
= splitParentLoop
->getParentLoop();
597 if (splitParentLoop
!= 0) {
598 assert(splitParentLoop
->contains(&loop
) &&
599 "Split-block parent doesn't contain original loop?");
600 splitParentLoop
->addBasicBlockToLoop(splitBlock
, mli
->getBase());
602 // Invalidate all parent loop ranges.
603 while (splitParentLoop
!= 0) {
604 loopRangeMap
.erase(splitParentLoop
);
605 splitParentLoop
= splitParentLoop
->getParentLoop();
610 for (LiveIntervals::iterator liItr
= lis
->begin(),
612 liItr
!= liEnd
; ++liItr
) {
613 LiveInterval
&li
= *liItr
->second
;
614 bool intersects
= lis
->isLiveOutOfMBB(li
, &inBlock
) &&
615 lis
->isLiveInToMBB(li
, &outBlock
);
616 if (lis
->isLiveInToMBB(li
, splitBlock
)) {
618 li
.removeRange(lis
->getMBBStartIdx(splitBlock
),
619 lis
->getMBBEndIdx(splitBlock
), true);
621 } else if (intersects
) {
622 SlotIndex newDefIdx
= lis
->getMBBStartIdx(splitBlock
);
623 assert(lis
->getInstructionFromIndex(newDefIdx
) == 0 &&
624 "PHI def index points at actual instruction.");
625 VNInfo
*newVal
= li
.getNextValue(newDefIdx
, 0,
626 lis
->getVNInfoAllocator());
627 li
.addRange(LiveRange(lis
->getMBBStartIdx(splitBlock
),
628 lis
->getMBBEndIdx(splitBlock
),
633 //dbgs() << "done. (Added MBB#" << splitBlock->getNumber() << ")\n";
638 LoopSplitter::LoopRanges
& LoopSplitter::getLoopRanges(MachineLoop
&loop
) {
639 typedef std::set
<MachineBasicBlock
*, StartSlotComparator
> LoopMBBSet
;
640 LoopRangeMap::iterator lrItr
= loopRangeMap
.find(&loop
);
641 if (lrItr
== loopRangeMap
.end()) {
642 LoopMBBSet
loopMBBs((StartSlotComparator(*lis
)));
643 std::copy(loop
.block_begin(), loop
.block_end(),
644 std::inserter(loopMBBs
, loopMBBs
.begin()));
646 assert(!loopMBBs
.empty() && "No blocks in loop?");
648 LoopRanges
&loopRanges
= loopRangeMap
[&loop
];
649 assert(loopRanges
.empty() && "Loop encountered but not processed?");
650 SlotIndex oldEnd
= lis
->getMBBEndIdx(*loopMBBs
.begin());
651 loopRanges
.push_back(
652 std::make_pair(lis
->getMBBStartIdx(*loopMBBs
.begin()),
653 lis
->getInvalidIndex()));
654 for (LoopMBBSet::iterator curBlockItr
= llvm::next(loopMBBs
.begin()),
655 curBlockEnd
= loopMBBs
.end();
656 curBlockItr
!= curBlockEnd
; ++curBlockItr
) {
657 SlotIndex newStart
= lis
->getMBBStartIdx(*curBlockItr
);
658 if (newStart
!= oldEnd
) {
659 loopRanges
.back().second
= oldEnd
;
660 loopRanges
.push_back(std::make_pair(newStart
,
661 lis
->getInvalidIndex()));
663 oldEnd
= lis
->getMBBEndIdx(*curBlockItr
);
666 loopRanges
.back().second
=
667 lis
->getMBBEndIdx(*llvm::prior(loopMBBs
.end()));
671 return lrItr
->second
;
674 std::pair
<bool, LoopSplitter::SlotPair
> LoopSplitter::getLoopSubRange(
677 LoopRanges
&loopRanges
= getLoopRanges(loop
);
678 LoopRanges::iterator lrItr
= loopRanges
.begin(),
679 lrEnd
= loopRanges
.end();
680 while (lrItr
!= lrEnd
&& lr
.start
>= lrItr
->second
) {
684 if (lrItr
== lrEnd
) {
685 SlotIndex invalid
= lis
->getInvalidIndex();
686 return std::make_pair(false, SlotPair(invalid
, invalid
));
689 SlotIndex
srStart(lr
.start
< lrItr
->first
? lrItr
->first
: lr
.start
);
690 SlotIndex
srEnd(lr
.end
> lrItr
->second
? lrItr
->second
: lr
.end
);
692 return std::make_pair(true, SlotPair(srStart
, srEnd
));
695 void LoopSplitter::dumpLoopRanges(MachineLoop
&loop
) {
696 LoopRanges
&loopRanges
= getLoopRanges(loop
);
697 dbgs() << "For loop MBB#" << loop
.getHeader()->getNumber() << ", subranges are: [ ";
698 for (LoopRanges::iterator lrItr
= loopRanges
.begin(), lrEnd
= loopRanges
.end();
699 lrItr
!= lrEnd
; ++lrItr
) {
700 dbgs() << "[" << lrItr
->first
<< ", " << lrItr
->second
<< ") ";
705 void LoopSplitter::processHeader(LoopSplit
&split
) {
706 MachineBasicBlock
&header
= *split
.getLoop().getHeader();
707 //dbgs() << " Processing loop header BB#" << header.getNumber() << "\n";
709 if (!lis
->isLiveInToMBB(split
.getLI(), &header
))
710 return; // Not live in, but nothing wrong so far.
712 MachineBasicBlock
*preHeader
= split
.getLoop().getLoopPreheader();
715 if (!canInsertPreHeader(split
.getLoop())) {
717 return; // Couldn't insert a pre-header. Bail on this interval.
720 for (MachineBasicBlock::pred_iterator predItr
= header
.pred_begin(),
721 predEnd
= header
.pred_end();
722 predItr
!= predEnd
; ++predItr
) {
723 if (lis
->isLiveOutOfMBB(split
.getLI(), *predItr
)) {
724 split
.splitIncoming();
728 } else if (lis
->isLiveOutOfMBB(split
.getLI(), preHeader
)) {
729 split
.splitIncoming();
733 void LoopSplitter::processLoopExits(LoopSplit
&split
) {
734 typedef SmallVector
<MachineLoop::Edge
, 8> ExitEdgesList
;
735 ExitEdgesList exitEdges
;
736 split
.getLoop().getExitEdges(exitEdges
);
738 //dbgs() << " Processing loop exits:\n";
740 for (ExitEdgesList::iterator exitEdgeItr
= exitEdges
.begin(),
741 exitEdgeEnd
= exitEdges
.end();
742 exitEdgeItr
!= exitEdgeEnd
; ++exitEdgeItr
) {
743 MachineLoop::Edge exitEdge
= *exitEdgeItr
;
745 LiveRange
*outRange
=
746 split
.getLI().getLiveRangeContaining(lis
->getMBBStartIdx(exitEdge
.second
));
749 if (isCriticalEdge(exitEdge
) && !canSplitEdge(exitEdge
)) {
754 split
.splitOutgoing(exitEdge
);
759 void LoopSplitter::processLoopUses(LoopSplit
&split
) {
760 std::set
<MachineInstr
*> processed
;
762 for (MachineRegisterInfo::reg_iterator
763 rItr
= mri
->reg_begin(split
.getLI().reg
),
764 rEnd
= mri
->reg_end();
765 rItr
!= rEnd
; ++rItr
) {
766 MachineInstr
&instr
= *rItr
;
767 if (split
.getLoop().contains(&instr
) && processed
.count(&instr
) == 0) {
768 split
.addLoopInstr(&instr
);
769 processed
.insert(&instr
);
773 //dbgs() << " Rewriting reg" << li.reg << " to reg" << newLI->reg
774 // << " in blocks [ ";
778 bool LoopSplitter::splitOverLoop(LiveInterval
&li
, MachineLoop
&loop
) {
779 assert(TargetRegisterInfo::isVirtualRegister(li
.reg
) &&
780 "Attempt to split physical register.");
782 LoopSplit
split(*this, li
, loop
);
783 processHeader(split
);
785 processLoopExits(split
);
787 processLoopUses(split
);
788 if (split
.isValid() /* && split.isWorthwhile() */) {
790 DEBUG(dbgs() << "Success.\n");
793 DEBUG(dbgs() << "Failed.\n");
797 void LoopSplitter::processInterval(LiveInterval
&li
) {
798 std::deque
<MachineLoop
*> loops
;
799 std::copy(mli
->begin(), mli
->end(), std::back_inserter(loops
));
801 while (!loops
.empty()) {
802 MachineLoop
&loop
= *loops
.front();
805 dbgs() << fqn
<< " reg" << li
.reg
<< " " << li
.weight
<< " BB#"
806 << loop
.getHeader()->getNumber() << " ";
808 if (!splitOverLoop(li
, loop
)) {
809 // Couldn't split over outer loop, schedule sub-loops to be checked.
810 std::copy(loop
.begin(), loop
.end(), std::back_inserter(loops
));
815 void LoopSplitter::processIntervals() {
816 while (!intervals
.empty()) {
817 LiveInterval
&li
= *intervals
.front();
818 intervals
.pop_front();
820 assert(!lis
->intervalIsInOneMBB(li
) &&
821 "Single interval in process worklist.");