1c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen//===-- llvm/CodeGen/AllocationOrder.cpp - Allocation Order ---------------===// 2c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// 3c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// The LLVM Compiler Infrastructure 4c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// 5c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// This file is distributed under the University of Illinois Open Source 6c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// License. See LICENSE.TXT for details. 7c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// 8c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 9c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// 10c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// This file implements an allocation order for virtual registers. 11c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// 12c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// The preferred allocation order for a virtual register depends on allocation 13c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// hints and target hooks. The AllocationOrder class encapsulates all of that. 14c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// 15c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 16c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen 17c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen#include "AllocationOrder.h" 18fc29db1214736d6ed84d60707db28de346af3febJakob Stoklund Olesen#include "llvm/CodeGen/MachineFunction.h" 19c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen#include "llvm/CodeGen/MachineRegisterInfo.h" 201525260b3e50cc578939ef41b60609689eecfdd2Andrew Trick#include "llvm/CodeGen/RegisterClassInfo.h" 211ead68d769f27f6d68d4aaeffe4199fa2cacbc95Jakob Stoklund Olesen#include "llvm/CodeGen/VirtRegMap.h" 22fc29db1214736d6ed84d60707db28de346af3febJakob Stoklund Olesen#include "llvm/Support/Debug.h" 23fc29db1214736d6ed84d60707db28de346af3febJakob Stoklund Olesen#include "llvm/Support/raw_ostream.h" 24c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen 25c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesenusing namespace llvm; 26c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen 27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "regalloc" 28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 29c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// Compare VirtRegMap::getRegAllocPref(). 30c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund OlesenAllocationOrder::AllocationOrder(unsigned VirtReg, 31c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen const VirtRegMap &VRM, 325f2316a3b55f88dab2190212210770180a32aa95Jakob Stoklund Olesen const RegisterClassInfo &RegClassInfo) 33fc29db1214736d6ed84d60707db28de346af3febJakob Stoklund Olesen : Pos(0) { 34fc29db1214736d6ed84d60707db28de346af3febJakob Stoklund Olesen const MachineFunction &MF = VRM.getMachineFunction(); 35fc29db1214736d6ed84d60707db28de346af3febJakob Stoklund Olesen const TargetRegisterInfo *TRI = &VRM.getTargetRegInfo(); 36fc29db1214736d6ed84d60707db28de346af3febJakob Stoklund Olesen Order = RegClassInfo.getOrder(MF.getRegInfo().getRegClass(VirtReg)); 37fc29db1214736d6ed84d60707db28de346af3febJakob Stoklund Olesen TRI->getRegAllocationHints(VirtReg, Order, Hints, MF, &VRM); 38f7999fe1cb2c2bdb0a4080efabb4743719ce45caJakob Stoklund Olesen rewind(); 39c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen 40fc29db1214736d6ed84d60707db28de346af3febJakob Stoklund Olesen DEBUG({ 41fc29db1214736d6ed84d60707db28de346af3febJakob Stoklund Olesen if (!Hints.empty()) { 42fc29db1214736d6ed84d60707db28de346af3febJakob Stoklund Olesen dbgs() << "hints:"; 43fc29db1214736d6ed84d60707db28de346af3febJakob Stoklund Olesen for (unsigned I = 0, E = Hints.size(); I != E; ++I) 44fc29db1214736d6ed84d60707db28de346af3febJakob Stoklund Olesen dbgs() << ' ' << PrintReg(Hints[I], TRI); 45fc29db1214736d6ed84d60707db28de346af3febJakob Stoklund Olesen dbgs() << '\n'; 46fc29db1214736d6ed84d60707db28de346af3febJakob Stoklund Olesen } 47fc29db1214736d6ed84d60707db28de346af3febJakob Stoklund Olesen }); 48da5f1ed6406442735fbb4421f8a22bc8a41d4c57Jakob Stoklund Olesen#ifndef NDEBUG 49da5f1ed6406442735fbb4421f8a22bc8a41d4c57Jakob Stoklund Olesen for (unsigned I = 0, E = Hints.size(); I != E; ++I) 50da5f1ed6406442735fbb4421f8a22bc8a41d4c57Jakob Stoklund Olesen assert(std::find(Order.begin(), Order.end(), Hints[I]) != Order.end() && 51da5f1ed6406442735fbb4421f8a22bc8a41d4c57Jakob Stoklund Olesen "Target hint is outside allocation order."); 52da5f1ed6406442735fbb4421f8a22bc8a41d4c57Jakob Stoklund Olesen#endif 53fc29db1214736d6ed84d60707db28de346af3febJakob Stoklund Olesen} 54