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