| //===-- 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 "RegisterClassInfo.h" |
| #include "VirtRegMap.h" |
| #include "llvm/CodeGen/MachineRegisterInfo.h" |
| |
| using namespace llvm; |
| |
| // Compare VirtRegMap::getRegAllocPref(). |
| AllocationOrder::AllocationOrder(unsigned VirtReg, |
| const VirtRegMap &VRM, |
| const RegisterClassInfo &RegClassInfo) |
| : Begin(0), End(0), Pos(0), RCI(RegClassInfo), OwnedBegin(false) { |
| const TargetRegisterClass *RC = VRM.getRegInfo().getRegClass(VirtReg); |
| std::pair<unsigned, unsigned> HintPair = |
| VRM.getRegInfo().getRegAllocationHint(VirtReg); |
| |
| // HintPair.second is a register, phys or virt. |
| Hint = HintPair.second; |
| |
| // Translate to physreg, or 0 if not assigned yet. |
| if (TargetRegisterInfo::isVirtualRegister(Hint)) |
| Hint = VRM.getPhys(Hint); |
| |
| // The first hint pair component indicates a target-specific hint. |
| if (HintPair.first) { |
| const TargetRegisterInfo &TRI = VRM.getTargetRegInfo(); |
| // The remaining allocation order may depend on the hint. |
| ArrayRef<unsigned> Order = |
| TRI.getRawAllocationOrder(RC, HintPair.first, Hint, |
| VRM.getMachineFunction()); |
| if (Order.empty()) |
| return; |
| |
| // Copy the allocation order with reserved registers removed. |
| OwnedBegin = true; |
| unsigned *P = new unsigned[Order.size()]; |
| Begin = P; |
| for (unsigned i = 0; i != Order.size(); ++i) |
| if (!RCI.isReserved(Order[i])) |
| *P++ = Order[i]; |
| End = P; |
| |
| // Target-dependent hints require resolution. |
| Hint = TRI.ResolveRegAllocHint(HintPair.first, Hint, |
| VRM.getMachineFunction()); |
| } else { |
| // If there is no hint or just a normal hint, use the cached allocation |
| // order from RegisterClassInfo. |
| ArrayRef<unsigned> O = RCI.getOrder(RC); |
| Begin = O.begin(); |
| End = O.end(); |
| } |
| |
| // The hint must be a valid physreg for allocation. |
| if (Hint && (!TargetRegisterInfo::isPhysicalRegister(Hint) || |
| !RC->contains(Hint) || RCI.isReserved(Hint))) |
| Hint = 0; |
| } |
| |
| AllocationOrder::~AllocationOrder() { |
| if (OwnedBegin) |
| delete [] Begin; |
| } |