blob: ebbcf63b700041aa8ae289a4d99697be9ee408db [file] [log] [blame]
Chris Lattnera3b8b5c2004-07-23 17:56:30 +00001//===-- LiveIntervalAnalysis.h - Live Interval Analysis ---------*- C++ -*-===//
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner7ed47a12007-12-29 19:59:42 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +00007//
8//===----------------------------------------------------------------------===//
9//
Chris Lattner6b929062004-07-19 02:13:59 +000010// This file implements the LiveInterval analysis pass. Given some numbering of
11// each the machine instructions (in this implemention depth-first order) an
12// interval [i, j) is said to be a live interval for register v if there is no
Dan Gohman8131a502008-03-13 23:04:27 +000013// instruction with number j' > j such that v is live at j' and there is no
Chris Lattner6b929062004-07-19 02:13:59 +000014// instruction with number i' < i such that v is live at i'. In this
15// implementation intervals can have holes, i.e. an interval might look like
16// [1,20), [50,65), [1000,1001).
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000017//
18//===----------------------------------------------------------------------===//
19
Chris Lattnera3b8b5c2004-07-23 17:56:30 +000020#ifndef LLVM_CODEGEN_LIVEINTERVAL_ANALYSIS_H
21#define LLVM_CODEGEN_LIVEINTERVAL_ANALYSIS_H
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000022
23#include "llvm/CodeGen/MachineFunctionPass.h"
Chris Lattner779a6512005-09-21 04:18:25 +000024#include "llvm/CodeGen/LiveInterval.h"
Evan Cheng61de82d2007-02-15 05:59:24 +000025#include "llvm/ADT/BitVector.h"
Evan Cheng20b0abc2007-04-17 20:32:26 +000026#include "llvm/ADT/DenseMap.h"
Evan Cheng549f27d32007-08-13 23:45:17 +000027#include "llvm/ADT/SmallPtrSet.h"
28#include "llvm/ADT/SmallVector.h"
Evan Chengf3bb2e62007-09-05 21:46:51 +000029#include "llvm/Support/Allocator.h"
Hartmut Kaiserffb15de2007-11-13 23:04:28 +000030#include <cmath>
Dan Gohmanc9235d22008-03-21 23:51:57 +000031#include <map>
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000032
33namespace llvm {
34
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +000035 class LiveVariables;
Evan Cheng22f07ff2007-12-11 02:09:15 +000036 class MachineLoopInfo;
Dan Gohman6f0d0242008-02-10 18:45:23 +000037 class TargetRegisterInfo;
Chris Lattner84bc5422007-12-31 04:13:23 +000038 class MachineRegisterInfo;
Chris Lattnerf768bba2005-03-09 23:05:19 +000039 class TargetInstrInfo;
Evan Cheng20b0abc2007-04-17 20:32:26 +000040 class TargetRegisterClass;
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +000041 class VirtRegMap;
Evan Cheng4ca980e2007-10-17 02:10:22 +000042 typedef std::pair<unsigned, MachineBasicBlock*> IdxMBBPair;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000043
Roman Levenstein8dd25282008-02-18 09:35:30 +000044 inline bool operator<(unsigned V, const IdxMBBPair &IM) {
45 return V < IM.first;
46 }
47
48 inline bool operator<(const IdxMBBPair &IM, unsigned V) {
49 return IM.first < V;
50 }
51
52 struct Idx2MBBCompare {
53 bool operator()(const IdxMBBPair &LHS, const IdxMBBPair &RHS) const {
54 return LHS.first < RHS.first;
55 }
56 };
57
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +000058 class LiveIntervals : public MachineFunctionPass {
59 MachineFunction* mf_;
Evan Chengd70dbb52008-02-22 09:24:50 +000060 MachineRegisterInfo* mri_;
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +000061 const TargetMachine* tm_;
Dan Gohman6f0d0242008-02-10 18:45:23 +000062 const TargetRegisterInfo* tri_;
Chris Lattnerf768bba2005-03-09 23:05:19 +000063 const TargetInstrInfo* tii_;
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +000064 LiveVariables* lv_;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000065
Evan Chengf3bb2e62007-09-05 21:46:51 +000066 /// Special pool allocator for VNInfo's (LiveInterval val#).
67 ///
68 BumpPtrAllocator VNInfoAllocator;
69
Evan Cheng549f27d32007-08-13 23:45:17 +000070 /// MBB2IdxMap - The indexes of the first and last instructions in the
71 /// specified basic block.
72 std::vector<std::pair<unsigned, unsigned> > MBB2IdxMap;
David Greene25133302007-06-08 17:18:56 +000073
Evan Cheng4ca980e2007-10-17 02:10:22 +000074 /// Idx2MBBMap - Sorted list of pairs of index of first instruction
75 /// and MBB id.
76 std::vector<IdxMBBPair> Idx2MBBMap;
77
Owen Andersona1566f22008-07-22 22:46:49 +000078 /// FunctionSize - The number of instructions present in the function
79 uint64_t FunctionSize;
80
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +000081 typedef std::map<MachineInstr*, unsigned> Mi2IndexMap;
82 Mi2IndexMap mi2iMap_;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000083
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +000084 typedef std::vector<MachineInstr*> Index2MiMap;
85 Index2MiMap i2miMap_;
Alkis Evlogimenos843b1602004-02-15 10:24:21 +000086
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +000087 typedef std::map<unsigned, LiveInterval> Reg2IntervalMap;
88 Reg2IntervalMap r2iMap_;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000089
Evan Cheng61de82d2007-02-15 05:59:24 +000090 BitVector allocatableRegs_;
Evan Cheng88d1f582007-03-01 02:03:03 +000091
Evan Cheng549f27d32007-08-13 23:45:17 +000092 std::vector<MachineInstr*> ClonedMIs;
93
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +000094 public:
Nick Lewyckyecd94c82007-05-06 13:37:16 +000095 static char ID; // Pass identification, replacement for typeid
Devang Patel794fd752007-05-01 21:15:47 +000096 LiveIntervals() : MachineFunctionPass((intptr_t)&ID) {}
97
Chris Lattnerf7da2c72006-08-24 22:43:55 +000098 struct InstrSlots {
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +000099 enum {
100 LOAD = 0,
101 USE = 1,
102 DEF = 2,
103 STORE = 3,
Chris Lattner410354f2006-02-22 16:23:43 +0000104 NUM = 4
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +0000105 };
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000106 };
107
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +0000108 static unsigned getBaseIndex(unsigned index) {
109 return index - (index % InstrSlots::NUM);
110 }
111 static unsigned getBoundaryIndex(unsigned index) {
112 return getBaseIndex(index + InstrSlots::NUM - 1);
113 }
114 static unsigned getLoadIndex(unsigned index) {
115 return getBaseIndex(index) + InstrSlots::LOAD;
116 }
117 static unsigned getUseIndex(unsigned index) {
118 return getBaseIndex(index) + InstrSlots::USE;
119 }
120 static unsigned getDefIndex(unsigned index) {
121 return getBaseIndex(index) + InstrSlots::DEF;
122 }
123 static unsigned getStoreIndex(unsigned index) {
124 return getBaseIndex(index) + InstrSlots::STORE;
125 }
126
Evan Chengc3417602008-06-21 06:45:54 +0000127 static float getSpillWeight(bool isDef, bool isUse, unsigned loopDepth) {
128 return (isDef + isUse) * powf(10.0F, (float)loopDepth);
Evan Chengf2fbca62007-11-12 06:35:08 +0000129 }
130
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +0000131 typedef Reg2IntervalMap::iterator iterator;
Chris Lattner70ca3582004-09-30 15:59:17 +0000132 typedef Reg2IntervalMap::const_iterator const_iterator;
133 const_iterator begin() const { return r2iMap_.begin(); }
134 const_iterator end() const { return r2iMap_.end(); }
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +0000135 iterator begin() { return r2iMap_.begin(); }
136 iterator end() { return r2iMap_.end(); }
Evan Cheng34cd4a42008-05-05 18:30:58 +0000137 unsigned getNumIntervals() const { return (unsigned)r2iMap_.size(); }
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +0000138
139 LiveInterval &getInterval(unsigned reg) {
140 Reg2IntervalMap::iterator I = r2iMap_.find(reg);
141 assert(I != r2iMap_.end() && "Interval does not exist for register");
142 return I->second;
143 }
144
145 const LiveInterval &getInterval(unsigned reg) const {
146 Reg2IntervalMap::const_iterator I = r2iMap_.find(reg);
147 assert(I != r2iMap_.end() && "Interval does not exist for register");
148 return I->second;
149 }
150
Evan Chengb371f452007-02-19 21:49:54 +0000151 bool hasInterval(unsigned reg) const {
Evan Cheng88d1f582007-03-01 02:03:03 +0000152 return r2iMap_.count(reg);
Evan Chengb371f452007-02-19 21:49:54 +0000153 }
154
Chris Lattner428b92e2006-09-15 03:57:23 +0000155 /// getMBBStartIdx - Return the base index of the first instruction in the
156 /// specified MachineBasicBlock.
157 unsigned getMBBStartIdx(MachineBasicBlock *MBB) const {
158 return getMBBStartIdx(MBB->getNumber());
159 }
Chris Lattner428b92e2006-09-15 03:57:23 +0000160 unsigned getMBBStartIdx(unsigned MBBNo) const {
161 assert(MBBNo < MBB2IdxMap.size() && "Invalid MBB number!");
Evan Cheng549f27d32007-08-13 23:45:17 +0000162 return MBB2IdxMap[MBBNo].first;
163 }
164
165 /// getMBBEndIdx - Return the store index of the last instruction in the
166 /// specified MachineBasicBlock.
167 unsigned getMBBEndIdx(MachineBasicBlock *MBB) const {
168 return getMBBEndIdx(MBB->getNumber());
169 }
170 unsigned getMBBEndIdx(unsigned MBBNo) const {
171 assert(MBBNo < MBB2IdxMap.size() && "Invalid MBB number!");
172 return MBB2IdxMap[MBBNo].second;
Chris Lattner428b92e2006-09-15 03:57:23 +0000173 }
174
Owen Andersona1566f22008-07-22 22:46:49 +0000175 /// getScaledIntervalSize - get the size of an interval in "units,"
Owen Anderson72e04092008-06-23 23:25:37 +0000176 /// where every function is composed of one thousand units. This
177 /// measure scales properly with empty index slots in the function.
Owen Andersona1566f22008-07-22 22:46:49 +0000178 double getScaledIntervalSize(LiveInterval& I) {
179 return (1000.0 / InstrSlots::NUM * I.getSize()) / i2miMap_.size();
180 }
181
182 /// getApproximateInstructionCount - computes an estimate of the number
183 /// of instructions in a given LiveInterval.
184 unsigned getApproximateInstructionCount(LiveInterval& I) {
185 double IntervalPercentage = getScaledIntervalSize(I) / 1000.0;
186 return IntervalPercentage * FunctionSize;
Owen Anderson72e04092008-06-23 23:25:37 +0000187 }
188
Roman Levenstein8dd25282008-02-18 09:35:30 +0000189 /// getMBBFromIndex - given an index in any instruction of an
190 /// MBB return a pointer the MBB
191 MachineBasicBlock* getMBBFromIndex(unsigned index) const {
192 std::vector<IdxMBBPair>::const_iterator I =
Bill Wendlinge85fe662008-02-26 10:49:39 +0000193 std::lower_bound(Idx2MBBMap.begin(), Idx2MBBMap.end(), index);
Roman Levenstein8dd25282008-02-18 09:35:30 +0000194 // Take the pair containing the index
195 std::vector<IdxMBBPair>::const_iterator J =
Bill Wendlinge85fe662008-02-26 10:49:39 +0000196 ((I != Idx2MBBMap.end() && I->first > index) ||
197 (I == Idx2MBBMap.end() && Idx2MBBMap.size()>0)) ? (I-1): I;
Roman Levenstein8dd25282008-02-18 09:35:30 +0000198
199 assert(J != Idx2MBBMap.end() && J->first < index+1 &&
Bill Wendlinge85fe662008-02-26 10:49:39 +0000200 index <= getMBBEndIdx(J->second) &&
201 "index does not correspond to an MBB");
Roman Levenstein8dd25282008-02-18 09:35:30 +0000202 return J->second;
203 }
204
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +0000205 /// getInstructionIndex - returns the base index of instr
206 unsigned getInstructionIndex(MachineInstr* instr) const {
207 Mi2IndexMap::const_iterator it = mi2iMap_.find(instr);
208 assert(it != mi2iMap_.end() && "Invalid instruction!");
209 return it->second;
210 }
211
212 /// getInstructionFromIndex - given an index in any slot of an
213 /// instruction return a pointer the instruction
214 MachineInstr* getInstructionFromIndex(unsigned index) const {
215 index /= InstrSlots::NUM; // convert index to vector index
216 assert(index < i2miMap_.size() &&
217 "index does not correspond to an instruction");
218 return i2miMap_[index];
219 }
David Greene25133302007-06-08 17:18:56 +0000220
Evan Chengc92da382007-11-03 07:20:12 +0000221 /// conflictsWithPhysRegDef - Returns true if the specified register
222 /// is defined during the duration of the specified interval.
223 bool conflictsWithPhysRegDef(const LiveInterval &li, VirtRegMap &vrm,
224 unsigned reg);
225
Evan Cheng4ca980e2007-10-17 02:10:22 +0000226 /// findLiveInMBBs - Given a live range, if the value of the range
227 /// is live in any MBB returns true as well as the list of basic blocks
228 /// where the value is live in.
229 bool findLiveInMBBs(const LiveRange &LR,
Evan Chenga5bfc972007-10-17 06:53:44 +0000230 SmallVectorImpl<MachineBasicBlock*> &MBBs) const;
Evan Cheng4ca980e2007-10-17 02:10:22 +0000231
David Greene25133302007-06-08 17:18:56 +0000232 // Interval creation
233
234 LiveInterval &getOrCreateInterval(unsigned reg) {
235 Reg2IntervalMap::iterator I = r2iMap_.find(reg);
236 if (I == r2iMap_.end())
237 I = r2iMap_.insert(I, std::make_pair(reg, createInterval(reg)));
238 return I->second;
239 }
Owen Andersonc4dc1322008-06-05 17:15:43 +0000240
241 /// addLiveRangeToEndOfBlock - Given a register and an instruction,
242 /// adds a live range from that instruction to the end of its MBB.
243 LiveRange addLiveRangeToEndOfBlock(unsigned reg,
244 MachineInstr* startInst);
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +0000245
David Greene25133302007-06-08 17:18:56 +0000246 // Interval removal
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +0000247
David Greene25133302007-06-08 17:18:56 +0000248 void removeInterval(unsigned Reg) {
249 r2iMap_.erase(Reg);
Bill Wendling5c7e3262006-12-17 05:15:13 +0000250 }
Chris Lattner70ca3582004-09-30 15:59:17 +0000251
Evan Cheng30cac022007-02-22 23:03:39 +0000252 /// isRemoved - returns true if the specified machine instr has been
253 /// removed.
254 bool isRemoved(MachineInstr* instr) const {
Evan Cheng7d35c0e2007-02-22 23:52:23 +0000255 return !mi2iMap_.count(instr);
Evan Cheng30cac022007-02-22 23:03:39 +0000256 }
257
Chris Lattnerf7da2c72006-08-24 22:43:55 +0000258 /// RemoveMachineInstrFromMaps - This marks the specified machine instr as
259 /// deleted.
260 void RemoveMachineInstrFromMaps(MachineInstr *MI) {
261 // remove index -> MachineInstr and
262 // MachineInstr -> index mappings
263 Mi2IndexMap::iterator mi2i = mi2iMap_.find(MI);
264 if (mi2i != mi2iMap_.end()) {
265 i2miMap_[mi2i->second/InstrSlots::NUM] = 0;
266 mi2iMap_.erase(mi2i);
267 }
268 }
David Greene25133302007-06-08 17:18:56 +0000269
Evan Cheng70071432008-02-13 03:01:43 +0000270 /// ReplaceMachineInstrInMaps - Replacing a machine instr with a new one in
271 /// maps used by register allocator.
272 void ReplaceMachineInstrInMaps(MachineInstr *MI, MachineInstr *NewMI) {
273 Mi2IndexMap::iterator mi2i = mi2iMap_.find(MI);
Evan Chengb1f6f912008-02-13 09:18:16 +0000274 if (mi2i == mi2iMap_.end())
275 return;
276 i2miMap_[mi2i->second/InstrSlots::NUM] = NewMI;
277 Mi2IndexMap::iterator it = mi2iMap_.find(MI);
278 assert(it != mi2iMap_.end() && "Invalid instruction!");
279 unsigned Index = it->second;
280 mi2iMap_.erase(it);
281 mi2iMap_[NewMI] = Index;
Evan Cheng70071432008-02-13 03:01:43 +0000282 }
283
Evan Chengf3bb2e62007-09-05 21:46:51 +0000284 BumpPtrAllocator& getVNInfoAllocator() { return VNInfoAllocator; }
285
Evan Chengc8d044e2008-02-15 18:24:29 +0000286 /// getVNInfoSourceReg - Helper function that parses the specified VNInfo
287 /// copy field and returns the source register that defines it.
288 unsigned getVNInfoSourceReg(const VNInfo *VNI) const;
289
David Greene25133302007-06-08 17:18:56 +0000290 virtual void getAnalysisUsage(AnalysisUsage &AU) const;
291 virtual void releaseMemory();
292
293 /// runOnMachineFunction - pass entry point
294 virtual bool runOnMachineFunction(MachineFunction&);
295
296 /// print - Implement the dump method.
297 virtual void print(std::ostream &O, const Module* = 0) const;
298 void print(std::ostream *O, const Module* M = 0) const {
299 if (O) print(*O, M);
300 }
301
Evan Chengf2fbca62007-11-12 06:35:08 +0000302 /// addIntervalsForSpills - Create new intervals for spilled defs / uses of
Evan Cheng9c3c2212008-06-06 07:54:39 +0000303 /// the given interval. FIXME: It also returns the weight of the spill slot
304 /// (if any is created) by reference. This is temporary.
Evan Chengf2fbca62007-11-12 06:35:08 +0000305 std::vector<LiveInterval*>
Evan Cheng81a03822007-11-17 00:40:40 +0000306 addIntervalsForSpills(const LiveInterval& i,
Evan Cheng9c3c2212008-06-06 07:54:39 +0000307 const MachineLoopInfo *loopInfo, VirtRegMap& vrm,
308 float &SSWeight);
Evan Chengf2fbca62007-11-12 06:35:08 +0000309
Evan Cheng676dd7c2008-03-11 07:19:34 +0000310 /// spillPhysRegAroundRegDefsUses - Spill the specified physical register
311 /// around all defs and uses of the specified interval.
312 void spillPhysRegAroundRegDefsUses(const LiveInterval &li,
313 unsigned PhysReg, VirtRegMap &vrm);
314
Evan Cheng5ef3a042007-12-06 00:01:56 +0000315 /// isReMaterializable - Returns true if every definition of MI of every
316 /// val# of the specified interval is re-materializable. Also returns true
317 /// by reference if all of the defs are load instructions.
318 bool isReMaterializable(const LiveInterval &li, bool &isLoad);
319
Evan Cheng676dd7c2008-03-11 07:19:34 +0000320 /// getRepresentativeReg - Find the largest super register of the specified
321 /// physical register.
322 unsigned getRepresentativeReg(unsigned Reg) const;
323
324 /// getNumConflictsWithPhysReg - Return the number of uses and defs of the
325 /// specified interval that conflicts with the specified physical register.
326 unsigned getNumConflictsWithPhysReg(const LiveInterval &li,
327 unsigned PhysReg) const;
328
Owen Anderson15a17f52008-05-30 20:14:04 +0000329 /// computeNumbering - Compute the index numbering.
330 void computeNumbering();
331
David Greene25133302007-06-08 17:18:56 +0000332 private:
Chris Lattner428b92e2006-09-15 03:57:23 +0000333 /// computeIntervals - Compute live intervals.
Chris Lattnerc7695eb2006-09-14 06:42:17 +0000334 void computeIntervals();
Chris Lattner6bda49f2006-09-02 05:26:01 +0000335
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +0000336 /// handleRegisterDef - update intervals for a register def
337 /// (calls handlePhysicalRegisterDef and
338 /// handleVirtualRegisterDef)
Chris Lattner6b128bd2006-09-03 08:07:11 +0000339 void handleRegisterDef(MachineBasicBlock *MBB,
340 MachineBasicBlock::iterator MI, unsigned MIIdx,
Evan Chengef0732d2008-07-10 07:35:43 +0000341 MachineOperand& MO, unsigned MOIdx);
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +0000342
343 /// handleVirtualRegisterDef - update intervals for a virtual
344 /// register def
Chris Lattner6b128bd2006-09-03 08:07:11 +0000345 void handleVirtualRegisterDef(MachineBasicBlock *MBB,
346 MachineBasicBlock::iterator MI,
Owen Anderson6b098de2008-06-25 23:39:39 +0000347 unsigned MIIdx, MachineOperand& MO,
Evan Chengef0732d2008-07-10 07:35:43 +0000348 unsigned MOIdx, LiveInterval& interval);
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +0000349
Chris Lattnerf768bba2005-03-09 23:05:19 +0000350 /// handlePhysicalRegisterDef - update intervals for a physical register
Chris Lattnerf7da2c72006-08-24 22:43:55 +0000351 /// def.
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +0000352 void handlePhysicalRegisterDef(MachineBasicBlock* mbb,
353 MachineBasicBlock::iterator mi,
Owen Anderson6b098de2008-06-25 23:39:39 +0000354 unsigned MIIdx, MachineOperand& MO,
Chris Lattner91725b72006-08-31 05:54:43 +0000355 LiveInterval &interval,
Evan Chengc8d044e2008-02-15 18:24:29 +0000356 MachineInstr *CopyMI);
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +0000357
Evan Chengb371f452007-02-19 21:49:54 +0000358 /// handleLiveInRegister - Create interval for a livein register.
Jim Laskey9b25b8c2007-02-21 22:41:17 +0000359 void handleLiveInRegister(MachineBasicBlock* mbb,
360 unsigned MIIdx,
Evan Cheng24a3cc42007-04-25 07:30:23 +0000361 LiveInterval &interval, bool isAlias = false);
Evan Chengb371f452007-02-19 21:49:54 +0000362
Evan Chengd70dbb52008-02-22 09:24:50 +0000363 /// getReMatImplicitUse - If the remat definition MI has one (for now, we
364 /// only allow one) virtual register operand, then its uses are implicitly
365 /// using the register. Returns the virtual register.
366 unsigned getReMatImplicitUse(const LiveInterval &li,
367 MachineInstr *MI) const;
368
369 /// isValNoAvailableAt - Return true if the val# of the specified interval
370 /// which reaches the given instruction also reaches the specified use
371 /// index.
372 bool isValNoAvailableAt(const LiveInterval &li, MachineInstr *MI,
373 unsigned UseIdx) const;
374
Evan Cheng549f27d32007-08-13 23:45:17 +0000375 /// isReMaterializable - Returns true if the definition MI of the specified
Evan Cheng5ef3a042007-12-06 00:01:56 +0000376 /// val# of the specified interval is re-materializable. Also returns true
377 /// by reference if the def is a load.
Evan Cheng7ecb38b2007-08-29 20:45:00 +0000378 bool isReMaterializable(const LiveInterval &li, const VNInfo *ValNo,
Evan Cheng5ef3a042007-12-06 00:01:56 +0000379 MachineInstr *MI, bool &isLoad);
Evan Cheng549f27d32007-08-13 23:45:17 +0000380
Evan Cheng35b35c52007-08-30 05:52:20 +0000381 /// tryFoldMemoryOperand - Attempts to fold either a spill / restore from
382 /// slot / to reg or any rematerialized load into ith operand of specified
383 /// MI. If it is successul, MI is updated with the newly created MI and
384 /// returns true.
385 bool tryFoldMemoryOperand(MachineInstr* &MI, VirtRegMap &vrm,
Evan Chengcddbb832007-11-30 21:23:43 +0000386 MachineInstr *DefMI, unsigned InstrIdx,
Evan Chengaee4af62007-12-02 08:30:39 +0000387 SmallVector<unsigned, 2> &Ops,
Evan Chengcddbb832007-11-30 21:23:43 +0000388 bool isSS, int Slot, unsigned Reg);
Evan Cheng549f27d32007-08-13 23:45:17 +0000389
Evan Chengd70dbb52008-02-22 09:24:50 +0000390 /// canFoldMemoryOperand - Return true if the specified load / store
Evan Cheng018f9b02007-12-05 03:22:34 +0000391 /// folding is possible.
Evan Chengd64b5c82007-12-05 03:14:33 +0000392 bool canFoldMemoryOperand(MachineInstr *MI,
Evan Cheng79a0c1e2008-02-25 08:50:41 +0000393 SmallVector<unsigned, 2> &Ops,
394 bool ReMatLoadSS) const;
Evan Chengd64b5c82007-12-05 03:14:33 +0000395
Evan Cheng0cbb1162007-11-29 01:06:25 +0000396 /// anyKillInMBBAfterIdx - Returns true if there is a kill of the specified
397 /// VNInfo that's after the specified index but is within the basic block.
398 bool anyKillInMBBAfterIdx(const LiveInterval &li, const VNInfo *VNI,
399 MachineBasicBlock *MBB, unsigned Idx) const;
Evan Cheng81a03822007-11-17 00:40:40 +0000400
Evan Cheng0cbb1162007-11-29 01:06:25 +0000401 /// intervalIsInOneMBB - Returns true if the specified interval is entirely
402 /// within a single basic block.
Evan Cheng81a03822007-11-17 00:40:40 +0000403 bool intervalIsInOneMBB(const LiveInterval &li) const;
404
Evan Cheng676dd7c2008-03-11 07:19:34 +0000405 /// hasAllocatableSuperReg - Return true if the specified physical register
406 /// has any super register that's allocatable.
407 bool hasAllocatableSuperReg(unsigned Reg) const;
408
Evan Cheng1953d0c2007-11-29 10:12:14 +0000409 /// SRInfo - Spill / restore info.
410 struct SRInfo {
411 int index;
412 unsigned vreg;
413 bool canFold;
414 SRInfo(int i, unsigned vr, bool f) : index(i), vreg(vr), canFold(f) {};
415 };
416
417 bool alsoFoldARestore(int Id, int index, unsigned vr,
418 BitVector &RestoreMBBs,
Chris Lattner84bc5422007-12-31 04:13:23 +0000419 std::map<unsigned,std::vector<SRInfo> >&RestoreIdxes);
Evan Cheng1953d0c2007-11-29 10:12:14 +0000420 void eraseRestoreInfo(int Id, int index, unsigned vr,
421 BitVector &RestoreMBBs,
Chris Lattner84bc5422007-12-31 04:13:23 +0000422 std::map<unsigned,std::vector<SRInfo> >&RestoreIdxes);
Evan Cheng1953d0c2007-11-29 10:12:14 +0000423
Evan Cheng4cce6b42008-04-11 17:53:36 +0000424 /// handleSpilledImpDefs - Remove IMPLICIT_DEF instructions which are being
425 /// spilled and create empty intervals for their uses.
426 void handleSpilledImpDefs(const LiveInterval &li, VirtRegMap &vrm,
427 const TargetRegisterClass* rc,
428 std::vector<LiveInterval*> &NewLIs);
Evan Cheng419852c2008-04-03 16:39:43 +0000429
Evan Chengd70dbb52008-02-22 09:24:50 +0000430 /// rewriteImplicitOps - Rewrite implicit use operands of MI (i.e. uses of
431 /// interval on to-be re-materialized operands of MI) with new register.
432 void rewriteImplicitOps(const LiveInterval &li,
433 MachineInstr *MI, unsigned NewVReg, VirtRegMap &vrm);
434
Chris Lattner84bc5422007-12-31 04:13:23 +0000435 /// rewriteInstructionForSpills, rewriteInstructionsForSpills - Helper
436 /// functions for addIntervalsForSpills to rewrite uses / defs for the given
437 /// live range.
Evan Chengd70dbb52008-02-22 09:24:50 +0000438 bool rewriteInstructionForSpills(const LiveInterval &li, const VNInfo *VNI,
439 bool TrySplit, unsigned index, unsigned end, MachineInstr *MI,
Evan Chengf2fbca62007-11-12 06:35:08 +0000440 MachineInstr *OrigDefMI, MachineInstr *DefMI, unsigned Slot, int LdSlot,
441 bool isLoad, bool isLoadSS, bool DefIsReMat, bool CanDelete,
Evan Chengd70dbb52008-02-22 09:24:50 +0000442 VirtRegMap &vrm, const TargetRegisterClass* rc,
443 SmallVector<int, 4> &ReMatIds, const MachineLoopInfo *loopInfo,
Evan Cheng0cc83b62008-02-23 00:46:11 +0000444 unsigned &NewVReg, unsigned ImpUse, bool &HasDef, bool &HasUse,
Evan Cheng1953d0c2007-11-29 10:12:14 +0000445 std::map<unsigned,unsigned> &MBBVRegsMap,
Evan Cheng9c3c2212008-06-06 07:54:39 +0000446 std::vector<LiveInterval*> &NewLIs, float &SSWeight);
Evan Cheng81a03822007-11-17 00:40:40 +0000447 void rewriteInstructionsForSpills(const LiveInterval &li, bool TrySplit,
Evan Chengf2fbca62007-11-12 06:35:08 +0000448 LiveInterval::Ranges::const_iterator &I,
449 MachineInstr *OrigDefMI, MachineInstr *DefMI, unsigned Slot, int LdSlot,
450 bool isLoad, bool isLoadSS, bool DefIsReMat, bool CanDelete,
Evan Chengd70dbb52008-02-22 09:24:50 +0000451 VirtRegMap &vrm, const TargetRegisterClass* rc,
Evan Cheng22f07ff2007-12-11 02:09:15 +0000452 SmallVector<int, 4> &ReMatIds, const MachineLoopInfo *loopInfo,
Evan Cheng81a03822007-11-17 00:40:40 +0000453 BitVector &SpillMBBs,
Evan Cheng1953d0c2007-11-29 10:12:14 +0000454 std::map<unsigned,std::vector<SRInfo> > &SpillIdxes,
Evan Cheng0cbb1162007-11-29 01:06:25 +0000455 BitVector &RestoreMBBs,
Evan Cheng1953d0c2007-11-29 10:12:14 +0000456 std::map<unsigned,std::vector<SRInfo> > &RestoreIdxes,
457 std::map<unsigned,unsigned> &MBBVRegsMap,
Evan Cheng9c3c2212008-06-06 07:54:39 +0000458 std::vector<LiveInterval*> &NewLIs, float &SSWeight);
Evan Chengf2fbca62007-11-12 06:35:08 +0000459
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +0000460 static LiveInterval createInterval(unsigned Reg);
461
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +0000462 void printRegName(unsigned reg) const;
463 };
464
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000465} // End llvm namespace
466
467#endif