1218885Sdim//===-- llvm/CodeGen/AllocationOrder.cpp - Allocation Order ---------------===// 2218885Sdim// 3218885Sdim// The LLVM Compiler Infrastructure 4218885Sdim// 5218885Sdim// This file is distributed under the University of Illinois Open Source 6218885Sdim// License. See LICENSE.TXT for details. 7218885Sdim// 8218885Sdim//===----------------------------------------------------------------------===// 9218885Sdim// 10218885Sdim// This file implements an allocation order for virtual registers. 11218885Sdim// 12218885Sdim// The preferred allocation order for a virtual register depends on allocation 13218885Sdim// hints and target hooks. The AllocationOrder class encapsulates all of that. 14218885Sdim// 15218885Sdim//===----------------------------------------------------------------------===// 16218885Sdim 17218885Sdim#include "AllocationOrder.h" 18249423Sdim#include "llvm/CodeGen/MachineFunction.h" 19218885Sdim#include "llvm/CodeGen/MachineRegisterInfo.h" 20239462Sdim#include "llvm/CodeGen/RegisterClassInfo.h" 21249423Sdim#include "llvm/CodeGen/VirtRegMap.h" 22249423Sdim#include "llvm/Support/Debug.h" 23249423Sdim#include "llvm/Support/raw_ostream.h" 24218885Sdim 25218885Sdimusing namespace llvm; 26218885Sdim 27276479Sdim#define DEBUG_TYPE "regalloc" 28276479Sdim 29218885Sdim// Compare VirtRegMap::getRegAllocPref(). 30218885SdimAllocationOrder::AllocationOrder(unsigned VirtReg, 31218885Sdim const VirtRegMap &VRM, 32296417Sdim const RegisterClassInfo &RegClassInfo, 33296417Sdim const LiveRegMatrix *Matrix) 34249423Sdim : Pos(0) { 35249423Sdim const MachineFunction &MF = VRM.getMachineFunction(); 36249423Sdim const TargetRegisterInfo *TRI = &VRM.getTargetRegInfo(); 37249423Sdim Order = RegClassInfo.getOrder(MF.getRegInfo().getRegClass(VirtReg)); 38296417Sdim TRI->getRegAllocationHints(VirtReg, Order, Hints, MF, &VRM, Matrix); 39249423Sdim rewind(); 40218885Sdim 41249423Sdim DEBUG({ 42249423Sdim if (!Hints.empty()) { 43249423Sdim dbgs() << "hints:"; 44249423Sdim for (unsigned I = 0, E = Hints.size(); I != E; ++I) 45249423Sdim dbgs() << ' ' << PrintReg(Hints[I], TRI); 46249423Sdim dbgs() << '\n'; 47249423Sdim } 48249423Sdim }); 49249423Sdim#ifndef NDEBUG 50249423Sdim for (unsigned I = 0, E = Hints.size(); I != E; ++I) 51249423Sdim assert(std::find(Order.begin(), Order.end(), Hints[I]) != Order.end() && 52249423Sdim "Target hint is outside allocation order."); 53249423Sdim#endif 54218885Sdim} 55