|  | //===-- 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 | 
|  | } |