blob: 110b7fc1fe158e4234ef5315e44d8005648dee23 [file] [log] [blame]
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +00001//===-- RegAllocFast.cpp - A fast register allocator for debug code -------===//
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 register allocator allocates registers to a basic block at a time,
11// attempting to keep values in registers and reusing registers as appropriate.
12//
13//===----------------------------------------------------------------------===//
14
15#define DEBUG_TYPE "regalloc"
16#include "llvm/BasicBlock.h"
17#include "llvm/CodeGen/MachineFunctionPass.h"
18#include "llvm/CodeGen/MachineInstr.h"
19#include "llvm/CodeGen/MachineFrameInfo.h"
20#include "llvm/CodeGen/MachineRegisterInfo.h"
21#include "llvm/CodeGen/Passes.h"
22#include "llvm/CodeGen/RegAllocRegistry.h"
23#include "llvm/Target/TargetInstrInfo.h"
24#include "llvm/Target/TargetMachine.h"
25#include "llvm/Support/CommandLine.h"
26#include "llvm/Support/Debug.h"
27#include "llvm/Support/ErrorHandling.h"
28#include "llvm/Support/raw_ostream.h"
29#include "llvm/ADT/DenseMap.h"
30#include "llvm/ADT/IndexedMap.h"
31#include "llvm/ADT/SmallSet.h"
32#include "llvm/ADT/SmallVector.h"
33#include "llvm/ADT/Statistic.h"
34#include "llvm/ADT/STLExtras.h"
35#include <algorithm>
36using namespace llvm;
37
38STATISTIC(NumStores, "Number of stores added");
39STATISTIC(NumLoads , "Number of loads added");
40
41static RegisterRegAlloc
42 fastRegAlloc("fast", "fast register allocator", createFastRegisterAllocator);
43
44namespace {
45 class RAFast : public MachineFunctionPass {
46 public:
47 static char ID;
48 RAFast() : MachineFunctionPass(&ID), StackSlotForVirtReg(-1) {}
49 private:
50 const TargetMachine *TM;
51 MachineFunction *MF;
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +000052 MachineRegisterInfo *MRI;
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +000053 const TargetRegisterInfo *TRI;
54 const TargetInstrInfo *TII;
55
56 // StackSlotForVirtReg - Maps virtual regs to the frame index where these
57 // values are spilled.
58 IndexedMap<int, VirtReg2IndexFunctor> StackSlotForVirtReg;
59
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +000060 // Everything we know about a live virtual register.
61 struct LiveReg {
Jakob Stoklund Olesen210e2af2010-05-11 23:24:47 +000062 MachineInstr *LastUse; // Last instr to use reg.
63 unsigned PhysReg; // Currently held here.
64 unsigned short LastOpNum; // OpNum on LastUse.
65 bool Dirty; // Register needs spill.
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +000066
Jakob Stoklund Olesen210e2af2010-05-11 23:24:47 +000067 LiveReg(unsigned p=0) : LastUse(0), PhysReg(p), LastOpNum(0),
68 Dirty(false) {
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +000069 assert(p && "Don't create LiveRegs without a PhysReg");
70 }
71 };
72
73 typedef DenseMap<unsigned, LiveReg> LiveRegMap;
74
75 // LiveVirtRegs - This map contains entries for each virtual register
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +000076 // that is currently available in a physical register.
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +000077 LiveRegMap LiveVirtRegs;
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +000078
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +000079 // RegState - Track the state of a physical register.
80 enum RegState {
81 // A disabled register is not available for allocation, but an alias may
82 // be in use. A register can only be moved out of the disabled state if
83 // all aliases are disabled.
84 regDisabled,
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +000085
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +000086 // A free register is not currently in use and can be allocated
87 // immediately without checking aliases.
88 regFree,
89
90 // A reserved register has been assigned expolicitly (e.g., setting up a
91 // call parameter), and it remains reserved until it is used.
92 regReserved
93
94 // A register state may also be a virtual register number, indication that
95 // the physical register is currently allocated to a virtual register. In
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +000096 // that case, LiveVirtRegs contains the inverse mapping.
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +000097 };
98
99 // PhysRegState - One of the RegState enums, or a virtreg.
100 std::vector<unsigned> PhysRegState;
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000101
102 // UsedInInstr - BitVector of physregs that are used in the current
103 // instruction, and so cannot be allocated.
104 BitVector UsedInInstr;
105
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000106 // ReservedRegs - vector of reserved physical registers.
107 BitVector ReservedRegs;
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000108
109 public:
110 virtual const char *getPassName() const {
111 return "Fast Register Allocator";
112 }
113
114 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
115 AU.setPreservesCFG();
116 AU.addRequiredID(PHIEliminationID);
117 AU.addRequiredID(TwoAddressInstructionPassID);
118 MachineFunctionPass::getAnalysisUsage(AU);
119 }
120
121 private:
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000122 bool runOnMachineFunction(MachineFunction &Fn);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000123 void AllocateBasicBlock(MachineBasicBlock &MBB);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000124 int getStackSpaceFor(unsigned VirtReg, const TargetRegisterClass *RC);
Jakob Stoklund Olesen804291e2010-05-12 18:46:03 +0000125 void addKillFlag(LiveRegMap::iterator i);
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000126 void killVirtReg(LiveRegMap::iterator i);
Jakob Stoklund Olesen804291e2010-05-12 18:46:03 +0000127 void killVirtReg(unsigned VirtReg);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000128 void spillVirtReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000129 unsigned VirtReg, bool isKill);
130 void killPhysReg(unsigned PhysReg);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000131 void spillPhysReg(MachineBasicBlock &MBB, MachineInstr *I,
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000132 unsigned PhysReg, bool isKill);
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000133 LiveRegMap::iterator assignVirtToPhysReg(unsigned VirtReg,
134 unsigned PhysReg);
135 LiveRegMap::iterator allocVirtReg(MachineBasicBlock &MBB, MachineInstr *MI,
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000136 unsigned VirtReg, unsigned Hint);
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000137 unsigned defineVirtReg(MachineBasicBlock &MBB, MachineInstr *MI,
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000138 unsigned OpNum, unsigned VirtReg, unsigned Hint);
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000139 unsigned reloadVirtReg(MachineBasicBlock &MBB, MachineInstr *MI,
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000140 unsigned OpNum, unsigned VirtReg, unsigned Hint);
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000141 void reservePhysReg(MachineBasicBlock &MBB, MachineInstr *MI,
142 unsigned PhysReg);
143 void spillAll(MachineBasicBlock &MBB, MachineInstr *MI);
144 void setPhysReg(MachineOperand &MO, unsigned PhysReg);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000145 };
146 char RAFast::ID = 0;
147}
148
149/// getStackSpaceFor - This allocates space for the specified virtual register
150/// to be held on the stack.
151int RAFast::getStackSpaceFor(unsigned VirtReg, const TargetRegisterClass *RC) {
152 // Find the location Reg would belong...
153 int SS = StackSlotForVirtReg[VirtReg];
154 if (SS != -1)
155 return SS; // Already has space allocated?
156
157 // Allocate a new stack object for this spill location...
158 int FrameIdx = MF->getFrameInfo()->CreateSpillStackObject(RC->getSize(),
159 RC->getAlignment());
160
161 // Assign the slot.
162 StackSlotForVirtReg[VirtReg] = FrameIdx;
163 return FrameIdx;
164}
165
Jakob Stoklund Olesen804291e2010-05-12 18:46:03 +0000166/// addKillFlag - Set kill flags on last use of a virtual register.
167void RAFast::addKillFlag(LiveRegMap::iterator lri) {
168 assert(lri != LiveVirtRegs.end() && "Killing unmapped virtual register");
169 const LiveReg &LR = lri->second;
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000170 if (LR.LastUse) {
171 MachineOperand &MO = LR.LastUse->getOperand(LR.LastOpNum);
Jakob Stoklund Olesen804291e2010-05-12 18:46:03 +0000172 if (MO.isDef())
173 MO.setIsDead();
174 else if (!LR.LastUse->isRegTiedToDefOperand(LR.LastOpNum))
175 MO.setIsKill();
176 DEBUG(dbgs() << " %reg" << lri->first << " killed: " << *LR.LastUse);
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000177 }
Jakob Stoklund Olesen804291e2010-05-12 18:46:03 +0000178}
179
180/// killVirtReg - Mark virtreg as no longer available.
181void RAFast::killVirtReg(LiveRegMap::iterator lri) {
182 addKillFlag(lri);
183 const LiveReg &LR = lri->second;
184 assert(PhysRegState[LR.PhysReg] == lri->first && "Broken RegState mapping");
185 PhysRegState[LR.PhysReg] = regFree;
186 LiveVirtRegs.erase(lri);
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000187}
188
189/// killVirtReg - Mark virtreg as no longer available.
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000190void RAFast::killVirtReg(unsigned VirtReg) {
191 assert(TargetRegisterInfo::isVirtualRegister(VirtReg) &&
192 "killVirtReg needs a virtual register");
193 DEBUG(dbgs() << " Killing %reg" << VirtReg << "\n");
Jakob Stoklund Olesen1a1ad572010-05-12 00:11:19 +0000194 LiveRegMap::iterator lri = LiveVirtRegs.find(VirtReg);
195 if (lri != LiveVirtRegs.end())
196 killVirtReg(lri);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000197}
198
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000199/// spillVirtReg - This method spills the value specified by VirtReg into the
200/// corresponding stack slot if needed. If isKill is set, the register is also
201/// killed.
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000202void RAFast::spillVirtReg(MachineBasicBlock &MBB,
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000203 MachineBasicBlock::iterator MI,
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000204 unsigned VirtReg, bool isKill) {
205 assert(TargetRegisterInfo::isVirtualRegister(VirtReg) &&
206 "Spilling a physical register is illegal!");
Jakob Stoklund Olesen1a1ad572010-05-12 00:11:19 +0000207 LiveRegMap::iterator lri = LiveVirtRegs.find(VirtReg);
208 assert(lri != LiveVirtRegs.end() && "Spilling unmapped virtual register");
209 LiveReg &LR = lri->second;
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000210 assert(PhysRegState[LR.PhysReg] == VirtReg && "Broken RegState mapping");
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000211
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000212 // If this physreg is used by the instruction, we want to kill it on the
213 // instruction, not on the spill.
214 bool spillKill = isKill && LR.LastUse != MI;
215
Jakob Stoklund Olesen210e2af2010-05-11 23:24:47 +0000216 if (LR.Dirty) {
217 LR.Dirty = false;
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000218 DEBUG(dbgs() << " Spilling register " << TRI->getName(LR.PhysReg)
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000219 << " containing %reg" << VirtReg);
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000220 const TargetRegisterClass *RC = MRI->getRegClass(VirtReg);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000221 int FrameIndex = getStackSpaceFor(VirtReg, RC);
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000222 DEBUG(dbgs() << " to stack slot #" << FrameIndex << "\n");
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000223 TII->storeRegToStackSlot(MBB, MI, LR.PhysReg, spillKill,
224 FrameIndex, RC, TRI);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000225 ++NumStores; // Update statistics
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000226
227 if (spillKill)
Jakob Stoklund Olesen210e2af2010-05-11 23:24:47 +0000228 LR.LastUse = 0; // Don't kill register again
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000229 else if (!isKill) {
230 MachineInstr *Spill = llvm::prior(MI);
Jakob Stoklund Olesen210e2af2010-05-11 23:24:47 +0000231 LR.LastUse = Spill;
232 LR.LastOpNum = Spill->findRegisterUseOperandIdx(LR.PhysReg);
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000233 }
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000234 }
235
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000236 if (isKill)
Jakob Stoklund Olesen1a1ad572010-05-12 00:11:19 +0000237 killVirtReg(lri);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000238}
239
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000240/// spillAll - Spill all dirty virtregs without killing them.
241void RAFast::spillAll(MachineBasicBlock &MBB, MachineInstr *MI) {
242 SmallVector<unsigned, 16> Dirty;
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000243 for (LiveRegMap::iterator i = LiveVirtRegs.begin(),
244 e = LiveVirtRegs.end(); i != e; ++i)
Jakob Stoklund Olesen210e2af2010-05-11 23:24:47 +0000245 if (i->second.Dirty)
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000246 Dirty.push_back(i->first);
247 for (unsigned i = 0, e = Dirty.size(); i != e; ++i)
248 spillVirtReg(MBB, MI, Dirty[i], false);
249}
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000250
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000251/// killPhysReg - Kill any virtual register aliased by PhysReg.
252void RAFast::killPhysReg(unsigned PhysReg) {
253 // Fast path for the normal case.
254 switch (unsigned VirtReg = PhysRegState[PhysReg]) {
255 case regDisabled:
256 break;
257 case regFree:
258 return;
259 case regReserved:
260 PhysRegState[PhysReg] = regFree;
261 return;
262 default:
263 killVirtReg(VirtReg);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000264 return;
265 }
266
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000267 // This is a disabled register, we have to check aliases.
268 for (const unsigned *AS = TRI->getAliasSet(PhysReg);
269 unsigned Alias = *AS; ++AS) {
270 switch (unsigned VirtReg = PhysRegState[Alias]) {
271 case regDisabled:
272 case regFree:
273 break;
274 case regReserved:
275 PhysRegState[Alias] = regFree;
276 break;
277 default:
278 killVirtReg(VirtReg);
279 break;
280 }
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000281 }
282}
283
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000284/// spillPhysReg - Spill any dirty virtual registers that aliases PhysReg. If
285/// isKill is set, they are also killed.
286void RAFast::spillPhysReg(MachineBasicBlock &MBB, MachineInstr *MI,
287 unsigned PhysReg, bool isKill) {
288 switch (unsigned VirtReg = PhysRegState[PhysReg]) {
289 case regDisabled:
290 break;
291 case regFree:
292 return;
293 case regReserved:
294 if (isKill)
295 PhysRegState[PhysReg] = regFree;
296 return;
297 default:
298 spillVirtReg(MBB, MI, VirtReg, isKill);
299 return;
300 }
301
302 // This is a disabled register, we have to check aliases.
303 for (const unsigned *AS = TRI->getAliasSet(PhysReg);
304 unsigned Alias = *AS; ++AS) {
305 switch (unsigned VirtReg = PhysRegState[Alias]) {
306 case regDisabled:
307 case regFree:
308 break;
309 case regReserved:
310 if (isKill)
311 PhysRegState[Alias] = regFree;
312 break;
313 default:
314 spillVirtReg(MBB, MI, VirtReg, isKill);
315 break;
316 }
317 }
318}
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000319
320/// assignVirtToPhysReg - This method updates local state so that we know
321/// that PhysReg is the proper container for VirtReg now. The physical
322/// register must not be used for anything else when this is called.
323///
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000324RAFast::LiveRegMap::iterator
325RAFast::assignVirtToPhysReg(unsigned VirtReg, unsigned PhysReg) {
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000326 DEBUG(dbgs() << " Assigning %reg" << VirtReg << " to "
327 << TRI->getName(PhysReg) << "\n");
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000328 PhysRegState[PhysReg] = VirtReg;
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000329 return LiveVirtRegs.insert(std::make_pair(VirtReg, PhysReg)).first;
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000330}
331
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000332/// allocVirtReg - Allocate a physical register for VirtReg.
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000333RAFast::LiveRegMap::iterator RAFast::allocVirtReg(MachineBasicBlock &MBB,
334 MachineInstr *MI,
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000335 unsigned VirtReg,
336 unsigned Hint) {
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000337 const unsigned spillCost = 100;
338 assert(TargetRegisterInfo::isVirtualRegister(VirtReg) &&
339 "Can only allocate virtual registers");
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000340
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000341 const TargetRegisterClass *RC = MRI->getRegClass(VirtReg);
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000342 TargetRegisterClass::iterator AOB = RC->allocation_order_begin(*MF);
343 TargetRegisterClass::iterator AOE = RC->allocation_order_end(*MF);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000344
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000345 // Ignore invalid hints.
346 if (Hint && (!TargetRegisterInfo::isPhysicalRegister(Hint) ||
347 !RC->contains(Hint) || UsedInInstr.test(Hint)))
348 Hint = 0;
349
350 // If there is no hint, peek at the first use of this register.
351 if (!Hint && !MRI->use_nodbg_empty(VirtReg)) {
352 MachineInstr &MI = *MRI->use_nodbg_begin(VirtReg);
353 unsigned SrcReg, DstReg, SrcSubReg, DstSubReg;
354 // Copy to physreg -> use physreg as hint.
355 if (TII->isMoveInstr(MI, SrcReg, DstReg, SrcSubReg, DstSubReg) &&
356 SrcReg == VirtReg && TargetRegisterInfo::isPhysicalRegister(DstReg) &&
357 RC->contains(DstReg) && !UsedInInstr.test(DstReg)) {
358 Hint = DstReg;
359 DEBUG(dbgs() << " %reg" << VirtReg << " gets hint from " << MI);
360 }
361 }
362
363 // Take hint when possible.
364 if (Hint) {
365 assert(RC->contains(Hint) && !UsedInInstr.test(Hint) &&
366 "Invalid hint should have been cleared");
367 switch(PhysRegState[Hint]) {
368 case regDisabled:
369 case regReserved:
370 break;
371 default:
372 DEBUG(dbgs() << " %reg" << VirtReg << " really wants "
373 << TRI->getName(Hint) << "\n");
374 spillVirtReg(MBB, MI, PhysRegState[Hint], true);
375 // Fall through.
376 case regFree:
377 return assignVirtToPhysReg(VirtReg, Hint);
378 }
379 }
380
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000381 // First try to find a completely free register.
382 unsigned BestCost = 0, BestReg = 0;
383 bool hasDisabled = false;
384 for (TargetRegisterClass::iterator I = AOB; I != AOE; ++I) {
385 unsigned PhysReg = *I;
386 switch(PhysRegState[PhysReg]) {
387 case regDisabled:
388 hasDisabled = true;
389 case regReserved:
390 continue;
391 case regFree:
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000392 if (!UsedInInstr.test(PhysReg))
393 return assignVirtToPhysReg(VirtReg, PhysReg);
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000394 continue;
395 default:
396 // Grab the first spillable register we meet.
Jakob Stoklund Olesen210e2af2010-05-11 23:24:47 +0000397 if (!BestReg && !UsedInInstr.test(PhysReg))
398 BestReg = PhysReg, BestCost = spillCost;
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000399 continue;
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000400 }
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000401 }
402
403 DEBUG(dbgs() << " Allocating %reg" << VirtReg << " from " << RC->getName()
404 << " candidate=" << TRI->getName(BestReg) << "\n");
405
406 // Try to extend the working set for RC if there were any disabled registers.
407 if (hasDisabled && (!BestReg || BestCost >= spillCost)) {
408 for (TargetRegisterClass::iterator I = AOB; I != AOE; ++I) {
409 unsigned PhysReg = *I;
410 if (PhysRegState[PhysReg] != regDisabled || UsedInInstr.test(PhysReg))
411 continue;
412
413 // Calculate the cost of bringing PhysReg into the working set.
414 unsigned Cost=0;
415 bool Impossible = false;
416 for (const unsigned *AS = TRI->getAliasSet(PhysReg);
417 unsigned Alias = *AS; ++AS) {
418 if (UsedInInstr.test(Alias)) {
419 Impossible = true;
420 break;
421 }
422 switch (PhysRegState[Alias]) {
423 case regDisabled:
424 break;
425 case regReserved:
426 Impossible = true;
427 break;
428 case regFree:
429 Cost++;
430 break;
431 default:
Jakob Stoklund Olesen210e2af2010-05-11 23:24:47 +0000432 Cost += spillCost;
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000433 break;
434 }
435 }
436 if (Impossible) continue;
437 DEBUG(dbgs() << " - candidate " << TRI->getName(PhysReg)
438 << " cost=" << Cost << "\n");
439 if (!BestReg || Cost < BestCost) {
440 BestReg = PhysReg;
441 BestCost = Cost;
442 if (Cost < spillCost) break;
443 }
444 }
445 }
446
447 if (BestReg) {
448 // BestCost is 0 when all aliases are already disabled.
449 if (BestCost) {
450 if (PhysRegState[BestReg] != regDisabled)
451 spillVirtReg(MBB, MI, PhysRegState[BestReg], true);
452 else {
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000453 // Make sure all aliases are disabled.
454 for (const unsigned *AS = TRI->getAliasSet(BestReg);
455 unsigned Alias = *AS; ++AS) {
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000456 switch (PhysRegState[Alias]) {
457 case regDisabled:
458 continue;
459 case regFree:
460 PhysRegState[Alias] = regDisabled;
461 break;
462 default:
463 spillVirtReg(MBB, MI, PhysRegState[Alias], true);
464 PhysRegState[Alias] = regDisabled;
465 break;
466 }
467 }
468 }
469 }
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000470 return assignVirtToPhysReg(VirtReg, BestReg);
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000471 }
472
473 // Nothing we can do.
474 std::string msg;
475 raw_string_ostream Msg(msg);
476 Msg << "Ran out of registers during register allocation!";
477 if (MI->isInlineAsm()) {
478 Msg << "\nPlease check your inline asm statement for "
479 << "invalid constraints:\n";
480 MI->print(Msg, TM);
481 }
482 report_fatal_error(Msg.str());
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000483 return LiveVirtRegs.end();
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000484}
485
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000486/// defineVirtReg - Allocate a register for VirtReg and mark it as dirty.
487unsigned RAFast::defineVirtReg(MachineBasicBlock &MBB, MachineInstr *MI,
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000488 unsigned OpNum, unsigned VirtReg, unsigned Hint) {
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000489 assert(TargetRegisterInfo::isVirtualRegister(VirtReg) &&
490 "Not a virtual register");
Jakob Stoklund Olesen1a1ad572010-05-12 00:11:19 +0000491 LiveRegMap::iterator lri = LiveVirtRegs.find(VirtReg);
492 if (lri == LiveVirtRegs.end())
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000493 lri = allocVirtReg(MBB, MI, VirtReg, Hint);
Jakob Stoklund Olesen804291e2010-05-12 18:46:03 +0000494 else
495 addKillFlag(lri); // Kill before redefine.
Jakob Stoklund Olesen1a1ad572010-05-12 00:11:19 +0000496 LiveReg &LR = lri->second;
Jakob Stoklund Olesen210e2af2010-05-11 23:24:47 +0000497 LR.LastUse = MI;
498 LR.LastOpNum = OpNum;
499 LR.Dirty = true;
500 UsedInInstr.set(LR.PhysReg);
501 return LR.PhysReg;
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000502}
503
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000504/// reloadVirtReg - Make sure VirtReg is available in a physreg and return it.
505unsigned RAFast::reloadVirtReg(MachineBasicBlock &MBB, MachineInstr *MI,
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000506 unsigned OpNum, unsigned VirtReg, unsigned Hint) {
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000507 assert(TargetRegisterInfo::isVirtualRegister(VirtReg) &&
508 "Not a virtual register");
Jakob Stoklund Olesen1a1ad572010-05-12 00:11:19 +0000509 LiveRegMap::iterator lri = LiveVirtRegs.find(VirtReg);
510 if (lri == LiveVirtRegs.end()) {
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000511 lri = allocVirtReg(MBB, MI, VirtReg, Hint);
512 const TargetRegisterClass *RC = MRI->getRegClass(VirtReg);
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000513 int FrameIndex = getStackSpaceFor(VirtReg, RC);
514 DEBUG(dbgs() << " Reloading %reg" << VirtReg << " into "
Jakob Stoklund Olesen1a1ad572010-05-12 00:11:19 +0000515 << TRI->getName(lri->second.PhysReg) << "\n");
516 TII->loadRegFromStackSlot(MBB, MI, lri->second.PhysReg, FrameIndex, RC,
517 TRI);
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000518 ++NumLoads;
519 }
Jakob Stoklund Olesen1a1ad572010-05-12 00:11:19 +0000520 LiveReg &LR = lri->second;
Jakob Stoklund Olesen210e2af2010-05-11 23:24:47 +0000521 LR.LastUse = MI;
522 LR.LastOpNum = OpNum;
523 UsedInInstr.set(LR.PhysReg);
524 return LR.PhysReg;
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000525}
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000526
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000527/// reservePhysReg - Mark PhysReg as reserved. This is very similar to
Jakob Stoklund Olesen63e34f62010-05-13 00:19:39 +0000528/// defineVirtReg except the physreg is reserved instead of allocated.
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000529void RAFast::reservePhysReg(MachineBasicBlock &MBB, MachineInstr *MI,
530 unsigned PhysReg) {
Jakob Stoklund Olesen82b07dc2010-05-11 20:30:28 +0000531 UsedInInstr.set(PhysReg);
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000532 switch (unsigned VirtReg = PhysRegState[PhysReg]) {
533 case regDisabled:
534 break;
535 case regFree:
536 PhysRegState[PhysReg] = regReserved;
537 return;
538 case regReserved:
539 return;
540 default:
541 spillVirtReg(MBB, MI, VirtReg, true);
542 PhysRegState[PhysReg] = regReserved;
543 return;
544 }
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000545
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000546 // This is a disabled register, disable all aliases.
547 for (const unsigned *AS = TRI->getAliasSet(PhysReg);
548 unsigned Alias = *AS; ++AS) {
Jakob Stoklund Olesen82b07dc2010-05-11 20:30:28 +0000549 UsedInInstr.set(Alias);
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000550 switch (unsigned VirtReg = PhysRegState[Alias]) {
551 case regDisabled:
552 case regFree:
553 break;
554 case regReserved:
555 // is a super register already reserved?
556 if (TRI->isSuperRegister(PhysReg, Alias))
557 return;
558 break;
559 default:
560 spillVirtReg(MBB, MI, VirtReg, true);
561 break;
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000562 }
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000563 PhysRegState[Alias] = regDisabled;
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000564 }
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000565 PhysRegState[PhysReg] = regReserved;
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000566}
567
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000568// setPhysReg - Change MO the refer the PhysReg, considering subregs.
569void RAFast::setPhysReg(MachineOperand &MO, unsigned PhysReg) {
570 if (unsigned Idx = MO.getSubReg()) {
571 MO.setReg(PhysReg ? TRI->getSubReg(PhysReg, Idx) : 0);
572 MO.setSubReg(0);
573 } else
574 MO.setReg(PhysReg);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000575}
576
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000577void RAFast::AllocateBasicBlock(MachineBasicBlock &MBB) {
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000578 DEBUG(dbgs() << "\nBB#" << MBB.getNumber() << ", "<< MBB.getName() << "\n");
579
580 PhysRegState.assign(TRI->getNumRegs(), regDisabled);
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000581 assert(LiveVirtRegs.empty() && "Mapping not cleared form last block?");
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000582
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000583 MachineBasicBlock::iterator MII = MBB.begin();
584
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000585 // Add live-in registers as live.
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000586 for (MachineBasicBlock::livein_iterator I = MBB.livein_begin(),
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000587 E = MBB.livein_end(); I != E; ++I)
588 reservePhysReg(MBB, MII, *I);
589
590 SmallVector<unsigned, 8> VirtKills, PhysKills, PhysDefs;
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000591
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000592 // Otherwise, sequentially allocate each instruction in the MBB.
593 while (MII != MBB.end()) {
594 MachineInstr *MI = MII++;
595 const TargetInstrDesc &TID = MI->getDesc();
596 DEBUG({
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000597 dbgs() << "\nStarting RegAlloc of: " << *MI << "Working set:";
598 for (unsigned Reg = 1, E = TRI->getNumRegs(); Reg != E; ++Reg) {
599 if (PhysRegState[Reg] == regDisabled) continue;
600 dbgs() << " " << TRI->getName(Reg);
601 switch(PhysRegState[Reg]) {
602 case regFree:
603 break;
604 case regReserved:
605 dbgs() << "(resv)";
606 break;
607 default:
608 dbgs() << "=%reg" << PhysRegState[Reg];
Jakob Stoklund Olesen210e2af2010-05-11 23:24:47 +0000609 if (LiveVirtRegs[PhysRegState[Reg]].Dirty)
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000610 dbgs() << "*";
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000611 assert(LiveVirtRegs[PhysRegState[Reg]].PhysReg == Reg &&
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000612 "Bad inverse map");
613 break;
614 }
615 }
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000616 dbgs() << '\n';
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000617 // Check that LiveVirtRegs is the inverse.
618 for (LiveRegMap::iterator i = LiveVirtRegs.begin(),
619 e = LiveVirtRegs.end(); i != e; ++i) {
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000620 assert(TargetRegisterInfo::isVirtualRegister(i->first) &&
621 "Bad map key");
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000622 assert(TargetRegisterInfo::isPhysicalRegister(i->second.PhysReg) &&
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000623 "Bad map value");
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000624 assert(PhysRegState[i->second.PhysReg] == i->first &&
625 "Bad inverse map");
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000626 }
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000627 });
628
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000629 // Debug values are not allowed to change codegen in any way.
630 if (MI->isDebugValue()) {
631 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
632 MachineOperand &MO = MI->getOperand(i);
633 if (!MO.isReg()) continue;
634 unsigned Reg = MO.getReg();
635 if (!Reg || TargetRegisterInfo::isPhysicalRegister(Reg)) continue;
Jakob Stoklund Olesen1a1ad572010-05-12 00:11:19 +0000636 LiveRegMap::iterator lri = LiveVirtRegs.find(Reg);
637 if (lri != LiveVirtRegs.end())
638 setPhysReg(MO, lri->second.PhysReg);
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000639 else
640 MO.setReg(0); // We can't allocate a physreg for a DebugValue, sorry!
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000641 }
642 // Next instruction.
643 continue;
644 }
645
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000646 // If this is a copy, we may be able to coalesce.
647 unsigned CopySrc, CopyDst, CopySrcSub, CopyDstSub;
648 if (!TII->isMoveInstr(*MI, CopySrc, CopyDst, CopySrcSub, CopyDstSub))
649 CopySrc = CopyDst = 0;
650
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000651 // Track registers used by instruction.
652 UsedInInstr.reset();
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000653 PhysDefs.clear();
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000654
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000655 // First scan.
656 // Mark physreg uses and early clobbers as used.
657 // Collect PhysKills.
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000658 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
659 MachineOperand &MO = MI->getOperand(i);
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000660 if (!MO.isReg()) continue;
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000661
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000662 // FIXME: For now, don't trust kill flags
663 if (MO.isUse()) MO.setIsKill(false);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000664
665 unsigned Reg = MO.getReg();
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000666 if (!Reg || !TargetRegisterInfo::isPhysicalRegister(Reg) ||
667 ReservedRegs.test(Reg)) continue;
668 if (MO.isUse()) {
Jakob Stoklund Olesen63e34f62010-05-13 00:19:39 +0000669#ifndef NDEBUG
670 // We are using a physreg directly. It had better not be clobbered by a
671 // virtreg.
672 assert(PhysRegState[Reg] <= regReserved && "Using clobbered physreg");
673 if (PhysRegState[Reg] == regDisabled)
674 for (const unsigned *AS = TRI->getAliasSet(Reg);
675 unsigned Alias = *AS; ++AS)
676 assert(PhysRegState[Alias] <= regReserved &&
677 "Physreg alias was clobbered");
678#endif
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000679 PhysKills.push_back(Reg); // Any clean physreg use is a kill.
680 UsedInInstr.set(Reg);
681 } else if (MO.isEarlyClobber()) {
682 spillPhysReg(MBB, MI, Reg, true);
683 UsedInInstr.set(Reg);
684 PhysDefs.push_back(Reg);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000685 }
686 }
687
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000688 // Second scan.
689 // Allocate virtreg uses and early clobbers.
690 // Collect VirtKills
691 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
692 MachineOperand &MO = MI->getOperand(i);
693 if (!MO.isReg()) continue;
694 unsigned Reg = MO.getReg();
695 if (!Reg || TargetRegisterInfo::isPhysicalRegister(Reg)) continue;
696 if (MO.isUse()) {
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000697 unsigned PhysReg = reloadVirtReg(MBB, MI, i, Reg, CopyDst);
698 if (CopySrc == Reg)
699 CopySrc = PhysReg;
700 setPhysReg(MO, PhysReg);
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000701 if (MO.isKill())
702 VirtKills.push_back(Reg);
703 } else if (MO.isEarlyClobber()) {
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000704 unsigned PhysReg = defineVirtReg(MBB, MI, i, Reg, 0);
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000705 setPhysReg(MO, PhysReg);
706 PhysDefs.push_back(PhysReg);
707 }
708 }
709
710 // Process virtreg kills
711 for (unsigned i = 0, e = VirtKills.size(); i != e; ++i)
712 killVirtReg(VirtKills[i]);
713 VirtKills.clear();
714
715 // Process physreg kills
716 for (unsigned i = 0, e = PhysKills.size(); i != e; ++i)
717 killPhysReg(PhysKills[i]);
718 PhysKills.clear();
719
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000720 MRI->addPhysRegsUsed(UsedInInstr);
Jakob Stoklund Olesen82b07dc2010-05-11 20:30:28 +0000721
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000722 // Track registers defined by instruction - early clobbers at this point.
723 UsedInInstr.reset();
724 for (unsigned i = 0, e = PhysDefs.size(); i != e; ++i) {
725 unsigned PhysReg = PhysDefs[i];
726 UsedInInstr.set(PhysReg);
727 for (const unsigned *AS = TRI->getAliasSet(PhysReg);
728 unsigned Alias = *AS; ++AS)
729 UsedInInstr.set(Alias);
730 }
731
732 // Third scan.
733 // Allocate defs and collect dead defs.
734 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
735 MachineOperand &MO = MI->getOperand(i);
736 if (!MO.isReg() || !MO.isDef() || !MO.getReg()) continue;
737 unsigned Reg = MO.getReg();
738
739 if (TargetRegisterInfo::isPhysicalRegister(Reg)) {
740 if (ReservedRegs.test(Reg)) continue;
741 if (MO.isImplicit())
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000742 spillPhysReg(MBB, MI, Reg, true);
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000743 else
744 reservePhysReg(MBB, MI, Reg);
745 if (MO.isDead())
746 PhysKills.push_back(Reg);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000747 continue;
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000748 }
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000749 if (MO.isDead())
750 VirtKills.push_back(Reg);
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000751 unsigned PhysReg = defineVirtReg(MBB, MI, i, Reg, CopySrc);
752 if (CopyDst == Reg)
753 CopyDst = PhysReg;
754 setPhysReg(MO, PhysReg);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000755 }
756
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000757 // Spill all dirty virtregs before a call, in case of an exception.
758 if (TID.isCall()) {
759 DEBUG(dbgs() << " Spilling remaining registers before call.\n");
760 spillAll(MBB, MI);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000761 }
762
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000763 // Process virtreg deads.
764 for (unsigned i = 0, e = VirtKills.size(); i != e; ++i)
765 killVirtReg(VirtKills[i]);
766 VirtKills.clear();
767
768 // Process physreg deads.
769 for (unsigned i = 0, e = PhysKills.size(); i != e; ++i)
770 killPhysReg(PhysKills[i]);
771 PhysKills.clear();
Jakob Stoklund Olesen82b07dc2010-05-11 20:30:28 +0000772
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000773 MRI->addPhysRegsUsed(UsedInInstr);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000774 }
775
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000776 // Spill all physical registers holding virtual registers now.
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000777 DEBUG(dbgs() << "Killing live registers at end of block.\n");
778 MachineBasicBlock::iterator MI = MBB.getFirstTerminator();
Jakob Stoklund Olesen76b4d5a2010-05-11 23:24:45 +0000779 while (!LiveVirtRegs.empty())
780 spillVirtReg(MBB, MI, LiveVirtRegs.begin()->first, true);
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000781
782 DEBUG(MBB.dump());
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000783}
784
785/// runOnMachineFunction - Register allocate the whole function
786///
787bool RAFast::runOnMachineFunction(MachineFunction &Fn) {
788 DEBUG(dbgs() << "Machine Function\n");
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000789 DEBUG(Fn.dump());
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000790 MF = &Fn;
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000791 MRI = &MF->getRegInfo();
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000792 TM = &Fn.getTarget();
793 TRI = TM->getRegisterInfo();
794 TII = TM->getInstrInfo();
795
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000796 UsedInInstr.resize(TRI->getNumRegs());
Jakob Stoklund Olesenbbf33b32010-05-11 18:54:45 +0000797 ReservedRegs = TRI->getReservedRegs(*MF);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000798
799 // initialize the virtual->physical register map to have a 'null'
800 // mapping for all virtual registers
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000801 unsigned LastVirtReg = MRI->getLastVirtReg();
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000802 StackSlotForVirtReg.grow(LastVirtReg);
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000803
804 // Loop over all of the basic blocks, eliminating virtual register references
805 for (MachineFunction::iterator MBB = Fn.begin(), MBBe = Fn.end();
806 MBB != MBBe; ++MBB)
807 AllocateBasicBlock(*MBB);
808
Jakob Stoklund Olesen82b07dc2010-05-11 20:30:28 +0000809 // Make sure the set of used physregs is closed under subreg operations.
Jakob Stoklund Olesen4bf4baf2010-05-13 00:19:43 +0000810 MRI->closePhysRegsUsed(*TRI);
Jakob Stoklund Olesen82b07dc2010-05-11 20:30:28 +0000811
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000812 StackSlotForVirtReg.clear();
Jakob Stoklund Olesen00207232010-04-21 18:02:42 +0000813 return true;
814}
815
816FunctionPass *llvm::createFastRegisterAllocator() {
817 return new RAFast();
818}