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