1 //===-- SimpleRegisterCoalescing.h - Register Coalescing --------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements a simple register copy coalescing phase.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_CODEGEN_SIMPLE_REGISTER_COALESCING_H
15 #define LLVM_CODEGEN_SIMPLE_REGISTER_COALESCING_H
17 #include "llvm/CodeGen/MachineFunctionPass.h"
18 #include "llvm/CodeGen/LiveInterval.h"
19 #include "llvm/CodeGen/LiveIntervalAnalysis.h"
20 #include "llvm/CodeGen/RegisterCoalescer.h"
21 #include "llvm/ADT/BitVector.h"
22 #include "llvm/ADT/IndexedMap.h"
26 class SimpleRegisterCoalescing;
29 class TargetInstrInfo;
33 /// CopyRec - Representation for copy instructions in coalescer queue.
37 unsigned SrcReg, DstReg;
40 CopyRec(MachineInstr *mi, unsigned src, unsigned dst, unsigned depth,
42 : MI(mi), SrcReg(src), DstReg(dst), LoopDepth(depth), isBackEdge(be) {};
45 template<class SF> class JoinPriorityQueue;
47 /// CopyRecSort - Sorting function for coalescer queue.
49 struct CopyRecSort : public std::binary_function<CopyRec,CopyRec,bool> {
50 JoinPriorityQueue<CopyRecSort> *JPQ;
51 CopyRecSort(JoinPriorityQueue<CopyRecSort> *jpq) : JPQ(jpq) {}
52 CopyRecSort(const CopyRecSort &RHS) : JPQ(RHS.JPQ) {}
53 bool operator()(CopyRec left, CopyRec right) const;
56 /// JoinQueue - A priority queue of copy instructions the coalescer is
59 class JoinPriorityQueue {
60 SimpleRegisterCoalescing *Rc;
61 std::priority_queue<CopyRec, std::vector<CopyRec>, SF> Queue;
64 JoinPriorityQueue(SimpleRegisterCoalescing *rc) : Rc(rc), Queue(SF(this)) {}
66 bool empty() const { return Queue.empty(); }
67 void push(CopyRec R) { Queue.push(R); }
69 if (empty()) return CopyRec(0, 0, 0, 0, false);
70 CopyRec R = Queue.top();
75 // Callbacks to SimpleRegisterCoalescing.
76 unsigned getRepIntervalSize(unsigned Reg);
79 class SimpleRegisterCoalescing : public MachineFunctionPass,
80 public RegisterCoalescer {
82 const TargetMachine* tm_;
83 const MRegisterInfo* mri_;
84 const TargetInstrInfo* tii_;
87 const LoopInfo* loopInfo;
89 BitVector allocatableRegs_;
90 DenseMap<const TargetRegisterClass*, BitVector> allocatableRCRegs_;
92 /// r2rMap_ - Map from register to its representative register.
94 IndexedMap<unsigned> r2rMap_;
96 /// r2rRevMap_ - Reverse of r2rRevMap_, i.e. Map from register to all
97 /// the registers it represent.
98 IndexedMap<std::vector<unsigned> > r2rRevMap_;
100 /// JoinQueue - A priority queue of copy instructions the coalescer is
101 /// going to process.
102 JoinPriorityQueue<CopyRecSort> *JoinQueue;
104 /// JoinedLIs - Keep track which register intervals have been coalesced
105 /// with other intervals.
108 /// SubRegIdxes - Keep track of sub-register and indexes.
110 SmallVector<std::pair<unsigned, unsigned>, 32> SubRegIdxes;
112 /// JoinedCopies - Keep track of copies eliminated due to coalescing.
114 SmallPtrSet<MachineInstr*, 32> JoinedCopies;
117 static char ID; // Pass identifcation, replacement for typeid
118 SimpleRegisterCoalescing() : MachineFunctionPass((intptr_t)&ID) {}
130 virtual void getAnalysisUsage(AnalysisUsage &AU) const;
131 virtual void releaseMemory();
133 /// runOnMachineFunction - pass entry point
134 virtual bool runOnMachineFunction(MachineFunction&);
136 bool coalesceFunction(MachineFunction &mf, RegallocQuery &) {
137 // This runs as an independent pass, so don't do anything.
141 /// getRepIntervalSize - Called from join priority queue sorting function.
142 /// It returns the size of the interval that represent the given register.
143 unsigned getRepIntervalSize(unsigned Reg) {
145 if (!li_->hasInterval(Reg))
147 return li_->getInterval(Reg).getSize();
150 /// print - Implement the dump method.
151 virtual void print(std::ostream &O, const Module* = 0) const;
152 void print(std::ostream *O, const Module* M = 0) const {
157 /// joinIntervals - join compatible live intervals
158 void joinIntervals();
160 /// CopyCoalesceInMBB - Coalesce copies in the specified MBB, putting
161 /// copies that cannot yet be coalesced into the "TryAgain" list.
162 void CopyCoalesceInMBB(MachineBasicBlock *MBB,
163 std::vector<CopyRec> &TryAgain);
165 /// JoinCopy - Attempt to join intervals corresponding to SrcReg/DstReg,
166 /// which are the src/dst of the copy instruction CopyMI. This returns true
167 /// if the copy was successfully coalesced away. If it is not currently
168 /// possible to coalesce this interval, but it may be possible if other
169 /// things get coalesced, then it returns true by reference in 'Again'.
170 bool JoinCopy(CopyRec TheCopy, bool &Again);
172 /// JoinIntervals - Attempt to join these two intervals. On failure, this
173 /// returns false. Otherwise, if one of the intervals being joined is a
174 /// physreg, this method always canonicalizes DestInt to be it. The output
175 /// "SrcInt" will not have been modified, so we can use this information
176 /// below to update aliases.
177 bool JoinIntervals(LiveInterval &LHS, LiveInterval &RHS, bool &Swapped);
179 /// SimpleJoin - Attempt to join the specified interval into this one. The
180 /// caller of this method must guarantee that the RHS only contains a single
181 /// value number and that the RHS is not defined by a copy from this
182 /// interval. This returns false if the intervals are not joinable, or it
183 /// joins them and returns true.
184 bool SimpleJoin(LiveInterval &LHS, LiveInterval &RHS);
186 /// Return true if the two specified registers belong to different
187 /// register classes. The registers may be either phys or virt regs.
188 bool differingRegisterClasses(unsigned RegA, unsigned RegB) const;
191 bool AdjustCopiesBackFrom(LiveInterval &IntA, LiveInterval &IntB,
192 MachineInstr *CopyMI);
194 /// AddSubRegIdxPairs - Recursively mark all the registers represented by the
195 /// specified register as sub-registers. The recursion level is expected to be
197 void AddSubRegIdxPairs(unsigned Reg, unsigned SubIdx);
199 /// isBackEdgeCopy - Returns true if CopyMI is a back edge copy.
201 bool isBackEdgeCopy(MachineInstr *CopyMI, unsigned DstReg);
203 /// lastRegisterUse - Returns the last use of the specific register between
204 /// cycles Start and End. It also returns the use operand by reference. It
205 /// returns NULL if there are no uses.
206 MachineInstr *lastRegisterUse(unsigned Start, unsigned End, unsigned Reg,
207 MachineOperand *&MOU);
209 /// findDefOperand - Returns the MachineOperand that is a def of the specific
210 /// register. It returns NULL if the def is not found.
211 MachineOperand *findDefOperand(MachineInstr *MI, unsigned Reg);
213 /// unsetRegisterKill - Unset IsKill property of all uses of the specific
214 /// register of the specific instruction.
215 void unsetRegisterKill(MachineInstr *MI, unsigned Reg);
217 /// unsetRegisterKills - Unset IsKill property of all uses of specific register
218 /// between cycles Start and End.
219 void unsetRegisterKills(unsigned Start, unsigned End, unsigned Reg);
221 /// hasRegisterDef - True if the instruction defines the specific register.
223 bool hasRegisterDef(MachineInstr *MI, unsigned Reg);
225 /// rep - returns the representative of this register
226 unsigned rep(unsigned Reg) {
227 unsigned Rep = r2rMap_[Reg];
229 return r2rMap_[Reg] = rep(Rep);
233 void printRegName(unsigned reg) const;
236 } // End llvm namespace