RegAllocBasic.cpp revision bd1926dfd4fbc8ca09941e00ac507eb5637e9c25
1//===-- RegAllocBasic.cpp - basic register allocator ----------------------===// 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 defines the RABasic function pass, which provides a minimal 11// implementation of the basic register allocator. 12// 13//===----------------------------------------------------------------------===// 14 15#define DEBUG_TYPE "regalloc" 16#include "LiveDebugVariables.h" 17#include "LiveIntervalUnion.h" 18#include "LiveRangeEdit.h" 19#include "RegAllocBase.h" 20#include "RenderMachineFunction.h" 21#include "Spiller.h" 22#include "VirtRegMap.h" 23#include "llvm/ADT/OwningPtr.h" 24#include "llvm/ADT/Statistic.h" 25#include "llvm/Analysis/AliasAnalysis.h" 26#include "llvm/Function.h" 27#include "llvm/PassAnalysisSupport.h" 28#include "llvm/CodeGen/CalcSpillWeights.h" 29#include "llvm/CodeGen/LiveIntervalAnalysis.h" 30#include "llvm/CodeGen/LiveStackAnalysis.h" 31#include "llvm/CodeGen/MachineFunctionPass.h" 32#include "llvm/CodeGen/MachineInstr.h" 33#include "llvm/CodeGen/MachineLoopInfo.h" 34#include "llvm/CodeGen/MachineRegisterInfo.h" 35#include "llvm/CodeGen/Passes.h" 36#include "llvm/CodeGen/RegAllocRegistry.h" 37#include "llvm/CodeGen/RegisterCoalescer.h" 38#include "llvm/Target/TargetMachine.h" 39#include "llvm/Target/TargetOptions.h" 40#include "llvm/Target/TargetRegisterInfo.h" 41#ifndef NDEBUG 42#include "llvm/ADT/SparseBitVector.h" 43#endif 44#include "llvm/Support/Debug.h" 45#include "llvm/Support/ErrorHandling.h" 46#include "llvm/Support/raw_ostream.h" 47#include "llvm/Support/Timer.h" 48 49#include <cstdlib> 50#include <queue> 51 52using namespace llvm; 53 54STATISTIC(NumAssigned , "Number of registers assigned"); 55STATISTIC(NumUnassigned , "Number of registers unassigned"); 56STATISTIC(NumNewQueued , "Number of new live ranges queued"); 57 58static RegisterRegAlloc basicRegAlloc("basic", "basic register allocator", 59 createBasicRegisterAllocator); 60 61// Temporary verification option until we can put verification inside 62// MachineVerifier. 63static cl::opt<bool, true> 64VerifyRegAlloc("verify-regalloc", cl::location(RegAllocBase::VerifyEnabled), 65 cl::desc("Verify during register allocation")); 66 67const char *RegAllocBase::TimerGroupName = "Register Allocation"; 68bool RegAllocBase::VerifyEnabled = false; 69 70namespace { 71 struct CompSpillWeight { 72 bool operator()(LiveInterval *A, LiveInterval *B) const { 73 return A->weight < B->weight; 74 } 75 }; 76} 77 78namespace { 79/// RABasic provides a minimal implementation of the basic register allocation 80/// algorithm. It prioritizes live virtual registers by spill weight and spills 81/// whenever a register is unavailable. This is not practical in production but 82/// provides a useful baseline both for measuring other allocators and comparing 83/// the speed of the basic algorithm against other styles of allocators. 84class RABasic : public MachineFunctionPass, public RegAllocBase 85{ 86 // context 87 MachineFunction *MF; 88 BitVector ReservedRegs; 89 90 // analyses 91 LiveStacks *LS; 92 RenderMachineFunction *RMF; 93 94 // state 95 std::auto_ptr<Spiller> SpillerInstance; 96 std::priority_queue<LiveInterval*, std::vector<LiveInterval*>, 97 CompSpillWeight> Queue; 98public: 99 RABasic(); 100 101 /// Return the pass name. 102 virtual const char* getPassName() const { 103 return "Basic Register Allocator"; 104 } 105 106 /// RABasic analysis usage. 107 virtual void getAnalysisUsage(AnalysisUsage &AU) const; 108 109 virtual void releaseMemory(); 110 111 virtual Spiller &spiller() { return *SpillerInstance; } 112 113 virtual float getPriority(LiveInterval *LI) { return LI->weight; } 114 115 virtual void enqueue(LiveInterval *LI) { 116 Queue.push(LI); 117 } 118 119 virtual LiveInterval *dequeue() { 120 if (Queue.empty()) 121 return 0; 122 LiveInterval *LI = Queue.top(); 123 Queue.pop(); 124 return LI; 125 } 126 127 virtual unsigned selectOrSplit(LiveInterval &VirtReg, 128 SmallVectorImpl<LiveInterval*> &SplitVRegs); 129 130 /// Perform register allocation. 131 virtual bool runOnMachineFunction(MachineFunction &mf); 132 133 static char ID; 134}; 135 136char RABasic::ID = 0; 137 138} // end anonymous namespace 139 140RABasic::RABasic(): MachineFunctionPass(ID) { 141 initializeLiveDebugVariablesPass(*PassRegistry::getPassRegistry()); 142 initializeLiveIntervalsPass(*PassRegistry::getPassRegistry()); 143 initializeSlotIndexesPass(*PassRegistry::getPassRegistry()); 144 initializeStrongPHIEliminationPass(*PassRegistry::getPassRegistry()); 145 initializeRegisterCoalescerAnalysisGroup(*PassRegistry::getPassRegistry()); 146 initializeCalculateSpillWeightsPass(*PassRegistry::getPassRegistry()); 147 initializeLiveStacksPass(*PassRegistry::getPassRegistry()); 148 initializeMachineDominatorTreePass(*PassRegistry::getPassRegistry()); 149 initializeMachineLoopInfoPass(*PassRegistry::getPassRegistry()); 150 initializeVirtRegMapPass(*PassRegistry::getPassRegistry()); 151 initializeRenderMachineFunctionPass(*PassRegistry::getPassRegistry()); 152} 153 154void RABasic::getAnalysisUsage(AnalysisUsage &AU) const { 155 AU.setPreservesCFG(); 156 AU.addRequired<AliasAnalysis>(); 157 AU.addPreserved<AliasAnalysis>(); 158 AU.addRequired<LiveIntervals>(); 159 AU.addPreserved<SlotIndexes>(); 160 AU.addRequired<LiveDebugVariables>(); 161 AU.addPreserved<LiveDebugVariables>(); 162 if (StrongPHIElim) 163 AU.addRequiredID(StrongPHIEliminationID); 164 AU.addRequiredTransitive<RegisterCoalescer>(); 165 AU.addRequired<CalculateSpillWeights>(); 166 AU.addRequired<LiveStacks>(); 167 AU.addPreserved<LiveStacks>(); 168 AU.addRequiredID(MachineDominatorsID); 169 AU.addPreservedID(MachineDominatorsID); 170 AU.addRequired<MachineLoopInfo>(); 171 AU.addPreserved<MachineLoopInfo>(); 172 AU.addRequired<VirtRegMap>(); 173 AU.addPreserved<VirtRegMap>(); 174 DEBUG(AU.addRequired<RenderMachineFunction>()); 175 MachineFunctionPass::getAnalysisUsage(AU); 176} 177 178void RABasic::releaseMemory() { 179 SpillerInstance.reset(0); 180 RegAllocBase::releaseMemory(); 181} 182 183#ifndef NDEBUG 184// Verify each LiveIntervalUnion. 185void RegAllocBase::verify() { 186 LiveVirtRegBitSet VisitedVRegs; 187 OwningArrayPtr<LiveVirtRegBitSet> 188 unionVRegs(new LiveVirtRegBitSet[PhysReg2LiveUnion.numRegs()]); 189 190 // Verify disjoint unions. 191 for (unsigned PhysReg = 0; PhysReg < PhysReg2LiveUnion.numRegs(); ++PhysReg) { 192 DEBUG(PhysReg2LiveUnion[PhysReg].print(dbgs(), TRI)); 193 LiveVirtRegBitSet &VRegs = unionVRegs[PhysReg]; 194 PhysReg2LiveUnion[PhysReg].verify(VRegs); 195 // Union + intersection test could be done efficiently in one pass, but 196 // don't add a method to SparseBitVector unless we really need it. 197 assert(!VisitedVRegs.intersects(VRegs) && "vreg in multiple unions"); 198 VisitedVRegs |= VRegs; 199 } 200 201 // Verify vreg coverage. 202 for (LiveIntervals::iterator liItr = LIS->begin(), liEnd = LIS->end(); 203 liItr != liEnd; ++liItr) { 204 unsigned reg = liItr->first; 205 if (TargetRegisterInfo::isPhysicalRegister(reg)) continue; 206 if (!VRM->hasPhys(reg)) continue; // spilled? 207 unsigned PhysReg = VRM->getPhys(reg); 208 if (!unionVRegs[PhysReg].test(reg)) { 209 dbgs() << "LiveVirtReg " << reg << " not in union " << 210 TRI->getName(PhysReg) << "\n"; 211 llvm_unreachable("unallocated live vreg"); 212 } 213 } 214 // FIXME: I'm not sure how to verify spilled intervals. 215} 216#endif //!NDEBUG 217 218//===----------------------------------------------------------------------===// 219// RegAllocBase Implementation 220//===----------------------------------------------------------------------===// 221 222// Instantiate a LiveIntervalUnion for each physical register. 223void RegAllocBase::LiveUnionArray::init(LiveIntervalUnion::Allocator &allocator, 224 unsigned NRegs) { 225 NumRegs = NRegs; 226 Array = 227 static_cast<LiveIntervalUnion*>(malloc(sizeof(LiveIntervalUnion)*NRegs)); 228 for (unsigned r = 0; r != NRegs; ++r) 229 new(Array + r) LiveIntervalUnion(r, allocator); 230} 231 232void RegAllocBase::init(VirtRegMap &vrm, LiveIntervals &lis) { 233 NamedRegionTimer T("Initialize", TimerGroupName, TimePassesIsEnabled); 234 TRI = &vrm.getTargetRegInfo(); 235 MRI = &vrm.getRegInfo(); 236 VRM = &vrm; 237 LIS = &lis; 238 PhysReg2LiveUnion.init(UnionAllocator, TRI->getNumRegs()); 239 // Cache an interferece query for each physical reg 240 Queries.reset(new LiveIntervalUnion::Query[PhysReg2LiveUnion.numRegs()]); 241} 242 243void RegAllocBase::LiveUnionArray::clear() { 244 if (!Array) 245 return; 246 for (unsigned r = 0; r != NumRegs; ++r) 247 Array[r].~LiveIntervalUnion(); 248 free(Array); 249 NumRegs = 0; 250 Array = 0; 251} 252 253void RegAllocBase::releaseMemory() { 254 PhysReg2LiveUnion.clear(); 255} 256 257// Visit all the live registers. If they are already assigned to a physical 258// register, unify them with the corresponding LiveIntervalUnion, otherwise push 259// them on the priority queue for later assignment. 260void RegAllocBase::seedLiveRegs() { 261 NamedRegionTimer T("Seed Live Regs", TimerGroupName, TimePassesIsEnabled); 262 for (LiveIntervals::iterator I = LIS->begin(), E = LIS->end(); I != E; ++I) { 263 unsigned RegNum = I->first; 264 LiveInterval &VirtReg = *I->second; 265 if (TargetRegisterInfo::isPhysicalRegister(RegNum)) 266 PhysReg2LiveUnion[RegNum].unify(VirtReg); 267 else 268 enqueue(&VirtReg); 269 } 270} 271 272void RegAllocBase::assign(LiveInterval &VirtReg, unsigned PhysReg) { 273 DEBUG(dbgs() << "assigning " << PrintReg(VirtReg.reg, TRI) 274 << " to " << PrintReg(PhysReg, TRI) << '\n'); 275 assert(!VRM->hasPhys(VirtReg.reg) && "Duplicate VirtReg assignment"); 276 VRM->assignVirt2Phys(VirtReg.reg, PhysReg); 277 PhysReg2LiveUnion[PhysReg].unify(VirtReg); 278 ++NumAssigned; 279} 280 281void RegAllocBase::unassign(LiveInterval &VirtReg, unsigned PhysReg) { 282 DEBUG(dbgs() << "unassigning " << PrintReg(VirtReg.reg, TRI) 283 << " from " << PrintReg(PhysReg, TRI) << '\n'); 284 assert(VRM->getPhys(VirtReg.reg) == PhysReg && "Inconsistent unassign"); 285 PhysReg2LiveUnion[PhysReg].extract(VirtReg); 286 VRM->clearVirt(VirtReg.reg); 287 ++NumUnassigned; 288} 289 290// Top-level driver to manage the queue of unassigned VirtRegs and call the 291// selectOrSplit implementation. 292void RegAllocBase::allocatePhysRegs() { 293 seedLiveRegs(); 294 295 // Continue assigning vregs one at a time to available physical registers. 296 while (LiveInterval *VirtReg = dequeue()) { 297 assert(!VRM->hasPhys(VirtReg->reg) && "Register already assigned"); 298 299 // Unused registers can appear when the spiller coalesces snippets. 300 if (MRI->reg_nodbg_empty(VirtReg->reg)) { 301 DEBUG(dbgs() << "Dropping unused " << *VirtReg << '\n'); 302 LIS->removeInterval(VirtReg->reg); 303 continue; 304 } 305 306 // Invalidate all interference queries, live ranges could have changed. 307 ++UserTag; 308 309 // selectOrSplit requests the allocator to return an available physical 310 // register if possible and populate a list of new live intervals that 311 // result from splitting. 312 DEBUG(dbgs() << "\nselectOrSplit " 313 << MRI->getRegClass(VirtReg->reg)->getName() 314 << ':' << *VirtReg << '\n'); 315 typedef SmallVector<LiveInterval*, 4> VirtRegVec; 316 VirtRegVec SplitVRegs; 317 unsigned AvailablePhysReg = selectOrSplit(*VirtReg, SplitVRegs); 318 319 if (AvailablePhysReg) 320 assign(*VirtReg, AvailablePhysReg); 321 322 for (VirtRegVec::iterator I = SplitVRegs.begin(), E = SplitVRegs.end(); 323 I != E; ++I) { 324 LiveInterval *SplitVirtReg = *I; 325 assert(!VRM->hasPhys(SplitVirtReg->reg) && "Register already assigned"); 326 if (MRI->reg_nodbg_empty(SplitVirtReg->reg)) { 327 DEBUG(dbgs() << "not queueing unused " << *SplitVirtReg << '\n'); 328 LIS->removeInterval(SplitVirtReg->reg); 329 continue; 330 } 331 DEBUG(dbgs() << "queuing new interval: " << *SplitVirtReg << "\n"); 332 assert(TargetRegisterInfo::isVirtualRegister(SplitVirtReg->reg) && 333 "expect split value in virtual register"); 334 enqueue(SplitVirtReg); 335 ++NumNewQueued; 336 } 337 } 338} 339 340// Check if this live virtual register interferes with a physical register. If 341// not, then check for interference on each register that aliases with the 342// physical register. Return the interfering register. 343unsigned RegAllocBase::checkPhysRegInterference(LiveInterval &VirtReg, 344 unsigned PhysReg) { 345 for (const unsigned *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI) 346 if (query(VirtReg, *AliasI).checkInterference()) 347 return *AliasI; 348 return 0; 349} 350 351// Helper for spillInteferences() that spills all interfering vregs currently 352// assigned to this physical register. 353void RegAllocBase::spillReg(LiveInterval& VirtReg, unsigned PhysReg, 354 SmallVectorImpl<LiveInterval*> &SplitVRegs) { 355 LiveIntervalUnion::Query &Q = query(VirtReg, PhysReg); 356 assert(Q.seenAllInterferences() && "need collectInterferences()"); 357 const SmallVectorImpl<LiveInterval*> &PendingSpills = Q.interferingVRegs(); 358 359 for (SmallVectorImpl<LiveInterval*>::const_iterator I = PendingSpills.begin(), 360 E = PendingSpills.end(); I != E; ++I) { 361 LiveInterval &SpilledVReg = **I; 362 DEBUG(dbgs() << "extracting from " << 363 TRI->getName(PhysReg) << " " << SpilledVReg << '\n'); 364 365 // Deallocate the interfering vreg by removing it from the union. 366 // A LiveInterval instance may not be in a union during modification! 367 unassign(SpilledVReg, PhysReg); 368 369 // Spill the extracted interval. 370 LiveRangeEdit LRE(SpilledVReg, SplitVRegs, 0, &PendingSpills); 371 spiller().spill(LRE); 372 } 373 // After extracting segments, the query's results are invalid. But keep the 374 // contents valid until we're done accessing pendingSpills. 375 Q.clear(); 376} 377 378// Spill or split all live virtual registers currently unified under PhysReg 379// that interfere with VirtReg. The newly spilled or split live intervals are 380// returned by appending them to SplitVRegs. 381bool 382RegAllocBase::spillInterferences(LiveInterval &VirtReg, unsigned PhysReg, 383 SmallVectorImpl<LiveInterval*> &SplitVRegs) { 384 // Record each interference and determine if all are spillable before mutating 385 // either the union or live intervals. 386 unsigned NumInterferences = 0; 387 // Collect interferences assigned to any alias of the physical register. 388 for (const unsigned *asI = TRI->getOverlaps(PhysReg); *asI; ++asI) { 389 LiveIntervalUnion::Query &QAlias = query(VirtReg, *asI); 390 NumInterferences += QAlias.collectInterferingVRegs(); 391 if (QAlias.seenUnspillableVReg()) { 392 return false; 393 } 394 } 395 DEBUG(dbgs() << "spilling " << TRI->getName(PhysReg) << 396 " interferences with " << VirtReg << "\n"); 397 assert(NumInterferences > 0 && "expect interference"); 398 399 // Spill each interfering vreg allocated to PhysReg or an alias. 400 for (const unsigned *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI) 401 spillReg(VirtReg, *AliasI, SplitVRegs); 402 return true; 403} 404 405// Add newly allocated physical registers to the MBB live in sets. 406void RegAllocBase::addMBBLiveIns(MachineFunction *MF) { 407 NamedRegionTimer T("MBB Live Ins", TimerGroupName, TimePassesIsEnabled); 408 typedef SmallVector<MachineBasicBlock*, 8> MBBVec; 409 MBBVec liveInMBBs; 410 MachineBasicBlock &entryMBB = *MF->begin(); 411 412 for (unsigned PhysReg = 0; PhysReg < PhysReg2LiveUnion.numRegs(); ++PhysReg) { 413 LiveIntervalUnion &LiveUnion = PhysReg2LiveUnion[PhysReg]; 414 if (LiveUnion.empty()) 415 continue; 416 for (LiveIntervalUnion::SegmentIter SI = LiveUnion.begin(); SI.valid(); 417 ++SI) { 418 419 // Find the set of basic blocks which this range is live into... 420 liveInMBBs.clear(); 421 if (!LIS->findLiveInMBBs(SI.start(), SI.stop(), liveInMBBs)) continue; 422 423 // And add the physreg for this interval to their live-in sets. 424 for (MBBVec::iterator I = liveInMBBs.begin(), E = liveInMBBs.end(); 425 I != E; ++I) { 426 MachineBasicBlock *MBB = *I; 427 if (MBB == &entryMBB) continue; 428 if (MBB->isLiveIn(PhysReg)) continue; 429 MBB->addLiveIn(PhysReg); 430 } 431 } 432 } 433} 434 435 436//===----------------------------------------------------------------------===// 437// RABasic Implementation 438//===----------------------------------------------------------------------===// 439 440// Driver for the register assignment and splitting heuristics. 441// Manages iteration over the LiveIntervalUnions. 442// 443// This is a minimal implementation of register assignment and splitting that 444// spills whenever we run out of registers. 445// 446// selectOrSplit can only be called once per live virtual register. We then do a 447// single interference test for each register the correct class until we find an 448// available register. So, the number of interference tests in the worst case is 449// |vregs| * |machineregs|. And since the number of interference tests is 450// minimal, there is no value in caching them outside the scope of 451// selectOrSplit(). 452unsigned RABasic::selectOrSplit(LiveInterval &VirtReg, 453 SmallVectorImpl<LiveInterval*> &SplitVRegs) { 454 // Populate a list of physical register spill candidates. 455 SmallVector<unsigned, 8> PhysRegSpillCands; 456 457 // Check for an available register in this class. 458 const TargetRegisterClass *TRC = MRI->getRegClass(VirtReg.reg); 459 460 for (TargetRegisterClass::iterator I = TRC->allocation_order_begin(*MF), 461 E = TRC->allocation_order_end(*MF); 462 I != E; ++I) { 463 464 unsigned PhysReg = *I; 465 if (ReservedRegs.test(PhysReg)) continue; 466 467 // Check interference and as a side effect, intialize queries for this 468 // VirtReg and its aliases. 469 unsigned interfReg = checkPhysRegInterference(VirtReg, PhysReg); 470 if (interfReg == 0) { 471 // Found an available register. 472 return PhysReg; 473 } 474 LiveInterval *interferingVirtReg = 475 Queries[interfReg].firstInterference().liveUnionPos().value(); 476 477 // The current VirtReg must either be spillable, or one of its interferences 478 // must have less spill weight. 479 if (interferingVirtReg->weight < VirtReg.weight ) { 480 PhysRegSpillCands.push_back(PhysReg); 481 } 482 } 483 // Try to spill another interfering reg with less spill weight. 484 for (SmallVectorImpl<unsigned>::iterator PhysRegI = PhysRegSpillCands.begin(), 485 PhysRegE = PhysRegSpillCands.end(); PhysRegI != PhysRegE; ++PhysRegI) { 486 487 if (!spillInterferences(VirtReg, *PhysRegI, SplitVRegs)) continue; 488 489 assert(checkPhysRegInterference(VirtReg, *PhysRegI) == 0 && 490 "Interference after spill."); 491 // Tell the caller to allocate to this newly freed physical register. 492 return *PhysRegI; 493 } 494 // No other spill candidates were found, so spill the current VirtReg. 495 DEBUG(dbgs() << "spilling: " << VirtReg << '\n'); 496 LiveRangeEdit LRE(VirtReg, SplitVRegs); 497 spiller().spill(LRE); 498 499 // The live virtual register requesting allocation was spilled, so tell 500 // the caller not to allocate anything during this round. 501 return 0; 502} 503 504bool RABasic::runOnMachineFunction(MachineFunction &mf) { 505 DEBUG(dbgs() << "********** BASIC REGISTER ALLOCATION **********\n" 506 << "********** Function: " 507 << ((Value*)mf.getFunction())->getName() << '\n'); 508 509 MF = &mf; 510 DEBUG(RMF = &getAnalysis<RenderMachineFunction>()); 511 512 RegAllocBase::init(getAnalysis<VirtRegMap>(), getAnalysis<LiveIntervals>()); 513 514 ReservedRegs = TRI->getReservedRegs(*MF); 515 516 SpillerInstance.reset(createInlineSpiller(*this, *MF, *VRM)); 517 518 allocatePhysRegs(); 519 520 addMBBLiveIns(MF); 521 522 // Diagnostic output before rewriting 523 DEBUG(dbgs() << "Post alloc VirtRegMap:\n" << *VRM << "\n"); 524 525 // optional HTML output 526 DEBUG(RMF->renderMachineFunction("After basic register allocation.", VRM)); 527 528 // FIXME: Verification currently must run before VirtRegRewriter. We should 529 // make the rewriter a separate pass and override verifyAnalysis instead. When 530 // that happens, verification naturally falls under VerifyMachineCode. 531#ifndef NDEBUG 532 if (VerifyEnabled) { 533 // Verify accuracy of LiveIntervals. The standard machine code verifier 534 // ensures that each LiveIntervals covers all uses of the virtual reg. 535 536 // FIXME: MachineVerifier is badly broken when using the standard 537 // spiller. Always use -spiller=inline with -verify-regalloc. Even with the 538 // inline spiller, some tests fail to verify because the coalescer does not 539 // always generate verifiable code. 540 MF->verify(this, "In RABasic::verify"); 541 542 // Verify that LiveIntervals are partitioned into unions and disjoint within 543 // the unions. 544 verify(); 545 } 546#endif // !NDEBUG 547 548 // Run rewriter 549 VRM->rewrite(LIS->getSlotIndexes()); 550 551 // Write out new DBG_VALUE instructions. 552 getAnalysis<LiveDebugVariables>().emitDebugValues(VRM); 553 554 // The pass output is in VirtRegMap. Release all the transient data. 555 releaseMemory(); 556 557 return true; 558} 559 560FunctionPass* llvm::createBasicRegisterAllocator() 561{ 562 return new RABasic(); 563} 564