LiveIntervalAnalysis.h revision c9235d2e855c56e9aa157969f8132a05f9ba89d8
1//===-- LiveIntervalAnalysis.h - Live Interval Analysis ---------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// 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
13// instruction with number j' > j such that v is live at j' and there is no
14// 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).
17//
18//===----------------------------------------------------------------------===//
19
20#ifndef LLVM_CODEGEN_LIVEINTERVAL_ANALYSIS_H
21#define LLVM_CODEGEN_LIVEINTERVAL_ANALYSIS_H
22
23#include "llvm/CodeGen/MachineFunctionPass.h"
24#include "llvm/CodeGen/LiveInterval.h"
25#include "llvm/ADT/BitVector.h"
26#include "llvm/ADT/DenseMap.h"
27#include "llvm/ADT/SmallPtrSet.h"
28#include "llvm/ADT/SmallVector.h"
29#include "llvm/Support/Allocator.h"
30#include <cmath>
31#include <map>
32
33namespace llvm {
34
35  class LiveVariables;
36  class MachineLoopInfo;
37  class TargetRegisterInfo;
38  class MachineRegisterInfo;
39  class TargetInstrInfo;
40  class TargetRegisterClass;
41  class VirtRegMap;
42  typedef std::pair<unsigned, MachineBasicBlock*> IdxMBBPair;
43
44  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
58  class LiveIntervals : public MachineFunctionPass {
59    MachineFunction* mf_;
60    MachineRegisterInfo* mri_;
61    const TargetMachine* tm_;
62    const TargetRegisterInfo* tri_;
63    const TargetInstrInfo* tii_;
64    LiveVariables* lv_;
65
66    /// Special pool allocator for VNInfo's (LiveInterval val#).
67    ///
68    BumpPtrAllocator VNInfoAllocator;
69
70    /// MBB2IdxMap - The indexes of the first and last instructions in the
71    /// specified basic block.
72    std::vector<std::pair<unsigned, unsigned> > MBB2IdxMap;
73
74    /// Idx2MBBMap - Sorted list of pairs of index of first instruction
75    /// and MBB id.
76    std::vector<IdxMBBPair> Idx2MBBMap;
77
78    typedef std::map<MachineInstr*, unsigned> Mi2IndexMap;
79    Mi2IndexMap mi2iMap_;
80
81    typedef std::vector<MachineInstr*> Index2MiMap;
82    Index2MiMap i2miMap_;
83
84    typedef std::map<unsigned, LiveInterval> Reg2IntervalMap;
85    Reg2IntervalMap r2iMap_;
86
87    BitVector allocatableRegs_;
88
89    std::vector<MachineInstr*> ClonedMIs;
90
91  public:
92    static char ID; // Pass identification, replacement for typeid
93    LiveIntervals() : MachineFunctionPass((intptr_t)&ID) {}
94
95    struct InstrSlots {
96      enum {
97        LOAD  = 0,
98        USE   = 1,
99        DEF   = 2,
100        STORE = 3,
101        NUM   = 4
102      };
103    };
104
105    static unsigned getBaseIndex(unsigned index) {
106      return index - (index % InstrSlots::NUM);
107    }
108    static unsigned getBoundaryIndex(unsigned index) {
109      return getBaseIndex(index + InstrSlots::NUM - 1);
110    }
111    static unsigned getLoadIndex(unsigned index) {
112      return getBaseIndex(index) + InstrSlots::LOAD;
113    }
114    static unsigned getUseIndex(unsigned index) {
115      return getBaseIndex(index) + InstrSlots::USE;
116    }
117    static unsigned getDefIndex(unsigned index) {
118      return getBaseIndex(index) + InstrSlots::DEF;
119    }
120    static unsigned getStoreIndex(unsigned index) {
121      return getBaseIndex(index) + InstrSlots::STORE;
122    }
123
124    static float getSpillWeight(bool isDef, bool isUse, unsigned loopDepth) {
125      return (isDef + isUse) * powf(10.0F, (float)loopDepth);
126    }
127
128    typedef Reg2IntervalMap::iterator iterator;
129    typedef Reg2IntervalMap::const_iterator const_iterator;
130    const_iterator begin() const { return r2iMap_.begin(); }
131    const_iterator end() const { return r2iMap_.end(); }
132    iterator begin() { return r2iMap_.begin(); }
133    iterator end() { return r2iMap_.end(); }
134    unsigned getNumIntervals() const { return r2iMap_.size(); }
135
136    LiveInterval &getInterval(unsigned reg) {
137      Reg2IntervalMap::iterator I = r2iMap_.find(reg);
138      assert(I != r2iMap_.end() && "Interval does not exist for register");
139      return I->second;
140    }
141
142    const LiveInterval &getInterval(unsigned reg) const {
143      Reg2IntervalMap::const_iterator I = r2iMap_.find(reg);
144      assert(I != r2iMap_.end() && "Interval does not exist for register");
145      return I->second;
146    }
147
148    bool hasInterval(unsigned reg) const {
149      return r2iMap_.count(reg);
150    }
151
152    /// getMBBStartIdx - Return the base index of the first instruction in the
153    /// specified MachineBasicBlock.
154    unsigned getMBBStartIdx(MachineBasicBlock *MBB) const {
155      return getMBBStartIdx(MBB->getNumber());
156    }
157    unsigned getMBBStartIdx(unsigned MBBNo) const {
158      assert(MBBNo < MBB2IdxMap.size() && "Invalid MBB number!");
159      return MBB2IdxMap[MBBNo].first;
160    }
161
162    /// getMBBEndIdx - Return the store index of the last instruction in the
163    /// specified MachineBasicBlock.
164    unsigned getMBBEndIdx(MachineBasicBlock *MBB) const {
165      return getMBBEndIdx(MBB->getNumber());
166    }
167    unsigned getMBBEndIdx(unsigned MBBNo) const {
168      assert(MBBNo < MBB2IdxMap.size() && "Invalid MBB number!");
169      return MBB2IdxMap[MBBNo].second;
170    }
171
172    /// getMBBFromIndex - given an index in any instruction of an
173    /// MBB return a pointer the MBB
174    MachineBasicBlock* getMBBFromIndex(unsigned index) const {
175      std::vector<IdxMBBPair>::const_iterator I =
176        std::lower_bound(Idx2MBBMap.begin(), Idx2MBBMap.end(), index);
177      // Take the pair containing the index
178      std::vector<IdxMBBPair>::const_iterator J =
179        ((I != Idx2MBBMap.end() && I->first > index) ||
180         (I == Idx2MBBMap.end() && Idx2MBBMap.size()>0)) ? (I-1): I;
181
182      assert(J != Idx2MBBMap.end() && J->first < index+1 &&
183             index <= getMBBEndIdx(J->second) &&
184             "index does not correspond to an MBB");
185      return J->second;
186    }
187
188    /// getInstructionIndex - returns the base index of instr
189    unsigned getInstructionIndex(MachineInstr* instr) const {
190      Mi2IndexMap::const_iterator it = mi2iMap_.find(instr);
191      assert(it != mi2iMap_.end() && "Invalid instruction!");
192      return it->second;
193    }
194
195    /// getInstructionFromIndex - given an index in any slot of an
196    /// instruction return a pointer the instruction
197    MachineInstr* getInstructionFromIndex(unsigned index) const {
198      index /= InstrSlots::NUM; // convert index to vector index
199      assert(index < i2miMap_.size() &&
200             "index does not correspond to an instruction");
201      return i2miMap_[index];
202    }
203
204    /// conflictsWithPhysRegDef - Returns true if the specified register
205    /// is defined during the duration of the specified interval.
206    bool conflictsWithPhysRegDef(const LiveInterval &li, VirtRegMap &vrm,
207                                 unsigned reg);
208
209    /// findLiveInMBBs - Given a live range, if the value of the range
210    /// is live in any MBB returns true as well as the list of basic blocks
211    /// where the value is live in.
212    bool findLiveInMBBs(const LiveRange &LR,
213                        SmallVectorImpl<MachineBasicBlock*> &MBBs) const;
214
215    // Interval creation
216
217    LiveInterval &getOrCreateInterval(unsigned reg) {
218      Reg2IntervalMap::iterator I = r2iMap_.find(reg);
219      if (I == r2iMap_.end())
220        I = r2iMap_.insert(I, std::make_pair(reg, createInterval(reg)));
221      return I->second;
222    }
223
224    // Interval removal
225
226    void removeInterval(unsigned Reg) {
227      r2iMap_.erase(Reg);
228    }
229
230    /// isRemoved - returns true if the specified machine instr has been
231    /// removed.
232    bool isRemoved(MachineInstr* instr) const {
233      return !mi2iMap_.count(instr);
234    }
235
236    /// RemoveMachineInstrFromMaps - This marks the specified machine instr as
237    /// deleted.
238    void RemoveMachineInstrFromMaps(MachineInstr *MI) {
239      // remove index -> MachineInstr and
240      // MachineInstr -> index mappings
241      Mi2IndexMap::iterator mi2i = mi2iMap_.find(MI);
242      if (mi2i != mi2iMap_.end()) {
243        i2miMap_[mi2i->second/InstrSlots::NUM] = 0;
244        mi2iMap_.erase(mi2i);
245      }
246    }
247
248    /// ReplaceMachineInstrInMaps - Replacing a machine instr with a new one in
249    /// maps used by register allocator.
250    void ReplaceMachineInstrInMaps(MachineInstr *MI, MachineInstr *NewMI) {
251      Mi2IndexMap::iterator mi2i = mi2iMap_.find(MI);
252      if (mi2i == mi2iMap_.end())
253        return;
254      i2miMap_[mi2i->second/InstrSlots::NUM] = NewMI;
255      Mi2IndexMap::iterator it = mi2iMap_.find(MI);
256      assert(it != mi2iMap_.end() && "Invalid instruction!");
257      unsigned Index = it->second;
258      mi2iMap_.erase(it);
259      mi2iMap_[NewMI] = Index;
260    }
261
262    BumpPtrAllocator& getVNInfoAllocator() { return VNInfoAllocator; }
263
264    /// getVNInfoSourceReg - Helper function that parses the specified VNInfo
265    /// copy field and returns the source register that defines it.
266    unsigned getVNInfoSourceReg(const VNInfo *VNI) const;
267
268    virtual void getAnalysisUsage(AnalysisUsage &AU) const;
269    virtual void releaseMemory();
270
271    /// runOnMachineFunction - pass entry point
272    virtual bool runOnMachineFunction(MachineFunction&);
273
274    /// print - Implement the dump method.
275    virtual void print(std::ostream &O, const Module* = 0) const;
276    void print(std::ostream *O, const Module* M = 0) const {
277      if (O) print(*O, M);
278    }
279
280    /// addIntervalsForSpills - Create new intervals for spilled defs / uses of
281    /// the given interval.
282    std::vector<LiveInterval*>
283    addIntervalsForSpills(const LiveInterval& i,
284                          const MachineLoopInfo *loopInfo, VirtRegMap& vrm);
285
286    /// spillPhysRegAroundRegDefsUses - Spill the specified physical register
287    /// around all defs and uses of the specified interval.
288    void spillPhysRegAroundRegDefsUses(const LiveInterval &li,
289                                       unsigned PhysReg, VirtRegMap &vrm);
290
291    /// isReMaterializable - Returns true if every definition of MI of every
292    /// val# of the specified interval is re-materializable. Also returns true
293    /// by reference if all of the defs are load instructions.
294    bool isReMaterializable(const LiveInterval &li, bool &isLoad);
295
296    /// getRepresentativeReg - Find the largest super register of the specified
297    /// physical register.
298    unsigned getRepresentativeReg(unsigned Reg) const;
299
300    /// getNumConflictsWithPhysReg - Return the number of uses and defs of the
301    /// specified interval that conflicts with the specified physical register.
302    unsigned getNumConflictsWithPhysReg(const LiveInterval &li,
303                                        unsigned PhysReg) const;
304
305  private:
306    /// computeIntervals - Compute live intervals.
307    void computeIntervals();
308
309    /// handleRegisterDef - update intervals for a register def
310    /// (calls handlePhysicalRegisterDef and
311    /// handleVirtualRegisterDef)
312    void handleRegisterDef(MachineBasicBlock *MBB,
313                           MachineBasicBlock::iterator MI, unsigned MIIdx,
314                           unsigned reg);
315
316    /// handleVirtualRegisterDef - update intervals for a virtual
317    /// register def
318    void handleVirtualRegisterDef(MachineBasicBlock *MBB,
319                                  MachineBasicBlock::iterator MI,
320                                  unsigned MIIdx,
321                                  LiveInterval& interval);
322
323    /// handlePhysicalRegisterDef - update intervals for a physical register
324    /// def.
325    void handlePhysicalRegisterDef(MachineBasicBlock* mbb,
326                                   MachineBasicBlock::iterator mi,
327                                   unsigned MIIdx,
328                                   LiveInterval &interval,
329                                   MachineInstr *CopyMI);
330
331    /// handleLiveInRegister - Create interval for a livein register.
332    void handleLiveInRegister(MachineBasicBlock* mbb,
333                              unsigned MIIdx,
334                              LiveInterval &interval, bool isAlias = false);
335
336    /// getReMatImplicitUse - If the remat definition MI has one (for now, we
337    /// only allow one) virtual register operand, then its uses are implicitly
338    /// using the register. Returns the virtual register.
339    unsigned getReMatImplicitUse(const LiveInterval &li,
340                                 MachineInstr *MI) const;
341
342    /// isValNoAvailableAt - Return true if the val# of the specified interval
343    /// which reaches the given instruction also reaches the specified use
344    /// index.
345    bool isValNoAvailableAt(const LiveInterval &li, MachineInstr *MI,
346                            unsigned UseIdx) const;
347
348    /// isReMaterializable - Returns true if the definition MI of the specified
349    /// val# of the specified interval is re-materializable. Also returns true
350    /// by reference if the def is a load.
351    bool isReMaterializable(const LiveInterval &li, const VNInfo *ValNo,
352                            MachineInstr *MI, bool &isLoad);
353
354    /// tryFoldMemoryOperand - Attempts to fold either a spill / restore from
355    /// slot / to reg or any rematerialized load into ith operand of specified
356    /// MI. If it is successul, MI is updated with the newly created MI and
357    /// returns true.
358    bool tryFoldMemoryOperand(MachineInstr* &MI, VirtRegMap &vrm,
359                              MachineInstr *DefMI, unsigned InstrIdx,
360                              SmallVector<unsigned, 2> &Ops,
361                              bool isSS, int Slot, unsigned Reg);
362
363    /// canFoldMemoryOperand - Return true if the specified load / store
364    /// folding is possible.
365    bool canFoldMemoryOperand(MachineInstr *MI,
366                              SmallVector<unsigned, 2> &Ops,
367                              bool ReMatLoadSS) const;
368
369    /// anyKillInMBBAfterIdx - Returns true if there is a kill of the specified
370    /// VNInfo that's after the specified index but is within the basic block.
371    bool anyKillInMBBAfterIdx(const LiveInterval &li, const VNInfo *VNI,
372                              MachineBasicBlock *MBB, unsigned Idx) const;
373
374    /// intervalIsInOneMBB - Returns true if the specified interval is entirely
375    /// within a single basic block.
376    bool intervalIsInOneMBB(const LiveInterval &li) const;
377
378    /// hasAllocatableSuperReg - Return true if the specified physical register
379    /// has any super register that's allocatable.
380    bool hasAllocatableSuperReg(unsigned Reg) const;
381
382    /// SRInfo - Spill / restore info.
383    struct SRInfo {
384      int index;
385      unsigned vreg;
386      bool canFold;
387      SRInfo(int i, unsigned vr, bool f) : index(i), vreg(vr), canFold(f) {};
388    };
389
390    bool alsoFoldARestore(int Id, int index, unsigned vr,
391                          BitVector &RestoreMBBs,
392                          std::map<unsigned,std::vector<SRInfo> >&RestoreIdxes);
393    void eraseRestoreInfo(int Id, int index, unsigned vr,
394                          BitVector &RestoreMBBs,
395                          std::map<unsigned,std::vector<SRInfo> >&RestoreIdxes);
396
397    /// rewriteImplicitOps - Rewrite implicit use operands of MI (i.e. uses of
398    /// interval on to-be re-materialized operands of MI) with new register.
399    void rewriteImplicitOps(const LiveInterval &li,
400                           MachineInstr *MI, unsigned NewVReg, VirtRegMap &vrm);
401
402    /// rewriteInstructionForSpills, rewriteInstructionsForSpills - Helper
403    /// functions for addIntervalsForSpills to rewrite uses / defs for the given
404    /// live range.
405    bool rewriteInstructionForSpills(const LiveInterval &li, const VNInfo *VNI,
406        bool TrySplit, unsigned index, unsigned end, MachineInstr *MI,
407        MachineInstr *OrigDefMI, MachineInstr *DefMI, unsigned Slot, int LdSlot,
408        bool isLoad, bool isLoadSS, bool DefIsReMat, bool CanDelete,
409        VirtRegMap &vrm, const TargetRegisterClass* rc,
410        SmallVector<int, 4> &ReMatIds, const MachineLoopInfo *loopInfo,
411        unsigned &NewVReg, unsigned ImpUse, bool &HasDef, bool &HasUse,
412        std::map<unsigned,unsigned> &MBBVRegsMap,
413        std::vector<LiveInterval*> &NewLIs);
414    void rewriteInstructionsForSpills(const LiveInterval &li, bool TrySplit,
415        LiveInterval::Ranges::const_iterator &I,
416        MachineInstr *OrigDefMI, MachineInstr *DefMI, unsigned Slot, int LdSlot,
417        bool isLoad, bool isLoadSS, bool DefIsReMat, bool CanDelete,
418        VirtRegMap &vrm, const TargetRegisterClass* rc,
419        SmallVector<int, 4> &ReMatIds, const MachineLoopInfo *loopInfo,
420        BitVector &SpillMBBs,
421        std::map<unsigned,std::vector<SRInfo> > &SpillIdxes,
422        BitVector &RestoreMBBs,
423        std::map<unsigned,std::vector<SRInfo> > &RestoreIdxes,
424        std::map<unsigned,unsigned> &MBBVRegsMap,
425        std::vector<LiveInterval*> &NewLIs);
426
427    static LiveInterval createInterval(unsigned Reg);
428
429    void printRegName(unsigned reg) const;
430  };
431
432} // End llvm namespace
433
434#endif
435