| //===-- llvm/CodeGen/AllocationOrder.cpp - Allocation Order ---------------===// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file is distributed under the University of Illinois Open Source | 
 | // License. See LICENSE.TXT for details. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | // | 
 | // This file implements an allocation order for virtual registers. | 
 | // | 
 | // The preferred allocation order for a virtual register depends on allocation | 
 | // hints and target hooks. The AllocationOrder class encapsulates all of that. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #include "AllocationOrder.h" | 
 | #include "llvm/CodeGen/MachineFunction.h" | 
 | #include "llvm/CodeGen/MachineRegisterInfo.h" | 
 | #include "llvm/CodeGen/RegisterClassInfo.h" | 
 | #include "llvm/CodeGen/VirtRegMap.h" | 
 | #include "llvm/Support/Debug.h" | 
 | #include "llvm/Support/raw_ostream.h" | 
 |  | 
 | using namespace llvm; | 
 |  | 
 | #define DEBUG_TYPE "regalloc" | 
 |  | 
 | // Compare VirtRegMap::getRegAllocPref(). | 
 | AllocationOrder::AllocationOrder(unsigned VirtReg, | 
 |                                  const VirtRegMap &VRM, | 
 |                                  const RegisterClassInfo &RegClassInfo, | 
 |                                  const LiveRegMatrix *Matrix) | 
 |   : Pos(0), HardHints(false) { | 
 |   const MachineFunction &MF = VRM.getMachineFunction(); | 
 |   const TargetRegisterInfo *TRI = &VRM.getTargetRegInfo(); | 
 |   Order = RegClassInfo.getOrder(MF.getRegInfo().getRegClass(VirtReg)); | 
 |   if (TRI->getRegAllocationHints(VirtReg, Order, Hints, MF, &VRM, Matrix)) | 
 |     HardHints = true; | 
 |   rewind(); | 
 |  | 
 |   LLVM_DEBUG({ | 
 |     if (!Hints.empty()) { | 
 |       dbgs() << "hints:"; | 
 |       for (unsigned I = 0, E = Hints.size(); I != E; ++I) | 
 |         dbgs() << ' ' << printReg(Hints[I], TRI); | 
 |       dbgs() << '\n'; | 
 |     } | 
 |   }); | 
 | #ifndef NDEBUG | 
 |   for (unsigned I = 0, E = Hints.size(); I != E; ++I) | 
 |     assert(is_contained(Order, Hints[I]) && | 
 |            "Target hint is outside allocation order."); | 
 | #endif | 
 | } |