1 //===-- LiveIntervalAnalysis.cpp - Live Interval Analysis -----------------===//
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 file implements the LiveInterval analysis pass which is used
11 // by the Linear Scan Register allocator. This pass linearizes the
12 // basic blocks of the function in DFS order and uses the
13 // LiveVariables pass to conservatively compute live intervals for
14 // each virtual and physical register.
16 //===----------------------------------------------------------------------===//
18 #define DEBUG_TYPE "liveintervals"
19 #include "llvm/CodeGen/LiveIntervalAnalysis.h"
20 #include "VirtRegMap.h"
21 #include "llvm/Value.h"
22 #include "llvm/Analysis/AliasAnalysis.h"
23 #include "llvm/CodeGen/LiveVariables.h"
24 #include "llvm/CodeGen/MachineFrameInfo.h"
25 #include "llvm/CodeGen/MachineInstr.h"
26 #include "llvm/CodeGen/MachineLoopInfo.h"
27 #include "llvm/CodeGen/MachineRegisterInfo.h"
28 #include "llvm/CodeGen/Passes.h"
29 #include "llvm/CodeGen/PseudoSourceValue.h"
30 #include "llvm/Target/TargetRegisterInfo.h"
31 #include "llvm/Target/TargetInstrInfo.h"
32 #include "llvm/Target/TargetMachine.h"
33 #include "llvm/Target/TargetOptions.h"
34 #include "llvm/Support/CommandLine.h"
35 #include "llvm/Support/Debug.h"
36 #include "llvm/ADT/Statistic.h"
37 #include "llvm/ADT/STLExtras.h"
42 // Hidden options for help debugging.
43 static cl::opt
<bool> DisableReMat("disable-rematerialization",
44 cl::init(false), cl::Hidden
);
46 static cl::opt
<bool> SplitAtBB("split-intervals-at-bb",
47 cl::init(true), cl::Hidden
);
48 static cl::opt
<int> SplitLimit("split-limit",
49 cl::init(-1), cl::Hidden
);
51 static cl::opt
<bool> EnableAggressiveRemat("aggressive-remat", cl::Hidden
);
53 static cl::opt
<bool> EnableFastSpilling("fast-spill",
54 cl::init(false), cl::Hidden
);
56 STATISTIC(numIntervals
, "Number of original intervals");
57 STATISTIC(numFolds
, "Number of loads/stores folded into instructions");
58 STATISTIC(numSplits
, "Number of intervals split");
60 char LiveIntervals::ID
= 0;
61 static RegisterPass
<LiveIntervals
> X("liveintervals", "Live Interval Analysis");
63 void LiveIntervals::getAnalysisUsage(AnalysisUsage
&AU
) const {
64 AU
.addRequired
<AliasAnalysis
>();
65 AU
.addPreserved
<AliasAnalysis
>();
66 AU
.addPreserved
<LiveVariables
>();
67 AU
.addRequired
<LiveVariables
>();
68 AU
.addPreservedID(MachineLoopInfoID
);
69 AU
.addPreservedID(MachineDominatorsID
);
72 AU
.addPreservedID(PHIEliminationID
);
73 AU
.addRequiredID(PHIEliminationID
);
76 AU
.addRequiredID(TwoAddressInstructionPassID
);
77 MachineFunctionPass::getAnalysisUsage(AU
);
80 void LiveIntervals::releaseMemory() {
81 // Free the live intervals themselves.
82 for (DenseMap
<unsigned, LiveInterval
*>::iterator I
= r2iMap_
.begin(),
83 E
= r2iMap_
.end(); I
!= E
; ++I
)
91 // Release VNInfo memroy regions after all VNInfo objects are dtor'd.
92 VNInfoAllocator
.Reset();
93 while (!ClonedMIs
.empty()) {
94 MachineInstr
*MI
= ClonedMIs
.back();
96 mf_
->DeleteMachineInstr(MI
);
100 void LiveIntervals::computeNumbering() {
101 Index2MiMap OldI2MI
= i2miMap_
;
102 std::vector
<IdxMBBPair
> OldI2MBB
= Idx2MBBMap
;
111 // Number MachineInstrs and MachineBasicBlocks.
112 // Initialize MBB indexes to a sentinal.
113 MBB2IdxMap
.resize(mf_
->getNumBlockIDs(), std::make_pair(~0U,~0U));
115 unsigned MIIndex
= 0;
116 for (MachineFunction::iterator MBB
= mf_
->begin(), E
= mf_
->end();
118 unsigned StartIdx
= MIIndex
;
120 // Insert an empty slot at the beginning of each block.
121 MIIndex
+= InstrSlots::NUM
;
122 i2miMap_
.push_back(0);
124 for (MachineBasicBlock::iterator I
= MBB
->begin(), E
= MBB
->end();
126 bool inserted
= mi2iMap_
.insert(std::make_pair(I
, MIIndex
)).second
;
127 assert(inserted
&& "multiple MachineInstr -> index mappings");
129 i2miMap_
.push_back(I
);
130 MIIndex
+= InstrSlots::NUM
;
133 // Insert max(1, numdefs) empty slots after every instruction.
134 unsigned Slots
= I
->getDesc().getNumDefs();
137 MIIndex
+= InstrSlots::NUM
* Slots
;
139 i2miMap_
.push_back(0);
142 // Set the MBB2IdxMap entry for this MBB.
143 MBB2IdxMap
[MBB
->getNumber()] = std::make_pair(StartIdx
, MIIndex
- 1);
144 Idx2MBBMap
.push_back(std::make_pair(StartIdx
, MBB
));
146 std::sort(Idx2MBBMap
.begin(), Idx2MBBMap
.end(), Idx2MBBCompare());
148 if (!OldI2MI
.empty())
149 for (iterator OI
= begin(), OE
= end(); OI
!= OE
; ++OI
) {
150 for (LiveInterval::iterator LI
= OI
->second
->begin(),
151 LE
= OI
->second
->end(); LI
!= LE
; ++LI
) {
153 // Remap the start index of the live range to the corresponding new
154 // number, or our best guess at what it _should_ correspond to if the
155 // original instruction has been erased. This is either the following
156 // instruction or its predecessor.
157 unsigned index
= LI
->start
/ InstrSlots::NUM
;
158 unsigned offset
= LI
->start
% InstrSlots::NUM
;
159 if (offset
== InstrSlots::LOAD
) {
160 std::vector
<IdxMBBPair
>::const_iterator I
=
161 std::lower_bound(OldI2MBB
.begin(), OldI2MBB
.end(), LI
->start
);
162 // Take the pair containing the index
163 std::vector
<IdxMBBPair
>::const_iterator J
=
164 (I
== OldI2MBB
.end() && OldI2MBB
.size()>0) ? (I
-1): I
;
166 LI
->start
= getMBBStartIdx(J
->second
);
168 LI
->start
= mi2iMap_
[OldI2MI
[index
]] + offset
;
171 // Remap the ending index in the same way that we remapped the start,
172 // except for the final step where we always map to the immediately
173 // following instruction.
174 index
= (LI
->end
- 1) / InstrSlots::NUM
;
175 offset
= LI
->end
% InstrSlots::NUM
;
176 if (offset
== InstrSlots::LOAD
) {
177 // VReg dies at end of block.
178 std::vector
<IdxMBBPair
>::const_iterator I
=
179 std::lower_bound(OldI2MBB
.begin(), OldI2MBB
.end(), LI
->end
);
182 LI
->end
= getMBBEndIdx(I
->second
) + 1;
184 unsigned idx
= index
;
185 while (index
< OldI2MI
.size() && !OldI2MI
[index
]) ++index
;
187 if (index
!= OldI2MI
.size())
188 LI
->end
= mi2iMap_
[OldI2MI
[index
]] + (idx
== index
? offset
: 0);
190 LI
->end
= InstrSlots::NUM
* i2miMap_
.size();
194 for (LiveInterval::vni_iterator VNI
= OI
->second
->vni_begin(),
195 VNE
= OI
->second
->vni_end(); VNI
!= VNE
; ++VNI
) {
198 // Remap the VNInfo def index, which works the same as the
199 // start indices above. VN's with special sentinel defs
200 // don't need to be remapped.
201 if (vni
->def
!= ~0U && vni
->def
!= ~1U) {
202 unsigned index
= vni
->def
/ InstrSlots::NUM
;
203 unsigned offset
= vni
->def
% InstrSlots::NUM
;
204 if (offset
== InstrSlots::LOAD
) {
205 std::vector
<IdxMBBPair
>::const_iterator I
=
206 std::lower_bound(OldI2MBB
.begin(), OldI2MBB
.end(), vni
->def
);
207 // Take the pair containing the index
208 std::vector
<IdxMBBPair
>::const_iterator J
=
209 (I
== OldI2MBB
.end() && OldI2MBB
.size()>0) ? (I
-1): I
;
211 vni
->def
= getMBBStartIdx(J
->second
);
213 vni
->def
= mi2iMap_
[OldI2MI
[index
]] + offset
;
217 // Remap the VNInfo kill indices, which works the same as
218 // the end indices above.
219 for (size_t i
= 0; i
< vni
->kills
.size(); ++i
) {
220 // PHI kills don't need to be remapped.
221 if (!vni
->kills
[i
]) continue;
223 unsigned index
= (vni
->kills
[i
]-1) / InstrSlots::NUM
;
224 unsigned offset
= vni
->kills
[i
] % InstrSlots::NUM
;
225 if (offset
== InstrSlots::LOAD
) {
226 std::vector
<IdxMBBPair
>::const_iterator I
=
227 std::lower_bound(OldI2MBB
.begin(), OldI2MBB
.end(), vni
->kills
[i
]);
230 vni
->kills
[i
] = getMBBEndIdx(I
->second
);
232 unsigned idx
= index
;
233 while (index
< OldI2MI
.size() && !OldI2MI
[index
]) ++index
;
235 if (index
!= OldI2MI
.size())
236 vni
->kills
[i
] = mi2iMap_
[OldI2MI
[index
]] +
237 (idx
== index
? offset
: 0);
239 vni
->kills
[i
] = InstrSlots::NUM
* i2miMap_
.size();
246 /// runOnMachineFunction - Register allocate the whole function
248 bool LiveIntervals::runOnMachineFunction(MachineFunction
&fn
) {
250 mri_
= &mf_
->getRegInfo();
251 tm_
= &fn
.getTarget();
252 tri_
= tm_
->getRegisterInfo();
253 tii_
= tm_
->getInstrInfo();
254 aa_
= &getAnalysis
<AliasAnalysis
>();
255 lv_
= &getAnalysis
<LiveVariables
>();
256 allocatableRegs_
= tri_
->getAllocatableSet(fn
);
261 numIntervals
+= getNumIntervals();
267 /// print - Implement the dump method.
268 void LiveIntervals::print(std::ostream
&O
, const Module
* ) const {
269 O
<< "********** INTERVALS **********\n";
270 for (const_iterator I
= begin(), E
= end(); I
!= E
; ++I
) {
271 I
->second
->print(O
, tri_
);
275 O
<< "********** MACHINEINSTRS **********\n";
276 for (MachineFunction::iterator mbbi
= mf_
->begin(), mbbe
= mf_
->end();
277 mbbi
!= mbbe
; ++mbbi
) {
278 O
<< ((Value
*)mbbi
->getBasicBlock())->getName() << ":\n";
279 for (MachineBasicBlock::iterator mii
= mbbi
->begin(),
280 mie
= mbbi
->end(); mii
!= mie
; ++mii
) {
281 O
<< getInstructionIndex(mii
) << '\t' << *mii
;
286 /// conflictsWithPhysRegDef - Returns true if the specified register
287 /// is defined during the duration of the specified interval.
288 bool LiveIntervals::conflictsWithPhysRegDef(const LiveInterval
&li
,
289 VirtRegMap
&vrm
, unsigned reg
) {
290 for (LiveInterval::Ranges::const_iterator
291 I
= li
.ranges
.begin(), E
= li
.ranges
.end(); I
!= E
; ++I
) {
292 for (unsigned index
= getBaseIndex(I
->start
),
293 end
= getBaseIndex(I
->end
-1) + InstrSlots::NUM
; index
!= end
;
294 index
+= InstrSlots::NUM
) {
295 // skip deleted instructions
296 while (index
!= end
&& !getInstructionFromIndex(index
))
297 index
+= InstrSlots::NUM
;
298 if (index
== end
) break;
300 MachineInstr
*MI
= getInstructionFromIndex(index
);
301 unsigned SrcReg
, DstReg
, SrcSubReg
, DstSubReg
;
302 if (tii_
->isMoveInstr(*MI
, SrcReg
, DstReg
, SrcSubReg
, DstSubReg
))
303 if (SrcReg
== li
.reg
|| DstReg
== li
.reg
)
305 for (unsigned i
= 0; i
!= MI
->getNumOperands(); ++i
) {
306 MachineOperand
& mop
= MI
->getOperand(i
);
309 unsigned PhysReg
= mop
.getReg();
310 if (PhysReg
== 0 || PhysReg
== li
.reg
)
312 if (TargetRegisterInfo::isVirtualRegister(PhysReg
)) {
313 if (!vrm
.hasPhys(PhysReg
))
315 PhysReg
= vrm
.getPhys(PhysReg
);
317 if (PhysReg
&& tri_
->regsOverlap(PhysReg
, reg
))
326 /// conflictsWithPhysRegRef - Similar to conflictsWithPhysRegRef except
327 /// it can check use as well.
328 bool LiveIntervals::conflictsWithPhysRegRef(LiveInterval
&li
,
329 unsigned Reg
, bool CheckUse
,
330 SmallPtrSet
<MachineInstr
*,32> &JoinedCopies
) {
331 for (LiveInterval::Ranges::const_iterator
332 I
= li
.ranges
.begin(), E
= li
.ranges
.end(); I
!= E
; ++I
) {
333 for (unsigned index
= getBaseIndex(I
->start
),
334 end
= getBaseIndex(I
->end
-1) + InstrSlots::NUM
; index
!= end
;
335 index
+= InstrSlots::NUM
) {
336 // Skip deleted instructions.
337 MachineInstr
*MI
= 0;
338 while (index
!= end
) {
339 MI
= getInstructionFromIndex(index
);
342 index
+= InstrSlots::NUM
;
344 if (index
== end
) break;
346 if (JoinedCopies
.count(MI
))
348 for (unsigned i
= 0, e
= MI
->getNumOperands(); i
!= e
; ++i
) {
349 MachineOperand
& MO
= MI
->getOperand(i
);
352 if (MO
.isUse() && !CheckUse
)
354 unsigned PhysReg
= MO
.getReg();
355 if (PhysReg
== 0 || TargetRegisterInfo::isVirtualRegister(PhysReg
))
357 if (tri_
->isSubRegister(Reg
, PhysReg
))
367 void LiveIntervals::printRegName(unsigned reg
) const {
368 if (TargetRegisterInfo::isPhysicalRegister(reg
))
369 cerr
<< tri_
->getName(reg
);
371 cerr
<< "%reg" << reg
;
374 void LiveIntervals::handleVirtualRegisterDef(MachineBasicBlock
*mbb
,
375 MachineBasicBlock::iterator mi
,
376 unsigned MIIdx
, MachineOperand
& MO
,
378 LiveInterval
&interval
) {
379 DOUT
<< "\t\tregister: "; DEBUG(printRegName(interval
.reg
));
380 LiveVariables::VarInfo
& vi
= lv_
->getVarInfo(interval
.reg
);
382 if (mi
->getOpcode() == TargetInstrInfo::IMPLICIT_DEF
) {
383 DOUT
<< "is a implicit_def\n";
387 // Virtual registers may be defined multiple times (due to phi
388 // elimination and 2-addr elimination). Much of what we do only has to be
389 // done once for the vreg. We use an empty interval to detect the first
390 // time we see a vreg.
391 if (interval
.empty()) {
392 // Get the Idx of the defining instructions.
393 unsigned defIndex
= getDefIndex(MIIdx
);
394 // Earlyclobbers move back one.
395 if (MO
.isEarlyClobber())
396 defIndex
= getUseIndex(MIIdx
);
398 MachineInstr
*CopyMI
= NULL
;
399 unsigned SrcReg
, DstReg
, SrcSubReg
, DstSubReg
;
400 if (mi
->getOpcode() == TargetInstrInfo::EXTRACT_SUBREG
||
401 mi
->getOpcode() == TargetInstrInfo::INSERT_SUBREG
||
402 mi
->getOpcode() == TargetInstrInfo::SUBREG_TO_REG
||
403 tii_
->isMoveInstr(*mi
, SrcReg
, DstReg
, SrcSubReg
, DstSubReg
))
405 // Earlyclobbers move back one.
406 ValNo
= interval
.getNextValue(defIndex
, CopyMI
, VNInfoAllocator
);
408 assert(ValNo
->id
== 0 && "First value in interval is not 0?");
410 // Loop over all of the blocks that the vreg is defined in. There are
411 // two cases we have to handle here. The most common case is a vreg
412 // whose lifetime is contained within a basic block. In this case there
413 // will be a single kill, in MBB, which comes after the definition.
414 if (vi
.Kills
.size() == 1 && vi
.Kills
[0]->getParent() == mbb
) {
415 // FIXME: what about dead vars?
417 if (vi
.Kills
[0] != mi
)
418 killIdx
= getUseIndex(getInstructionIndex(vi
.Kills
[0]))+1;
420 killIdx
= defIndex
+1;
422 // If the kill happens after the definition, we have an intra-block
424 if (killIdx
> defIndex
) {
425 assert(vi
.AliveBlocks
.none() &&
426 "Shouldn't be alive across any blocks!");
427 LiveRange
LR(defIndex
, killIdx
, ValNo
);
428 interval
.addRange(LR
);
429 DOUT
<< " +" << LR
<< "\n";
430 interval
.addKill(ValNo
, killIdx
);
435 // The other case we handle is when a virtual register lives to the end
436 // of the defining block, potentially live across some blocks, then is
437 // live into some number of blocks, but gets killed. Start by adding a
438 // range that goes from this definition to the end of the defining block.
439 LiveRange
NewLR(defIndex
, getMBBEndIdx(mbb
)+1, ValNo
);
440 DOUT
<< " +" << NewLR
;
441 interval
.addRange(NewLR
);
443 // Iterate over all of the blocks that the variable is completely
444 // live in, adding [insrtIndex(begin), instrIndex(end)+4) to the
446 for (int i
= vi
.AliveBlocks
.find_first(); i
!= -1;
447 i
= vi
.AliveBlocks
.find_next(i
)) {
448 LiveRange
LR(getMBBStartIdx(i
),
449 getMBBEndIdx(i
)+1, // MBB ends at -1.
451 interval
.addRange(LR
);
455 // Finally, this virtual register is live from the start of any killing
456 // block to the 'use' slot of the killing instruction.
457 for (unsigned i
= 0, e
= vi
.Kills
.size(); i
!= e
; ++i
) {
458 MachineInstr
*Kill
= vi
.Kills
[i
];
459 unsigned killIdx
= getUseIndex(getInstructionIndex(Kill
))+1;
460 LiveRange
LR(getMBBStartIdx(Kill
->getParent()),
462 interval
.addRange(LR
);
463 interval
.addKill(ValNo
, killIdx
);
468 // If this is the second time we see a virtual register definition, it
469 // must be due to phi elimination or two addr elimination. If this is
470 // the result of two address elimination, then the vreg is one of the
471 // def-and-use register operand.
472 if (mi
->isRegTiedToUseOperand(MOIdx
)) {
473 // If this is a two-address definition, then we have already processed
474 // the live range. The only problem is that we didn't realize there
475 // are actually two values in the live interval. Because of this we
476 // need to take the LiveRegion that defines this register and split it
478 assert(interval
.containsOneValue());
479 unsigned DefIndex
= getDefIndex(interval
.getValNumInfo(0)->def
);
480 unsigned RedefIndex
= getDefIndex(MIIdx
);
481 if (MO
.isEarlyClobber())
482 RedefIndex
= getUseIndex(MIIdx
);
484 const LiveRange
*OldLR
= interval
.getLiveRangeContaining(RedefIndex
-1);
485 VNInfo
*OldValNo
= OldLR
->valno
;
487 // Delete the initial value, which should be short and continuous,
488 // because the 2-addr copy must be in the same MBB as the redef.
489 interval
.removeRange(DefIndex
, RedefIndex
);
491 // Two-address vregs should always only be redefined once. This means
492 // that at this point, there should be exactly one value number in it.
493 assert(interval
.containsOneValue() && "Unexpected 2-addr liveint!");
495 // The new value number (#1) is defined by the instruction we claimed
497 VNInfo
*ValNo
= interval
.getNextValue(OldValNo
->def
, OldValNo
->copy
,
500 // Value#0 is now defined by the 2-addr instruction.
501 OldValNo
->def
= RedefIndex
;
503 if (MO
.isEarlyClobber())
504 OldValNo
->redefByEC
= true;
506 // Add the new live interval which replaces the range for the input copy.
507 LiveRange
LR(DefIndex
, RedefIndex
, ValNo
);
508 DOUT
<< " replace range with " << LR
;
509 interval
.addRange(LR
);
510 interval
.addKill(ValNo
, RedefIndex
);
512 // If this redefinition is dead, we need to add a dummy unit live
513 // range covering the def slot.
515 interval
.addRange(LiveRange(RedefIndex
, RedefIndex
+1, OldValNo
));
518 interval
.print(DOUT
, tri_
);
521 // Otherwise, this must be because of phi elimination. If this is the
522 // first redefinition of the vreg that we have seen, go back and change
523 // the live range in the PHI block to be a different value number.
524 if (interval
.containsOneValue()) {
525 assert(vi
.Kills
.size() == 1 &&
526 "PHI elimination vreg should have one kill, the PHI itself!");
528 // Remove the old range that we now know has an incorrect number.
529 VNInfo
*VNI
= interval
.getValNumInfo(0);
530 MachineInstr
*Killer
= vi
.Kills
[0];
531 unsigned Start
= getMBBStartIdx(Killer
->getParent());
532 unsigned End
= getUseIndex(getInstructionIndex(Killer
))+1;
533 DOUT
<< " Removing [" << Start
<< "," << End
<< "] from: ";
534 interval
.print(DOUT
, tri_
); DOUT
<< "\n";
535 interval
.removeRange(Start
, End
);
536 VNI
->hasPHIKill
= true;
537 DOUT
<< " RESULT: "; interval
.print(DOUT
, tri_
);
539 // Replace the interval with one of a NEW value number. Note that this
540 // value number isn't actually defined by an instruction, weird huh? :)
541 LiveRange
LR(Start
, End
, interval
.getNextValue(~0, 0, VNInfoAllocator
));
542 DOUT
<< " replace range with " << LR
;
543 interval
.addRange(LR
);
544 interval
.addKill(LR
.valno
, End
);
545 DOUT
<< " RESULT: "; interval
.print(DOUT
, tri_
);
548 // In the case of PHI elimination, each variable definition is only
549 // live until the end of the block. We've already taken care of the
550 // rest of the live range.
551 unsigned defIndex
= getDefIndex(MIIdx
);
552 if (MO
.isEarlyClobber())
553 defIndex
= getUseIndex(MIIdx
);
556 MachineInstr
*CopyMI
= NULL
;
557 unsigned SrcReg
, DstReg
, SrcSubReg
, DstSubReg
;
558 if (mi
->getOpcode() == TargetInstrInfo::EXTRACT_SUBREG
||
559 mi
->getOpcode() == TargetInstrInfo::INSERT_SUBREG
||
560 mi
->getOpcode() == TargetInstrInfo::SUBREG_TO_REG
||
561 tii_
->isMoveInstr(*mi
, SrcReg
, DstReg
, SrcSubReg
, DstSubReg
))
563 ValNo
= interval
.getNextValue(defIndex
, CopyMI
, VNInfoAllocator
);
565 unsigned killIndex
= getMBBEndIdx(mbb
) + 1;
566 LiveRange
LR(defIndex
, killIndex
, ValNo
);
567 interval
.addRange(LR
);
568 interval
.addKill(ValNo
, killIndex
);
569 ValNo
->hasPHIKill
= true;
577 void LiveIntervals::handlePhysicalRegisterDef(MachineBasicBlock
*MBB
,
578 MachineBasicBlock::iterator mi
,
581 LiveInterval
&interval
,
582 MachineInstr
*CopyMI
) {
583 // A physical register cannot be live across basic block, so its
584 // lifetime must end somewhere in its defining basic block.
585 DOUT
<< "\t\tregister: "; DEBUG(printRegName(interval
.reg
));
587 unsigned baseIndex
= MIIdx
;
588 unsigned start
= getDefIndex(baseIndex
);
589 // Earlyclobbers move back one.
590 if (MO
.isEarlyClobber())
591 start
= getUseIndex(MIIdx
);
592 unsigned end
= start
;
594 // If it is not used after definition, it is considered dead at
595 // the instruction defining it. Hence its interval is:
596 // [defSlot(def), defSlot(def)+1)
603 // If it is not dead on definition, it must be killed by a
604 // subsequent instruction. Hence its interval is:
605 // [defSlot(def), useSlot(kill)+1)
606 baseIndex
+= InstrSlots::NUM
;
607 while (++mi
!= MBB
->end()) {
608 while (baseIndex
/ InstrSlots::NUM
< i2miMap_
.size() &&
609 getInstructionFromIndex(baseIndex
) == 0)
610 baseIndex
+= InstrSlots::NUM
;
611 if (mi
->killsRegister(interval
.reg
, tri_
)) {
613 end
= getUseIndex(baseIndex
) + 1;
616 int DefIdx
= mi
->findRegisterDefOperandIdx(interval
.reg
, false, tri_
);
618 if (mi
->isRegTiedToUseOperand(DefIdx
)) {
619 // Two-address instruction.
620 end
= getDefIndex(baseIndex
);
621 if (mi
->getOperand(DefIdx
).isEarlyClobber())
622 end
= getUseIndex(baseIndex
);
624 // Another instruction redefines the register before it is ever read.
625 // Then the register is essentially dead at the instruction that defines
626 // it. Hence its interval is:
627 // [defSlot(def), defSlot(def)+1)
635 baseIndex
+= InstrSlots::NUM
;
638 // The only case we should have a dead physreg here without a killing or
639 // instruction where we know it's dead is if it is live-in to the function
640 // and never used. Another possible case is the implicit use of the
641 // physical register has been deleted by two-address pass.
645 assert(start
< end
&& "did not find end of interval?");
647 // Already exists? Extend old live interval.
648 LiveInterval::iterator OldLR
= interval
.FindLiveRangeContaining(start
);
649 bool Extend
= OldLR
!= interval
.end();
650 VNInfo
*ValNo
= Extend
651 ? OldLR
->valno
: interval
.getNextValue(start
, CopyMI
, VNInfoAllocator
);
652 if (MO
.isEarlyClobber() && Extend
)
653 ValNo
->redefByEC
= true;
654 LiveRange
LR(start
, end
, ValNo
);
655 interval
.addRange(LR
);
656 interval
.addKill(LR
.valno
, end
);
657 DOUT
<< " +" << LR
<< '\n';
660 void LiveIntervals::handleRegisterDef(MachineBasicBlock
*MBB
,
661 MachineBasicBlock::iterator MI
,
665 if (TargetRegisterInfo::isVirtualRegister(MO
.getReg()))
666 handleVirtualRegisterDef(MBB
, MI
, MIIdx
, MO
, MOIdx
,
667 getOrCreateInterval(MO
.getReg()));
668 else if (allocatableRegs_
[MO
.getReg()]) {
669 MachineInstr
*CopyMI
= NULL
;
670 unsigned SrcReg
, DstReg
, SrcSubReg
, DstSubReg
;
671 if (MI
->getOpcode() == TargetInstrInfo::EXTRACT_SUBREG
||
672 MI
->getOpcode() == TargetInstrInfo::INSERT_SUBREG
||
673 MI
->getOpcode() == TargetInstrInfo::SUBREG_TO_REG
||
674 tii_
->isMoveInstr(*MI
, SrcReg
, DstReg
, SrcSubReg
, DstSubReg
))
676 handlePhysicalRegisterDef(MBB
, MI
, MIIdx
, MO
,
677 getOrCreateInterval(MO
.getReg()), CopyMI
);
678 // Def of a register also defines its sub-registers.
679 for (const unsigned* AS
= tri_
->getSubRegisters(MO
.getReg()); *AS
; ++AS
)
680 // If MI also modifies the sub-register explicitly, avoid processing it
681 // more than once. Do not pass in TRI here so it checks for exact match.
682 if (!MI
->modifiesRegister(*AS
))
683 handlePhysicalRegisterDef(MBB
, MI
, MIIdx
, MO
,
684 getOrCreateInterval(*AS
), 0);
688 void LiveIntervals::handleLiveInRegister(MachineBasicBlock
*MBB
,
690 LiveInterval
&interval
, bool isAlias
) {
691 DOUT
<< "\t\tlivein register: "; DEBUG(printRegName(interval
.reg
));
693 // Look for kills, if it reaches a def before it's killed, then it shouldn't
694 // be considered a livein.
695 MachineBasicBlock::iterator mi
= MBB
->begin();
696 unsigned baseIndex
= MIIdx
;
697 unsigned start
= baseIndex
;
698 while (baseIndex
/ InstrSlots::NUM
< i2miMap_
.size() &&
699 getInstructionFromIndex(baseIndex
) == 0)
700 baseIndex
+= InstrSlots::NUM
;
701 unsigned end
= baseIndex
;
702 bool SeenDefUse
= false;
704 while (mi
!= MBB
->end()) {
705 if (mi
->killsRegister(interval
.reg
, tri_
)) {
707 end
= getUseIndex(baseIndex
) + 1;
710 } else if (mi
->modifiesRegister(interval
.reg
, tri_
)) {
711 // Another instruction redefines the register before it is ever read.
712 // Then the register is essentially dead at the instruction that defines
713 // it. Hence its interval is:
714 // [defSlot(def), defSlot(def)+1)
716 end
= getDefIndex(start
) + 1;
721 baseIndex
+= InstrSlots::NUM
;
723 if (mi
!= MBB
->end()) {
724 while (baseIndex
/ InstrSlots::NUM
< i2miMap_
.size() &&
725 getInstructionFromIndex(baseIndex
) == 0)
726 baseIndex
+= InstrSlots::NUM
;
731 // Live-in register might not be used at all.
735 end
= getDefIndex(MIIdx
) + 1;
737 DOUT
<< " live through";
742 LiveRange
LR(start
, end
, interval
.getNextValue(~0U, 0, VNInfoAllocator
));
743 interval
.addRange(LR
);
744 interval
.addKill(LR
.valno
, end
);
745 DOUT
<< " +" << LR
<< '\n';
748 /// computeIntervals - computes the live intervals for virtual
749 /// registers. for some ordering of the machine instructions [1,N] a
750 /// live interval is an interval [i, j) where 1 <= i <= j < N for
751 /// which a variable is live
752 void LiveIntervals::computeIntervals() {
754 DOUT
<< "********** COMPUTING LIVE INTERVALS **********\n"
755 << "********** Function: "
756 << ((Value
*)mf_
->getFunction())->getName() << '\n';
758 for (MachineFunction::iterator MBBI
= mf_
->begin(), E
= mf_
->end();
760 MachineBasicBlock
*MBB
= MBBI
;
761 // Track the index of the current machine instr.
762 unsigned MIIndex
= getMBBStartIdx(MBB
);
763 DOUT
<< ((Value
*)MBB
->getBasicBlock())->getName() << ":\n";
765 MachineBasicBlock::iterator MI
= MBB
->begin(), miEnd
= MBB
->end();
767 // Create intervals for live-ins to this BB first.
768 for (MachineBasicBlock::const_livein_iterator LI
= MBB
->livein_begin(),
769 LE
= MBB
->livein_end(); LI
!= LE
; ++LI
) {
770 handleLiveInRegister(MBB
, MIIndex
, getOrCreateInterval(*LI
));
771 // Multiple live-ins can alias the same register.
772 for (const unsigned* AS
= tri_
->getSubRegisters(*LI
); *AS
; ++AS
)
773 if (!hasInterval(*AS
))
774 handleLiveInRegister(MBB
, MIIndex
, getOrCreateInterval(*AS
),
778 // Skip over empty initial indices.
779 while (MIIndex
/ InstrSlots::NUM
< i2miMap_
.size() &&
780 getInstructionFromIndex(MIIndex
) == 0)
781 MIIndex
+= InstrSlots::NUM
;
783 for (; MI
!= miEnd
; ++MI
) {
784 DOUT
<< MIIndex
<< "\t" << *MI
;
787 for (int i
= MI
->getNumOperands() - 1; i
>= 0; --i
) {
788 MachineOperand
&MO
= MI
->getOperand(i
);
789 // handle register defs - build intervals
790 if (MO
.isReg() && MO
.getReg() && MO
.isDef()) {
791 handleRegisterDef(MBB
, MI
, MIIndex
, MO
, i
);
795 // Skip over the empty slots after each instruction.
796 unsigned Slots
= MI
->getDesc().getNumDefs();
799 MIIndex
+= InstrSlots::NUM
* Slots
;
801 // Skip over empty indices.
802 while (MIIndex
/ InstrSlots::NUM
< i2miMap_
.size() &&
803 getInstructionFromIndex(MIIndex
) == 0)
804 MIIndex
+= InstrSlots::NUM
;
809 bool LiveIntervals::findLiveInMBBs(unsigned Start
, unsigned End
,
810 SmallVectorImpl
<MachineBasicBlock
*> &MBBs
) const {
811 std::vector
<IdxMBBPair
>::const_iterator I
=
812 std::lower_bound(Idx2MBBMap
.begin(), Idx2MBBMap
.end(), Start
);
815 while (I
!= Idx2MBBMap
.end()) {
818 MBBs
.push_back(I
->second
);
825 bool LiveIntervals::findReachableMBBs(unsigned Start
, unsigned End
,
826 SmallVectorImpl
<MachineBasicBlock
*> &MBBs
) const {
827 std::vector
<IdxMBBPair
>::const_iterator I
=
828 std::lower_bound(Idx2MBBMap
.begin(), Idx2MBBMap
.end(), Start
);
831 while (I
!= Idx2MBBMap
.end()) {
834 MachineBasicBlock
*MBB
= I
->second
;
835 if (getMBBEndIdx(MBB
) > End
)
837 for (MachineBasicBlock::succ_iterator SI
= MBB
->succ_begin(),
838 SE
= MBB
->succ_end(); SI
!= SE
; ++SI
)
846 LiveInterval
* LiveIntervals::createInterval(unsigned reg
) {
847 float Weight
= TargetRegisterInfo::isPhysicalRegister(reg
) ? HUGE_VALF
: 0.0F
;
848 return new LiveInterval(reg
, Weight
);
851 /// dupInterval - Duplicate a live interval. The caller is responsible for
852 /// managing the allocated memory.
853 LiveInterval
* LiveIntervals::dupInterval(LiveInterval
*li
) {
854 LiveInterval
*NewLI
= createInterval(li
->reg
);
855 NewLI
->Copy(*li
, getVNInfoAllocator());
859 /// getVNInfoSourceReg - Helper function that parses the specified VNInfo
860 /// copy field and returns the source register that defines it.
861 unsigned LiveIntervals::getVNInfoSourceReg(const VNInfo
*VNI
) const {
865 if (VNI
->copy
->getOpcode() == TargetInstrInfo::EXTRACT_SUBREG
) {
866 // If it's extracting out of a physical register, return the sub-register.
867 unsigned Reg
= VNI
->copy
->getOperand(1).getReg();
868 if (TargetRegisterInfo::isPhysicalRegister(Reg
))
869 Reg
= tri_
->getSubReg(Reg
, VNI
->copy
->getOperand(2).getImm());
871 } else if (VNI
->copy
->getOpcode() == TargetInstrInfo::INSERT_SUBREG
||
872 VNI
->copy
->getOpcode() == TargetInstrInfo::SUBREG_TO_REG
)
873 return VNI
->copy
->getOperand(2).getReg();
875 unsigned SrcReg
, DstReg
, SrcSubReg
, DstSubReg
;
876 if (tii_
->isMoveInstr(*VNI
->copy
, SrcReg
, DstReg
, SrcSubReg
, DstSubReg
))
878 assert(0 && "Unrecognized copy instruction!");
882 //===----------------------------------------------------------------------===//
883 // Register allocator hooks.
886 /// getReMatImplicitUse - If the remat definition MI has one (for now, we only
887 /// allow one) virtual register operand, then its uses are implicitly using
888 /// the register. Returns the virtual register.
889 unsigned LiveIntervals::getReMatImplicitUse(const LiveInterval
&li
,
890 MachineInstr
*MI
) const {
892 for (unsigned i
= 0, e
= MI
->getNumOperands(); i
!= e
; ++i
) {
893 MachineOperand
&MO
= MI
->getOperand(i
);
894 if (!MO
.isReg() || !MO
.isUse())
896 unsigned Reg
= MO
.getReg();
897 if (Reg
== 0 || Reg
== li
.reg
)
899 // FIXME: For now, only remat MI with at most one register operand.
901 "Can't rematerialize instruction with multiple register operand!");
910 /// isValNoAvailableAt - Return true if the val# of the specified interval
911 /// which reaches the given instruction also reaches the specified use index.
912 bool LiveIntervals::isValNoAvailableAt(const LiveInterval
&li
, MachineInstr
*MI
,
913 unsigned UseIdx
) const {
914 unsigned Index
= getInstructionIndex(MI
);
915 VNInfo
*ValNo
= li
.FindLiveRangeContaining(Index
)->valno
;
916 LiveInterval::const_iterator UI
= li
.FindLiveRangeContaining(UseIdx
);
917 return UI
!= li
.end() && UI
->valno
== ValNo
;
920 /// isReMaterializable - Returns true if the definition MI of the specified
921 /// val# of the specified interval is re-materializable.
922 bool LiveIntervals::isReMaterializable(const LiveInterval
&li
,
923 const VNInfo
*ValNo
, MachineInstr
*MI
,
924 SmallVectorImpl
<LiveInterval
*> &SpillIs
,
929 if (MI
->getOpcode() == TargetInstrInfo::IMPLICIT_DEF
)
933 if (tii_
->isLoadFromStackSlot(MI
, FrameIdx
) &&
934 mf_
->getFrameInfo()->isImmutableObjectIndex(FrameIdx
))
935 // FIXME: Let target specific isReallyTriviallyReMaterializable determines
936 // this but remember this is not safe to fold into a two-address
938 // This is a load from fixed stack slot. It can be rematerialized.
941 // If the target-specific rules don't identify an instruction as
942 // being trivially rematerializable, use some target-independent
944 if (!MI
->getDesc().isRematerializable() ||
945 !tii_
->isTriviallyReMaterializable(MI
)) {
946 if (!EnableAggressiveRemat
)
949 // If the instruction accesses memory but the memoperands have been lost,
950 // we can't analyze it.
951 const TargetInstrDesc
&TID
= MI
->getDesc();
952 if ((TID
.mayLoad() || TID
.mayStore()) && MI
->memoperands_empty())
955 // Avoid instructions obviously unsafe for remat.
956 if (TID
.hasUnmodeledSideEffects() || TID
.isNotDuplicable())
959 // If the instruction accesses memory and the memory could be non-constant,
960 // assume the instruction is not rematerializable.
961 for (std::list
<MachineMemOperand
>::const_iterator
962 I
= MI
->memoperands_begin(), E
= MI
->memoperands_end(); I
!= E
; ++I
){
963 const MachineMemOperand
&MMO
= *I
;
964 if (MMO
.isVolatile() || MMO
.isStore())
966 const Value
*V
= MMO
.getValue();
969 if (const PseudoSourceValue
*PSV
= dyn_cast
<PseudoSourceValue
>(V
)) {
970 if (!PSV
->isConstant(mf_
->getFrameInfo()))
972 } else if (!aa_
->pointsToConstantMemory(V
))
976 // If any of the registers accessed are non-constant, conservatively assume
977 // the instruction is not rematerializable.
979 for (unsigned i
= 0, e
= MI
->getNumOperands(); i
!= e
; ++i
) {
980 const MachineOperand
&MO
= MI
->getOperand(i
);
982 unsigned Reg
= MO
.getReg();
985 if (TargetRegisterInfo::isPhysicalRegister(Reg
))
988 // Only allow one def, and that in the first operand.
989 if (MO
.isDef() != (i
== 0))
992 // Only allow constant-valued registers.
993 bool IsLiveIn
= mri_
->isLiveIn(Reg
);
994 MachineRegisterInfo::def_iterator I
= mri_
->def_begin(Reg
),
997 // For the def, it should be the only def of that register.
998 if (MO
.isDef() && (next(I
) != E
|| IsLiveIn
))
1002 // Only allow one use other register use, as that's all the
1003 // remat mechanisms support currently.
1004 if (Reg
!= li
.reg
) {
1007 else if (Reg
!= ImpUse
)
1010 // For the use, there should be only one associated def.
1011 if (I
!= E
&& (next(I
) != E
|| IsLiveIn
))
1018 unsigned ImpUse
= getReMatImplicitUse(li
, MI
);
1020 const LiveInterval
&ImpLi
= getInterval(ImpUse
);
1021 for (MachineRegisterInfo::use_iterator ri
= mri_
->use_begin(li
.reg
),
1022 re
= mri_
->use_end(); ri
!= re
; ++ri
) {
1023 MachineInstr
*UseMI
= &*ri
;
1024 unsigned UseIdx
= getInstructionIndex(UseMI
);
1025 if (li
.FindLiveRangeContaining(UseIdx
)->valno
!= ValNo
)
1027 if (!isValNoAvailableAt(ImpLi
, MI
, UseIdx
))
1031 // If a register operand of the re-materialized instruction is going to
1032 // be spilled next, then it's not legal to re-materialize this instruction.
1033 for (unsigned i
= 0, e
= SpillIs
.size(); i
!= e
; ++i
)
1034 if (ImpUse
== SpillIs
[i
]->reg
)
1040 /// isReMaterializable - Returns true if the definition MI of the specified
1041 /// val# of the specified interval is re-materializable.
1042 bool LiveIntervals::isReMaterializable(const LiveInterval
&li
,
1043 const VNInfo
*ValNo
, MachineInstr
*MI
) {
1044 SmallVector
<LiveInterval
*, 4> Dummy1
;
1046 return isReMaterializable(li
, ValNo
, MI
, Dummy1
, Dummy2
);
1049 /// isReMaterializable - Returns true if every definition of MI of every
1050 /// val# of the specified interval is re-materializable.
1051 bool LiveIntervals::isReMaterializable(const LiveInterval
&li
,
1052 SmallVectorImpl
<LiveInterval
*> &SpillIs
,
1055 for (LiveInterval::const_vni_iterator i
= li
.vni_begin(), e
= li
.vni_end();
1057 const VNInfo
*VNI
= *i
;
1058 unsigned DefIdx
= VNI
->def
;
1060 continue; // Dead val#.
1061 // Is the def for the val# rematerializable?
1064 MachineInstr
*ReMatDefMI
= getInstructionFromIndex(DefIdx
);
1065 bool DefIsLoad
= false;
1067 !isReMaterializable(li
, VNI
, ReMatDefMI
, SpillIs
, DefIsLoad
))
1069 isLoad
|= DefIsLoad
;
1074 /// FilterFoldedOps - Filter out two-address use operands. Return
1075 /// true if it finds any issue with the operands that ought to prevent
1077 static bool FilterFoldedOps(MachineInstr
*MI
,
1078 SmallVector
<unsigned, 2> &Ops
,
1080 SmallVector
<unsigned, 2> &FoldOps
) {
1082 for (unsigned i
= 0, e
= Ops
.size(); i
!= e
; ++i
) {
1083 unsigned OpIdx
= Ops
[i
];
1084 MachineOperand
&MO
= MI
->getOperand(OpIdx
);
1085 // FIXME: fold subreg use.
1089 MRInfo
|= (unsigned)VirtRegMap::isMod
;
1091 // Filter out two-address use operand(s).
1092 if (MI
->isRegTiedToDefOperand(OpIdx
)) {
1093 MRInfo
= VirtRegMap::isModRef
;
1096 MRInfo
|= (unsigned)VirtRegMap::isRef
;
1098 FoldOps
.push_back(OpIdx
);
1104 /// tryFoldMemoryOperand - Attempts to fold either a spill / restore from
1105 /// slot / to reg or any rematerialized load into ith operand of specified
1106 /// MI. If it is successul, MI is updated with the newly created MI and
1108 bool LiveIntervals::tryFoldMemoryOperand(MachineInstr
* &MI
,
1109 VirtRegMap
&vrm
, MachineInstr
*DefMI
,
1111 SmallVector
<unsigned, 2> &Ops
,
1112 bool isSS
, int Slot
, unsigned Reg
) {
1113 // If it is an implicit def instruction, just delete it.
1114 if (MI
->getOpcode() == TargetInstrInfo::IMPLICIT_DEF
) {
1115 RemoveMachineInstrFromMaps(MI
);
1116 vrm
.RemoveMachineInstrFromMaps(MI
);
1117 MI
->eraseFromParent();
1122 // Filter the list of operand indexes that are to be folded. Abort if
1123 // any operand will prevent folding.
1124 unsigned MRInfo
= 0;
1125 SmallVector
<unsigned, 2> FoldOps
;
1126 if (FilterFoldedOps(MI
, Ops
, MRInfo
, FoldOps
))
1129 // The only time it's safe to fold into a two address instruction is when
1130 // it's folding reload and spill from / into a spill stack slot.
1131 if (DefMI
&& (MRInfo
& VirtRegMap::isMod
))
1134 MachineInstr
*fmi
= isSS
? tii_
->foldMemoryOperand(*mf_
, MI
, FoldOps
, Slot
)
1135 : tii_
->foldMemoryOperand(*mf_
, MI
, FoldOps
, DefMI
);
1137 // Remember this instruction uses the spill slot.
1138 if (isSS
) vrm
.addSpillSlotUse(Slot
, fmi
);
1140 // Attempt to fold the memory reference into the instruction. If
1141 // we can do this, we don't need to insert spill code.
1142 MachineBasicBlock
&MBB
= *MI
->getParent();
1143 if (isSS
&& !mf_
->getFrameInfo()->isImmutableObjectIndex(Slot
))
1144 vrm
.virtFolded(Reg
, MI
, fmi
, (VirtRegMap::ModRef
)MRInfo
);
1145 vrm
.transferSpillPts(MI
, fmi
);
1146 vrm
.transferRestorePts(MI
, fmi
);
1147 vrm
.transferEmergencySpills(MI
, fmi
);
1149 i2miMap_
[InstrIdx
/InstrSlots::NUM
] = fmi
;
1150 mi2iMap_
[fmi
] = InstrIdx
;
1151 MI
= MBB
.insert(MBB
.erase(MI
), fmi
);
1158 /// canFoldMemoryOperand - Returns true if the specified load / store
1159 /// folding is possible.
1160 bool LiveIntervals::canFoldMemoryOperand(MachineInstr
*MI
,
1161 SmallVector
<unsigned, 2> &Ops
,
1163 // Filter the list of operand indexes that are to be folded. Abort if
1164 // any operand will prevent folding.
1165 unsigned MRInfo
= 0;
1166 SmallVector
<unsigned, 2> FoldOps
;
1167 if (FilterFoldedOps(MI
, Ops
, MRInfo
, FoldOps
))
1170 // It's only legal to remat for a use, not a def.
1171 if (ReMat
&& (MRInfo
& VirtRegMap::isMod
))
1174 return tii_
->canFoldMemoryOperand(MI
, FoldOps
);
1177 bool LiveIntervals::intervalIsInOneMBB(const LiveInterval
&li
) const {
1178 SmallPtrSet
<MachineBasicBlock
*, 4> MBBs
;
1179 for (LiveInterval::Ranges::const_iterator
1180 I
= li
.ranges
.begin(), E
= li
.ranges
.end(); I
!= E
; ++I
) {
1181 std::vector
<IdxMBBPair
>::const_iterator II
=
1182 std::lower_bound(Idx2MBBMap
.begin(), Idx2MBBMap
.end(), I
->start
);
1183 if (II
== Idx2MBBMap
.end())
1185 if (I
->end
> II
->first
) // crossing a MBB.
1187 MBBs
.insert(II
->second
);
1188 if (MBBs
.size() > 1)
1194 /// rewriteImplicitOps - Rewrite implicit use operands of MI (i.e. uses of
1195 /// interval on to-be re-materialized operands of MI) with new register.
1196 void LiveIntervals::rewriteImplicitOps(const LiveInterval
&li
,
1197 MachineInstr
*MI
, unsigned NewVReg
,
1199 // There is an implicit use. That means one of the other operand is
1200 // being remat'ed and the remat'ed instruction has li.reg as an
1201 // use operand. Make sure we rewrite that as well.
1202 for (unsigned i
= 0, e
= MI
->getNumOperands(); i
!= e
; ++i
) {
1203 MachineOperand
&MO
= MI
->getOperand(i
);
1206 unsigned Reg
= MO
.getReg();
1207 if (Reg
== 0 || TargetRegisterInfo::isPhysicalRegister(Reg
))
1209 if (!vrm
.isReMaterialized(Reg
))
1211 MachineInstr
*ReMatMI
= vrm
.getReMaterializedMI(Reg
);
1212 MachineOperand
*UseMO
= ReMatMI
->findRegisterUseOperand(li
.reg
);
1214 UseMO
->setReg(NewVReg
);
1218 /// rewriteInstructionForSpills, rewriteInstructionsForSpills - Helper functions
1219 /// for addIntervalsForSpills to rewrite uses / defs for the given live range.
1220 bool LiveIntervals::
1221 rewriteInstructionForSpills(const LiveInterval
&li
, const VNInfo
*VNI
,
1222 bool TrySplit
, unsigned index
, unsigned end
, MachineInstr
*MI
,
1223 MachineInstr
*ReMatOrigDefMI
, MachineInstr
*ReMatDefMI
,
1224 unsigned Slot
, int LdSlot
,
1225 bool isLoad
, bool isLoadSS
, bool DefIsReMat
, bool CanDelete
,
1227 const TargetRegisterClass
* rc
,
1228 SmallVector
<int, 4> &ReMatIds
,
1229 const MachineLoopInfo
*loopInfo
,
1230 unsigned &NewVReg
, unsigned ImpUse
, bool &HasDef
, bool &HasUse
,
1231 DenseMap
<unsigned,unsigned> &MBBVRegsMap
,
1232 std::vector
<LiveInterval
*> &NewLIs
, float &SSWeight
) {
1233 MachineBasicBlock
*MBB
= MI
->getParent();
1234 unsigned loopDepth
= loopInfo
->getLoopDepth(MBB
);
1235 bool CanFold
= false;
1237 for (unsigned i
= 0; i
!= MI
->getNumOperands(); ++i
) {
1238 MachineOperand
& mop
= MI
->getOperand(i
);
1241 unsigned Reg
= mop
.getReg();
1242 unsigned RegI
= Reg
;
1243 if (Reg
== 0 || TargetRegisterInfo::isPhysicalRegister(Reg
))
1248 bool TryFold
= !DefIsReMat
;
1249 bool FoldSS
= true; // Default behavior unless it's a remat.
1250 int FoldSlot
= Slot
;
1252 // If this is the rematerializable definition MI itself and
1253 // all of its uses are rematerialized, simply delete it.
1254 if (MI
== ReMatOrigDefMI
&& CanDelete
) {
1255 DOUT
<< "\t\t\t\tErasing re-materlizable def: ";
1257 RemoveMachineInstrFromMaps(MI
);
1258 vrm
.RemoveMachineInstrFromMaps(MI
);
1259 MI
->eraseFromParent();
1263 // If def for this use can't be rematerialized, then try folding.
1264 // If def is rematerializable and it's a load, also try folding.
1265 TryFold
= !ReMatDefMI
|| (ReMatDefMI
&& (MI
== ReMatOrigDefMI
|| isLoad
));
1267 // Try fold loads (from stack slot, constant pool, etc.) into uses.
1273 // Scan all of the operands of this instruction rewriting operands
1274 // to use NewVReg instead of li.reg as appropriate. We do this for
1277 // 1. If the instr reads the same spilled vreg multiple times, we
1278 // want to reuse the NewVReg.
1279 // 2. If the instr is a two-addr instruction, we are required to
1280 // keep the src/dst regs pinned.
1282 // Keep track of whether we replace a use and/or def so that we can
1283 // create the spill interval with the appropriate range.
1285 HasUse
= mop
.isUse();
1286 HasDef
= mop
.isDef();
1287 SmallVector
<unsigned, 2> Ops
;
1289 for (unsigned j
= i
+1, e
= MI
->getNumOperands(); j
!= e
; ++j
) {
1290 const MachineOperand
&MOj
= MI
->getOperand(j
);
1293 unsigned RegJ
= MOj
.getReg();
1294 if (RegJ
== 0 || TargetRegisterInfo::isPhysicalRegister(RegJ
))
1298 HasUse
|= MOj
.isUse();
1299 HasDef
|= MOj
.isDef();
1303 if (HasUse
&& !li
.liveAt(getUseIndex(index
)))
1304 // Must be defined by an implicit def. It should not be spilled. Note,
1305 // this is for correctness reason. e.g.
1306 // 8 %reg1024<def> = IMPLICIT_DEF
1307 // 12 %reg1024<def> = INSERT_SUBREG %reg1024<kill>, %reg1025, 2
1308 // The live range [12, 14) are not part of the r1024 live interval since
1309 // it's defined by an implicit def. It will not conflicts with live
1310 // interval of r1025. Now suppose both registers are spilled, you can
1311 // easily see a situation where both registers are reloaded before
1312 // the INSERT_SUBREG and both target registers that would overlap.
1315 // Update stack slot spill weight if we are splitting.
1316 float Weight
= getSpillWeight(HasDef
, HasUse
, loopDepth
);
1320 // Create a new virtual register for the spill interval.
1321 // Create the new register now so we can map the fold instruction
1322 // to the new register so when it is unfolded we get the correct
1324 bool CreatedNewVReg
= false;
1326 NewVReg
= mri_
->createVirtualRegister(rc
);
1328 CreatedNewVReg
= true;
1334 // Do not fold load / store here if we are splitting. We'll find an
1335 // optimal point to insert a load / store later.
1337 if (tryFoldMemoryOperand(MI
, vrm
, ReMatDefMI
, index
,
1338 Ops
, FoldSS
, FoldSlot
, NewVReg
)) {
1339 // Folding the load/store can completely change the instruction in
1340 // unpredictable ways, rescan it from the beginning.
1343 // We need to give the new vreg the same stack slot as the
1344 // spilled interval.
1345 vrm
.assignVirt2StackSlot(NewVReg
, FoldSlot
);
1351 if (isNotInMIMap(MI
)) {
1355 goto RestartInstruction
;
1358 // We'll try to fold it later if it's profitable.
1359 CanFold
= canFoldMemoryOperand(MI
, Ops
, DefIsReMat
);
1363 mop
.setReg(NewVReg
);
1364 if (mop
.isImplicit())
1365 rewriteImplicitOps(li
, MI
, NewVReg
, vrm
);
1367 // Reuse NewVReg for other reads.
1368 for (unsigned j
= 0, e
= Ops
.size(); j
!= e
; ++j
) {
1369 MachineOperand
&mopj
= MI
->getOperand(Ops
[j
]);
1370 mopj
.setReg(NewVReg
);
1371 if (mopj
.isImplicit())
1372 rewriteImplicitOps(li
, MI
, NewVReg
, vrm
);
1375 if (CreatedNewVReg
) {
1377 vrm
.setVirtIsReMaterialized(NewVReg
, ReMatDefMI
/*, CanDelete*/);
1378 if (ReMatIds
[VNI
->id
] == VirtRegMap::MAX_STACK_SLOT
) {
1379 // Each valnum may have its own remat id.
1380 ReMatIds
[VNI
->id
] = vrm
.assignVirtReMatId(NewVReg
);
1382 vrm
.assignVirtReMatId(NewVReg
, ReMatIds
[VNI
->id
]);
1384 if (!CanDelete
|| (HasUse
&& HasDef
)) {
1385 // If this is a two-addr instruction then its use operands are
1386 // rematerializable but its def is not. It should be assigned a
1388 vrm
.assignVirt2StackSlot(NewVReg
, Slot
);
1391 vrm
.assignVirt2StackSlot(NewVReg
, Slot
);
1393 } else if (HasUse
&& HasDef
&&
1394 vrm
.getStackSlot(NewVReg
) == VirtRegMap::NO_STACK_SLOT
) {
1395 // If this interval hasn't been assigned a stack slot (because earlier
1396 // def is a deleted remat def), do it now.
1397 assert(Slot
!= VirtRegMap::NO_STACK_SLOT
);
1398 vrm
.assignVirt2StackSlot(NewVReg
, Slot
);
1401 // Re-matting an instruction with virtual register use. Add the
1402 // register as an implicit use on the use MI.
1403 if (DefIsReMat
&& ImpUse
)
1404 MI
->addOperand(MachineOperand::CreateReg(ImpUse
, false, true));
1406 // Create a new register interval for this spill / remat.
1407 LiveInterval
&nI
= getOrCreateInterval(NewVReg
);
1408 if (CreatedNewVReg
) {
1409 NewLIs
.push_back(&nI
);
1410 MBBVRegsMap
.insert(std::make_pair(MI
->getParent()->getNumber(), NewVReg
));
1412 vrm
.setIsSplitFromReg(NewVReg
, li
.reg
);
1416 if (CreatedNewVReg
) {
1417 LiveRange
LR(getLoadIndex(index
), getUseIndex(index
)+1,
1418 nI
.getNextValue(~0U, 0, VNInfoAllocator
));
1422 // Extend the split live interval to this def / use.
1423 unsigned End
= getUseIndex(index
)+1;
1424 LiveRange
LR(nI
.ranges
[nI
.ranges
.size()-1].end
, End
,
1425 nI
.getValNumInfo(nI
.getNumValNums()-1));
1431 LiveRange
LR(getDefIndex(index
), getStoreIndex(index
),
1432 nI
.getNextValue(~0U, 0, VNInfoAllocator
));
1437 DOUT
<< "\t\t\t\tAdded new interval: ";
1438 nI
.print(DOUT
, tri_
);
1443 bool LiveIntervals::anyKillInMBBAfterIdx(const LiveInterval
&li
,
1445 MachineBasicBlock
*MBB
, unsigned Idx
) const {
1446 unsigned End
= getMBBEndIdx(MBB
);
1447 for (unsigned j
= 0, ee
= VNI
->kills
.size(); j
!= ee
; ++j
) {
1448 unsigned KillIdx
= VNI
->kills
[j
];
1449 if (KillIdx
> Idx
&& KillIdx
< End
)
1455 /// RewriteInfo - Keep track of machine instrs that will be rewritten
1456 /// during spilling.
1458 struct RewriteInfo
{
1463 RewriteInfo(unsigned i
, MachineInstr
*mi
, bool u
, bool d
)
1464 : Index(i
), MI(mi
), HasUse(u
), HasDef(d
) {}
1467 struct RewriteInfoCompare
{
1468 bool operator()(const RewriteInfo
&LHS
, const RewriteInfo
&RHS
) const {
1469 return LHS
.Index
< RHS
.Index
;
1474 void LiveIntervals::
1475 rewriteInstructionsForSpills(const LiveInterval
&li
, bool TrySplit
,
1476 LiveInterval::Ranges::const_iterator
&I
,
1477 MachineInstr
*ReMatOrigDefMI
, MachineInstr
*ReMatDefMI
,
1478 unsigned Slot
, int LdSlot
,
1479 bool isLoad
, bool isLoadSS
, bool DefIsReMat
, bool CanDelete
,
1481 const TargetRegisterClass
* rc
,
1482 SmallVector
<int, 4> &ReMatIds
,
1483 const MachineLoopInfo
*loopInfo
,
1484 BitVector
&SpillMBBs
,
1485 DenseMap
<unsigned, std::vector
<SRInfo
> > &SpillIdxes
,
1486 BitVector
&RestoreMBBs
,
1487 DenseMap
<unsigned, std::vector
<SRInfo
> > &RestoreIdxes
,
1488 DenseMap
<unsigned,unsigned> &MBBVRegsMap
,
1489 std::vector
<LiveInterval
*> &NewLIs
, float &SSWeight
) {
1490 bool AllCanFold
= true;
1491 unsigned NewVReg
= 0;
1492 unsigned start
= getBaseIndex(I
->start
);
1493 unsigned end
= getBaseIndex(I
->end
-1) + InstrSlots::NUM
;
1495 // First collect all the def / use in this live range that will be rewritten.
1496 // Make sure they are sorted according to instruction index.
1497 std::vector
<RewriteInfo
> RewriteMIs
;
1498 for (MachineRegisterInfo::reg_iterator ri
= mri_
->reg_begin(li
.reg
),
1499 re
= mri_
->reg_end(); ri
!= re
; ) {
1500 MachineInstr
*MI
= &*ri
;
1501 MachineOperand
&O
= ri
.getOperand();
1503 assert(!O
.isImplicit() && "Spilling register that's used as implicit use?");
1504 unsigned index
= getInstructionIndex(MI
);
1505 if (index
< start
|| index
>= end
)
1507 if (O
.isUse() && !li
.liveAt(getUseIndex(index
)))
1508 // Must be defined by an implicit def. It should not be spilled. Note,
1509 // this is for correctness reason. e.g.
1510 // 8 %reg1024<def> = IMPLICIT_DEF
1511 // 12 %reg1024<def> = INSERT_SUBREG %reg1024<kill>, %reg1025, 2
1512 // The live range [12, 14) are not part of the r1024 live interval since
1513 // it's defined by an implicit def. It will not conflicts with live
1514 // interval of r1025. Now suppose both registers are spilled, you can
1515 // easily see a situation where both registers are reloaded before
1516 // the INSERT_SUBREG and both target registers that would overlap.
1518 RewriteMIs
.push_back(RewriteInfo(index
, MI
, O
.isUse(), O
.isDef()));
1520 std::sort(RewriteMIs
.begin(), RewriteMIs
.end(), RewriteInfoCompare());
1522 unsigned ImpUse
= DefIsReMat
? getReMatImplicitUse(li
, ReMatDefMI
) : 0;
1523 // Now rewrite the defs and uses.
1524 for (unsigned i
= 0, e
= RewriteMIs
.size(); i
!= e
; ) {
1525 RewriteInfo
&rwi
= RewriteMIs
[i
];
1527 unsigned index
= rwi
.Index
;
1528 bool MIHasUse
= rwi
.HasUse
;
1529 bool MIHasDef
= rwi
.HasDef
;
1530 MachineInstr
*MI
= rwi
.MI
;
1531 // If MI def and/or use the same register multiple times, then there
1532 // are multiple entries.
1533 unsigned NumUses
= MIHasUse
;
1534 while (i
!= e
&& RewriteMIs
[i
].MI
== MI
) {
1535 assert(RewriteMIs
[i
].Index
== index
);
1536 bool isUse
= RewriteMIs
[i
].HasUse
;
1537 if (isUse
) ++NumUses
;
1539 MIHasDef
|= RewriteMIs
[i
].HasDef
;
1542 MachineBasicBlock
*MBB
= MI
->getParent();
1544 if (ImpUse
&& MI
!= ReMatDefMI
) {
1545 // Re-matting an instruction with virtual register use. Update the
1546 // register interval's spill weight to HUGE_VALF to prevent it from
1548 LiveInterval
&ImpLi
= getInterval(ImpUse
);
1549 ImpLi
.weight
= HUGE_VALF
;
1552 unsigned MBBId
= MBB
->getNumber();
1553 unsigned ThisVReg
= 0;
1555 DenseMap
<unsigned,unsigned>::iterator NVI
= MBBVRegsMap
.find(MBBId
);
1556 if (NVI
!= MBBVRegsMap
.end()) {
1557 ThisVReg
= NVI
->second
;
1564 // It's better to start a new interval to avoid artifically
1565 // extend the new interval.
1566 if (MIHasDef
&& !MIHasUse
) {
1567 MBBVRegsMap
.erase(MBB
->getNumber());
1573 bool IsNew
= ThisVReg
== 0;
1575 // This ends the previous live interval. If all of its def / use
1576 // can be folded, give it a low spill weight.
1577 if (NewVReg
&& TrySplit
&& AllCanFold
) {
1578 LiveInterval
&nI
= getOrCreateInterval(NewVReg
);
1585 bool HasDef
= false;
1586 bool HasUse
= false;
1587 bool CanFold
= rewriteInstructionForSpills(li
, I
->valno
, TrySplit
,
1588 index
, end
, MI
, ReMatOrigDefMI
, ReMatDefMI
,
1589 Slot
, LdSlot
, isLoad
, isLoadSS
, DefIsReMat
,
1590 CanDelete
, vrm
, rc
, ReMatIds
, loopInfo
, NewVReg
,
1591 ImpUse
, HasDef
, HasUse
, MBBVRegsMap
, NewLIs
, SSWeight
);
1592 if (!HasDef
&& !HasUse
)
1595 AllCanFold
&= CanFold
;
1597 // Update weight of spill interval.
1598 LiveInterval
&nI
= getOrCreateInterval(NewVReg
);
1600 // The spill weight is now infinity as it cannot be spilled again.
1601 nI
.weight
= HUGE_VALF
;
1605 // Keep track of the last def and first use in each MBB.
1607 if (MI
!= ReMatOrigDefMI
|| !CanDelete
) {
1608 bool HasKill
= false;
1610 HasKill
= anyKillInMBBAfterIdx(li
, I
->valno
, MBB
, getDefIndex(index
));
1612 // If this is a two-address code, then this index starts a new VNInfo.
1613 const VNInfo
*VNI
= li
.findDefinedVNInfo(getDefIndex(index
));
1615 HasKill
= anyKillInMBBAfterIdx(li
, VNI
, MBB
, getDefIndex(index
));
1617 DenseMap
<unsigned, std::vector
<SRInfo
> >::iterator SII
=
1618 SpillIdxes
.find(MBBId
);
1620 if (SII
== SpillIdxes
.end()) {
1621 std::vector
<SRInfo
> S
;
1622 S
.push_back(SRInfo(index
, NewVReg
, true));
1623 SpillIdxes
.insert(std::make_pair(MBBId
, S
));
1624 } else if (SII
->second
.back().vreg
!= NewVReg
) {
1625 SII
->second
.push_back(SRInfo(index
, NewVReg
, true));
1626 } else if ((int)index
> SII
->second
.back().index
) {
1627 // If there is an earlier def and this is a two-address
1628 // instruction, then it's not possible to fold the store (which
1629 // would also fold the load).
1630 SRInfo
&Info
= SII
->second
.back();
1632 Info
.canFold
= !HasUse
;
1634 SpillMBBs
.set(MBBId
);
1635 } else if (SII
!= SpillIdxes
.end() &&
1636 SII
->second
.back().vreg
== NewVReg
&&
1637 (int)index
> SII
->second
.back().index
) {
1638 // There is an earlier def that's not killed (must be two-address).
1639 // The spill is no longer needed.
1640 SII
->second
.pop_back();
1641 if (SII
->second
.empty()) {
1642 SpillIdxes
.erase(MBBId
);
1643 SpillMBBs
.reset(MBBId
);
1650 DenseMap
<unsigned, std::vector
<SRInfo
> >::iterator SII
=
1651 SpillIdxes
.find(MBBId
);
1652 if (SII
!= SpillIdxes
.end() &&
1653 SII
->second
.back().vreg
== NewVReg
&&
1654 (int)index
> SII
->second
.back().index
)
1655 // Use(s) following the last def, it's not safe to fold the spill.
1656 SII
->second
.back().canFold
= false;
1657 DenseMap
<unsigned, std::vector
<SRInfo
> >::iterator RII
=
1658 RestoreIdxes
.find(MBBId
);
1659 if (RII
!= RestoreIdxes
.end() && RII
->second
.back().vreg
== NewVReg
)
1660 // If we are splitting live intervals, only fold if it's the first
1661 // use and there isn't another use later in the MBB.
1662 RII
->second
.back().canFold
= false;
1664 // Only need a reload if there isn't an earlier def / use.
1665 if (RII
== RestoreIdxes
.end()) {
1666 std::vector
<SRInfo
> Infos
;
1667 Infos
.push_back(SRInfo(index
, NewVReg
, true));
1668 RestoreIdxes
.insert(std::make_pair(MBBId
, Infos
));
1670 RII
->second
.push_back(SRInfo(index
, NewVReg
, true));
1672 RestoreMBBs
.set(MBBId
);
1676 // Update spill weight.
1677 unsigned loopDepth
= loopInfo
->getLoopDepth(MBB
);
1678 nI
.weight
+= getSpillWeight(HasDef
, HasUse
, loopDepth
);
1681 if (NewVReg
&& TrySplit
&& AllCanFold
) {
1682 // If all of its def / use can be folded, give it a low spill weight.
1683 LiveInterval
&nI
= getOrCreateInterval(NewVReg
);
1688 bool LiveIntervals::alsoFoldARestore(int Id
, int index
, unsigned vr
,
1689 BitVector
&RestoreMBBs
,
1690 DenseMap
<unsigned,std::vector
<SRInfo
> > &RestoreIdxes
) {
1691 if (!RestoreMBBs
[Id
])
1693 std::vector
<SRInfo
> &Restores
= RestoreIdxes
[Id
];
1694 for (unsigned i
= 0, e
= Restores
.size(); i
!= e
; ++i
)
1695 if (Restores
[i
].index
== index
&&
1696 Restores
[i
].vreg
== vr
&&
1697 Restores
[i
].canFold
)
1702 void LiveIntervals::eraseRestoreInfo(int Id
, int index
, unsigned vr
,
1703 BitVector
&RestoreMBBs
,
1704 DenseMap
<unsigned,std::vector
<SRInfo
> > &RestoreIdxes
) {
1705 if (!RestoreMBBs
[Id
])
1707 std::vector
<SRInfo
> &Restores
= RestoreIdxes
[Id
];
1708 for (unsigned i
= 0, e
= Restores
.size(); i
!= e
; ++i
)
1709 if (Restores
[i
].index
== index
&& Restores
[i
].vreg
)
1710 Restores
[i
].index
= -1;
1713 /// handleSpilledImpDefs - Remove IMPLICIT_DEF instructions which are being
1714 /// spilled and create empty intervals for their uses.
1716 LiveIntervals::handleSpilledImpDefs(const LiveInterval
&li
, VirtRegMap
&vrm
,
1717 const TargetRegisterClass
* rc
,
1718 std::vector
<LiveInterval
*> &NewLIs
) {
1719 for (MachineRegisterInfo::reg_iterator ri
= mri_
->reg_begin(li
.reg
),
1720 re
= mri_
->reg_end(); ri
!= re
; ) {
1721 MachineOperand
&O
= ri
.getOperand();
1722 MachineInstr
*MI
= &*ri
;
1725 assert(MI
->getOpcode() == TargetInstrInfo::IMPLICIT_DEF
&&
1726 "Register def was not rewritten?");
1727 RemoveMachineInstrFromMaps(MI
);
1728 vrm
.RemoveMachineInstrFromMaps(MI
);
1729 MI
->eraseFromParent();
1731 // This must be an use of an implicit_def so it's not part of the live
1732 // interval. Create a new empty live interval for it.
1733 // FIXME: Can we simply erase some of the instructions? e.g. Stores?
1734 unsigned NewVReg
= mri_
->createVirtualRegister(rc
);
1736 vrm
.setIsImplicitlyDefined(NewVReg
);
1737 NewLIs
.push_back(&getOrCreateInterval(NewVReg
));
1738 for (unsigned i
= 0, e
= MI
->getNumOperands(); i
!= e
; ++i
) {
1739 MachineOperand
&MO
= MI
->getOperand(i
);
1740 if (MO
.isReg() && MO
.getReg() == li
.reg
)
1747 std::vector
<LiveInterval
*> LiveIntervals::
1748 addIntervalsForSpillsFast(const LiveInterval
&li
,
1749 const MachineLoopInfo
*loopInfo
,
1750 VirtRegMap
&vrm
, float& SSWeight
) {
1751 unsigned slot
= vrm
.assignVirt2StackSlot(li
.reg
);
1753 std::vector
<LiveInterval
*> added
;
1755 assert(li
.weight
!= HUGE_VALF
&&
1756 "attempt to spill already spilled interval!");
1758 DOUT
<< "\t\t\t\tadding intervals for spills for interval: ";
1762 const TargetRegisterClass
* rc
= mri_
->getRegClass(li
.reg
);
1766 MachineRegisterInfo::reg_iterator RI
= mri_
->reg_begin(li
.reg
);
1767 while (RI
!= mri_
->reg_end()) {
1768 MachineInstr
* MI
= &*RI
;
1770 SmallVector
<unsigned, 2> Indices
;
1771 bool HasUse
= false;
1772 bool HasDef
= false;
1774 for (unsigned i
= 0; i
!= MI
->getNumOperands(); ++i
) {
1775 MachineOperand
& mop
= MI
->getOperand(i
);
1776 if (!mop
.isReg() || mop
.getReg() != li
.reg
) continue;
1778 HasUse
|= MI
->getOperand(i
).isUse();
1779 HasDef
|= MI
->getOperand(i
).isDef();
1781 Indices
.push_back(i
);
1784 if (!tryFoldMemoryOperand(MI
, vrm
, NULL
, getInstructionIndex(MI
),
1785 Indices
, true, slot
, li
.reg
)) {
1786 unsigned NewVReg
= mri_
->createVirtualRegister(rc
);
1788 vrm
.assignVirt2StackSlot(NewVReg
, slot
);
1790 // create a new register for this spill
1791 LiveInterval
&nI
= getOrCreateInterval(NewVReg
);
1793 // the spill weight is now infinity as it
1794 // cannot be spilled again
1795 nI
.weight
= HUGE_VALF
;
1797 // Rewrite register operands to use the new vreg.
1798 for (SmallVectorImpl
<unsigned>::iterator I
= Indices
.begin(),
1799 E
= Indices
.end(); I
!= E
; ++I
) {
1800 MI
->getOperand(*I
).setReg(NewVReg
);
1802 if (MI
->getOperand(*I
).isUse())
1803 MI
->getOperand(*I
).setIsKill(true);
1806 // Fill in the new live interval.
1807 unsigned index
= getInstructionIndex(MI
);
1809 LiveRange
LR(getLoadIndex(index
), getUseIndex(index
),
1810 nI
.getNextValue(~0U, 0, getVNInfoAllocator()));
1813 vrm
.addRestorePoint(NewVReg
, MI
);
1816 LiveRange
LR(getDefIndex(index
), getStoreIndex(index
),
1817 nI
.getNextValue(~0U, 0, getVNInfoAllocator()));
1820 vrm
.addSpillPoint(NewVReg
, true, MI
);
1823 added
.push_back(&nI
);
1825 DOUT
<< "\t\t\t\tadded new interval: ";
1829 unsigned loopDepth
= loopInfo
->getLoopDepth(MI
->getParent());
1832 SSWeight
+= getSpillWeight(true, true, loopDepth
);
1834 SSWeight
+= getSpillWeight(false, true, loopDepth
);
1836 SSWeight
+= getSpillWeight(true, false, loopDepth
);
1840 RI
= mri_
->reg_begin(li
.reg
);
1846 std::vector
<LiveInterval
*> LiveIntervals::
1847 addIntervalsForSpills(const LiveInterval
&li
,
1848 SmallVectorImpl
<LiveInterval
*> &SpillIs
,
1849 const MachineLoopInfo
*loopInfo
, VirtRegMap
&vrm
,
1852 if (EnableFastSpilling
)
1853 return addIntervalsForSpillsFast(li
, loopInfo
, vrm
, SSWeight
);
1855 assert(li
.weight
!= HUGE_VALF
&&
1856 "attempt to spill already spilled interval!");
1858 DOUT
<< "\t\t\t\tadding intervals for spills for interval: ";
1859 li
.print(DOUT
, tri_
);
1862 // Spill slot weight.
1865 // Each bit specify whether a spill is required in the MBB.
1866 BitVector
SpillMBBs(mf_
->getNumBlockIDs());
1867 DenseMap
<unsigned, std::vector
<SRInfo
> > SpillIdxes
;
1868 BitVector
RestoreMBBs(mf_
->getNumBlockIDs());
1869 DenseMap
<unsigned, std::vector
<SRInfo
> > RestoreIdxes
;
1870 DenseMap
<unsigned,unsigned> MBBVRegsMap
;
1871 std::vector
<LiveInterval
*> NewLIs
;
1872 const TargetRegisterClass
* rc
= mri_
->getRegClass(li
.reg
);
1874 unsigned NumValNums
= li
.getNumValNums();
1875 SmallVector
<MachineInstr
*, 4> ReMatDefs
;
1876 ReMatDefs
.resize(NumValNums
, NULL
);
1877 SmallVector
<MachineInstr
*, 4> ReMatOrigDefs
;
1878 ReMatOrigDefs
.resize(NumValNums
, NULL
);
1879 SmallVector
<int, 4> ReMatIds
;
1880 ReMatIds
.resize(NumValNums
, VirtRegMap::MAX_STACK_SLOT
);
1881 BitVector
ReMatDelete(NumValNums
);
1882 unsigned Slot
= VirtRegMap::MAX_STACK_SLOT
;
1884 // Spilling a split live interval. It cannot be split any further. Also,
1885 // it's also guaranteed to be a single val# / range interval.
1886 if (vrm
.getPreSplitReg(li
.reg
)) {
1887 vrm
.setIsSplitFromReg(li
.reg
, 0);
1888 // Unset the split kill marker on the last use.
1889 unsigned KillIdx
= vrm
.getKillPoint(li
.reg
);
1891 MachineInstr
*KillMI
= getInstructionFromIndex(KillIdx
);
1892 assert(KillMI
&& "Last use disappeared?");
1893 int KillOp
= KillMI
->findRegisterUseOperandIdx(li
.reg
, true);
1894 assert(KillOp
!= -1 && "Last use disappeared?");
1895 KillMI
->getOperand(KillOp
).setIsKill(false);
1897 vrm
.removeKillPoint(li
.reg
);
1898 bool DefIsReMat
= vrm
.isReMaterialized(li
.reg
);
1899 Slot
= vrm
.getStackSlot(li
.reg
);
1900 assert(Slot
!= VirtRegMap::MAX_STACK_SLOT
);
1901 MachineInstr
*ReMatDefMI
= DefIsReMat
?
1902 vrm
.getReMaterializedMI(li
.reg
) : NULL
;
1904 bool isLoadSS
= DefIsReMat
&& tii_
->isLoadFromStackSlot(ReMatDefMI
, LdSlot
);
1905 bool isLoad
= isLoadSS
||
1906 (DefIsReMat
&& (ReMatDefMI
->getDesc().canFoldAsLoad()));
1907 bool IsFirstRange
= true;
1908 for (LiveInterval::Ranges::const_iterator
1909 I
= li
.ranges
.begin(), E
= li
.ranges
.end(); I
!= E
; ++I
) {
1910 // If this is a split live interval with multiple ranges, it means there
1911 // are two-address instructions that re-defined the value. Only the
1912 // first def can be rematerialized!
1914 // Note ReMatOrigDefMI has already been deleted.
1915 rewriteInstructionsForSpills(li
, false, I
, NULL
, ReMatDefMI
,
1916 Slot
, LdSlot
, isLoad
, isLoadSS
, DefIsReMat
,
1917 false, vrm
, rc
, ReMatIds
, loopInfo
,
1918 SpillMBBs
, SpillIdxes
, RestoreMBBs
, RestoreIdxes
,
1919 MBBVRegsMap
, NewLIs
, SSWeight
);
1921 rewriteInstructionsForSpills(li
, false, I
, NULL
, 0,
1922 Slot
, 0, false, false, false,
1923 false, vrm
, rc
, ReMatIds
, loopInfo
,
1924 SpillMBBs
, SpillIdxes
, RestoreMBBs
, RestoreIdxes
,
1925 MBBVRegsMap
, NewLIs
, SSWeight
);
1927 IsFirstRange
= false;
1930 SSWeight
= 0.0f
; // Already accounted for when split.
1931 handleSpilledImpDefs(li
, vrm
, rc
, NewLIs
);
1935 bool TrySplit
= SplitAtBB
&& !intervalIsInOneMBB(li
);
1936 if (SplitLimit
!= -1 && (int)numSplits
>= SplitLimit
)
1940 bool NeedStackSlot
= false;
1941 for (LiveInterval::const_vni_iterator i
= li
.vni_begin(), e
= li
.vni_end();
1943 const VNInfo
*VNI
= *i
;
1944 unsigned VN
= VNI
->id
;
1945 unsigned DefIdx
= VNI
->def
;
1947 continue; // Dead val#.
1948 // Is the def for the val# rematerializable?
1949 MachineInstr
*ReMatDefMI
= (DefIdx
== ~0u)
1950 ? 0 : getInstructionFromIndex(DefIdx
);
1952 if (ReMatDefMI
&& isReMaterializable(li
, VNI
, ReMatDefMI
, SpillIs
, dummy
)) {
1953 // Remember how to remat the def of this val#.
1954 ReMatOrigDefs
[VN
] = ReMatDefMI
;
1955 // Original def may be modified so we have to make a copy here.
1956 MachineInstr
*Clone
= mf_
->CloneMachineInstr(ReMatDefMI
);
1957 ClonedMIs
.push_back(Clone
);
1958 ReMatDefs
[VN
] = Clone
;
1960 bool CanDelete
= true;
1961 if (VNI
->hasPHIKill
) {
1962 // A kill is a phi node, not all of its uses can be rematerialized.
1963 // It must not be deleted.
1965 // Need a stack slot if there is any live range where uses cannot be
1967 NeedStackSlot
= true;
1970 ReMatDelete
.set(VN
);
1972 // Need a stack slot if there is any live range where uses cannot be
1974 NeedStackSlot
= true;
1978 // One stack slot per live interval.
1979 if (NeedStackSlot
&& vrm
.getPreSplitReg(li
.reg
) == 0) {
1980 if (vrm
.getStackSlot(li
.reg
) == VirtRegMap::NO_STACK_SLOT
)
1981 Slot
= vrm
.assignVirt2StackSlot(li
.reg
);
1983 // This case only occurs when the prealloc splitter has already assigned
1984 // a stack slot to this vreg.
1986 Slot
= vrm
.getStackSlot(li
.reg
);
1989 // Create new intervals and rewrite defs and uses.
1990 for (LiveInterval::Ranges::const_iterator
1991 I
= li
.ranges
.begin(), E
= li
.ranges
.end(); I
!= E
; ++I
) {
1992 MachineInstr
*ReMatDefMI
= ReMatDefs
[I
->valno
->id
];
1993 MachineInstr
*ReMatOrigDefMI
= ReMatOrigDefs
[I
->valno
->id
];
1994 bool DefIsReMat
= ReMatDefMI
!= NULL
;
1995 bool CanDelete
= ReMatDelete
[I
->valno
->id
];
1997 bool isLoadSS
= DefIsReMat
&& tii_
->isLoadFromStackSlot(ReMatDefMI
, LdSlot
);
1998 bool isLoad
= isLoadSS
||
1999 (DefIsReMat
&& ReMatDefMI
->getDesc().canFoldAsLoad());
2000 rewriteInstructionsForSpills(li
, TrySplit
, I
, ReMatOrigDefMI
, ReMatDefMI
,
2001 Slot
, LdSlot
, isLoad
, isLoadSS
, DefIsReMat
,
2002 CanDelete
, vrm
, rc
, ReMatIds
, loopInfo
,
2003 SpillMBBs
, SpillIdxes
, RestoreMBBs
, RestoreIdxes
,
2004 MBBVRegsMap
, NewLIs
, SSWeight
);
2007 // Insert spills / restores if we are splitting.
2009 handleSpilledImpDefs(li
, vrm
, rc
, NewLIs
);
2013 SmallPtrSet
<LiveInterval
*, 4> AddedKill
;
2014 SmallVector
<unsigned, 2> Ops
;
2015 if (NeedStackSlot
) {
2016 int Id
= SpillMBBs
.find_first();
2018 MachineBasicBlock
*MBB
= mf_
->getBlockNumbered(Id
);
2019 unsigned loopDepth
= loopInfo
->getLoopDepth(MBB
);
2020 std::vector
<SRInfo
> &spills
= SpillIdxes
[Id
];
2021 for (unsigned i
= 0, e
= spills
.size(); i
!= e
; ++i
) {
2022 int index
= spills
[i
].index
;
2023 unsigned VReg
= spills
[i
].vreg
;
2024 LiveInterval
&nI
= getOrCreateInterval(VReg
);
2025 bool isReMat
= vrm
.isReMaterialized(VReg
);
2026 MachineInstr
*MI
= getInstructionFromIndex(index
);
2027 bool CanFold
= false;
2028 bool FoundUse
= false;
2030 if (spills
[i
].canFold
) {
2032 for (unsigned j
= 0, ee
= MI
->getNumOperands(); j
!= ee
; ++j
) {
2033 MachineOperand
&MO
= MI
->getOperand(j
);
2034 if (!MO
.isReg() || MO
.getReg() != VReg
)
2041 (!FoundUse
&& !alsoFoldARestore(Id
, index
, VReg
,
2042 RestoreMBBs
, RestoreIdxes
))) {
2043 // MI has two-address uses of the same register. If the use
2044 // isn't the first and only use in the BB, then we can't fold
2045 // it. FIXME: Move this to rewriteInstructionsForSpills.
2052 // Fold the store into the def if possible.
2053 bool Folded
= false;
2054 if (CanFold
&& !Ops
.empty()) {
2055 if (tryFoldMemoryOperand(MI
, vrm
, NULL
, index
, Ops
, true, Slot
,VReg
)){
2058 // Also folded uses, do not issue a load.
2059 eraseRestoreInfo(Id
, index
, VReg
, RestoreMBBs
, RestoreIdxes
);
2060 nI
.removeRange(getLoadIndex(index
), getUseIndex(index
)+1);
2062 nI
.removeRange(getDefIndex(index
), getStoreIndex(index
));
2066 // Otherwise tell the spiller to issue a spill.
2068 LiveRange
*LR
= &nI
.ranges
[nI
.ranges
.size()-1];
2069 bool isKill
= LR
->end
== getStoreIndex(index
);
2070 if (!MI
->registerDefIsDead(nI
.reg
))
2071 // No need to spill a dead def.
2072 vrm
.addSpillPoint(VReg
, isKill
, MI
);
2074 AddedKill
.insert(&nI
);
2077 // Update spill slot weight.
2079 SSWeight
+= getSpillWeight(true, false, loopDepth
);
2081 Id
= SpillMBBs
.find_next(Id
);
2085 int Id
= RestoreMBBs
.find_first();
2087 MachineBasicBlock
*MBB
= mf_
->getBlockNumbered(Id
);
2088 unsigned loopDepth
= loopInfo
->getLoopDepth(MBB
);
2090 std::vector
<SRInfo
> &restores
= RestoreIdxes
[Id
];
2091 for (unsigned i
= 0, e
= restores
.size(); i
!= e
; ++i
) {
2092 int index
= restores
[i
].index
;
2095 unsigned VReg
= restores
[i
].vreg
;
2096 LiveInterval
&nI
= getOrCreateInterval(VReg
);
2097 bool isReMat
= vrm
.isReMaterialized(VReg
);
2098 MachineInstr
*MI
= getInstructionFromIndex(index
);
2099 bool CanFold
= false;
2101 if (restores
[i
].canFold
) {
2103 for (unsigned j
= 0, ee
= MI
->getNumOperands(); j
!= ee
; ++j
) {
2104 MachineOperand
&MO
= MI
->getOperand(j
);
2105 if (!MO
.isReg() || MO
.getReg() != VReg
)
2109 // If this restore were to be folded, it would have been folded
2118 // Fold the load into the use if possible.
2119 bool Folded
= false;
2120 if (CanFold
&& !Ops
.empty()) {
2122 Folded
= tryFoldMemoryOperand(MI
, vrm
, NULL
,index
,Ops
,true,Slot
,VReg
);
2124 MachineInstr
*ReMatDefMI
= vrm
.getReMaterializedMI(VReg
);
2126 bool isLoadSS
= tii_
->isLoadFromStackSlot(ReMatDefMI
, LdSlot
);
2127 // If the rematerializable def is a load, also try to fold it.
2128 if (isLoadSS
|| ReMatDefMI
->getDesc().canFoldAsLoad())
2129 Folded
= tryFoldMemoryOperand(MI
, vrm
, ReMatDefMI
, index
,
2130 Ops
, isLoadSS
, LdSlot
, VReg
);
2132 unsigned ImpUse
= getReMatImplicitUse(li
, ReMatDefMI
);
2134 // Re-matting an instruction with virtual register use. Add the
2135 // register as an implicit use on the use MI and update the register
2136 // interval's spill weight to HUGE_VALF to prevent it from being
2138 LiveInterval
&ImpLi
= getInterval(ImpUse
);
2139 ImpLi
.weight
= HUGE_VALF
;
2140 MI
->addOperand(MachineOperand::CreateReg(ImpUse
, false, true));
2145 // If folding is not possible / failed, then tell the spiller to issue a
2146 // load / rematerialization for us.
2148 nI
.removeRange(getLoadIndex(index
), getUseIndex(index
)+1);
2150 vrm
.addRestorePoint(VReg
, MI
);
2152 // Update spill slot weight.
2154 SSWeight
+= getSpillWeight(false, true, loopDepth
);
2156 Id
= RestoreMBBs
.find_next(Id
);
2159 // Finalize intervals: add kills, finalize spill weights, and filter out
2161 std::vector
<LiveInterval
*> RetNewLIs
;
2162 for (unsigned i
= 0, e
= NewLIs
.size(); i
!= e
; ++i
) {
2163 LiveInterval
*LI
= NewLIs
[i
];
2165 LI
->weight
/= InstrSlots::NUM
* getApproximateInstructionCount(*LI
);
2166 if (!AddedKill
.count(LI
)) {
2167 LiveRange
*LR
= &LI
->ranges
[LI
->ranges
.size()-1];
2168 unsigned LastUseIdx
= getBaseIndex(LR
->end
);
2169 MachineInstr
*LastUse
= getInstructionFromIndex(LastUseIdx
);
2170 int UseIdx
= LastUse
->findRegisterUseOperandIdx(LI
->reg
, false);
2171 assert(UseIdx
!= -1);
2172 if (!LastUse
->isRegTiedToDefOperand(UseIdx
)) {
2173 LastUse
->getOperand(UseIdx
).setIsKill();
2174 vrm
.addKillPoint(LI
->reg
, LastUseIdx
);
2177 RetNewLIs
.push_back(LI
);
2181 handleSpilledImpDefs(li
, vrm
, rc
, RetNewLIs
);
2185 /// hasAllocatableSuperReg - Return true if the specified physical register has
2186 /// any super register that's allocatable.
2187 bool LiveIntervals::hasAllocatableSuperReg(unsigned Reg
) const {
2188 for (const unsigned* AS
= tri_
->getSuperRegisters(Reg
); *AS
; ++AS
)
2189 if (allocatableRegs_
[*AS
] && hasInterval(*AS
))
2194 /// getRepresentativeReg - Find the largest super register of the specified
2195 /// physical register.
2196 unsigned LiveIntervals::getRepresentativeReg(unsigned Reg
) const {
2197 // Find the largest super-register that is allocatable.
2198 unsigned BestReg
= Reg
;
2199 for (const unsigned* AS
= tri_
->getSuperRegisters(Reg
); *AS
; ++AS
) {
2200 unsigned SuperReg
= *AS
;
2201 if (!hasAllocatableSuperReg(SuperReg
) && hasInterval(SuperReg
)) {
2209 /// getNumConflictsWithPhysReg - Return the number of uses and defs of the
2210 /// specified interval that conflicts with the specified physical register.
2211 unsigned LiveIntervals::getNumConflictsWithPhysReg(const LiveInterval
&li
,
2212 unsigned PhysReg
) const {
2213 unsigned NumConflicts
= 0;
2214 const LiveInterval
&pli
= getInterval(getRepresentativeReg(PhysReg
));
2215 for (MachineRegisterInfo::reg_iterator I
= mri_
->reg_begin(li
.reg
),
2216 E
= mri_
->reg_end(); I
!= E
; ++I
) {
2217 MachineOperand
&O
= I
.getOperand();
2218 MachineInstr
*MI
= O
.getParent();
2219 unsigned Index
= getInstructionIndex(MI
);
2220 if (pli
.liveAt(Index
))
2223 return NumConflicts
;
2226 /// spillPhysRegAroundRegDefsUses - Spill the specified physical register
2227 /// around all defs and uses of the specified interval. Return true if it
2228 /// was able to cut its interval.
2229 bool LiveIntervals::spillPhysRegAroundRegDefsUses(const LiveInterval
&li
,
2230 unsigned PhysReg
, VirtRegMap
&vrm
) {
2231 unsigned SpillReg
= getRepresentativeReg(PhysReg
);
2233 for (const unsigned *AS
= tri_
->getAliasSet(PhysReg
); *AS
; ++AS
)
2234 // If there are registers which alias PhysReg, but which are not a
2235 // sub-register of the chosen representative super register. Assert
2236 // since we can't handle it yet.
2237 assert(*AS
== SpillReg
|| !allocatableRegs_
[*AS
] || !hasInterval(*AS
) ||
2238 tri_
->isSuperRegister(*AS
, SpillReg
));
2241 LiveInterval
&pli
= getInterval(SpillReg
);
2242 SmallPtrSet
<MachineInstr
*, 8> SeenMIs
;
2243 for (MachineRegisterInfo::reg_iterator I
= mri_
->reg_begin(li
.reg
),
2244 E
= mri_
->reg_end(); I
!= E
; ++I
) {
2245 MachineOperand
&O
= I
.getOperand();
2246 MachineInstr
*MI
= O
.getParent();
2247 if (SeenMIs
.count(MI
))
2250 unsigned Index
= getInstructionIndex(MI
);
2251 if (pli
.liveAt(Index
)) {
2252 vrm
.addEmergencySpill(SpillReg
, MI
);
2253 unsigned StartIdx
= getLoadIndex(Index
);
2254 unsigned EndIdx
= getStoreIndex(Index
)+1;
2255 if (pli
.isInOneLiveRange(StartIdx
, EndIdx
)) {
2256 pli
.removeRange(StartIdx
, EndIdx
);
2259 cerr
<< "Ran out of registers during register allocation!\n";
2260 if (MI
->getOpcode() == TargetInstrInfo::INLINEASM
) {
2261 cerr
<< "Please check your inline asm statement for invalid "
2262 << "constraints:\n";
2263 MI
->print(cerr
.stream(), tm_
);
2267 for (const unsigned* AS
= tri_
->getSubRegisters(SpillReg
); *AS
; ++AS
) {
2268 if (!hasInterval(*AS
))
2270 LiveInterval
&spli
= getInterval(*AS
);
2271 if (spli
.liveAt(Index
))
2272 spli
.removeRange(getLoadIndex(Index
), getStoreIndex(Index
)+1);
2279 LiveRange
LiveIntervals::addLiveRangeToEndOfBlock(unsigned reg
,
2280 MachineInstr
* startInst
) {
2281 LiveInterval
& Interval
= getOrCreateInterval(reg
);
2282 VNInfo
* VN
= Interval
.getNextValue(
2283 getInstructionIndex(startInst
) + InstrSlots::DEF
,
2284 startInst
, getVNInfoAllocator());
2285 VN
->hasPHIKill
= true;
2286 VN
->kills
.push_back(getMBBEndIdx(startInst
->getParent()));
2287 LiveRange
LR(getInstructionIndex(startInst
) + InstrSlots::DEF
,
2288 getMBBEndIdx(startInst
->getParent()) + 1, VN
);
2289 Interval
.addRange(LR
);