Home | History | Annotate | Line # | Download | only in CodeGen
      1 //===-- llvm/CodeGen/Register.h ---------------------------------*- C++ -*-===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 
      9 #ifndef LLVM_CODEGEN_REGISTER_H
     10 #define LLVM_CODEGEN_REGISTER_H
     11 
     12 #include "llvm/MC/MCRegister.h"
     13 #include <cassert>
     14 
     15 namespace llvm {
     16 
     17 /// Wrapper class representing virtual and physical registers. Should be passed
     18 /// by value.
     19 class Register {
     20   unsigned Reg;
     21 
     22 public:
     23   constexpr Register(unsigned Val = 0): Reg(Val) {}
     24   constexpr Register(MCRegister Val): Reg(Val) {}
     25 
     26   // Register numbers can represent physical registers, virtual registers, and
     27   // sometimes stack slots. The unsigned values are divided into these ranges:
     28   //
     29   //   0           Not a register, can be used as a sentinel.
     30   //   [1;2^30)    Physical registers assigned by TableGen.
     31   //   [2^30;2^31) Stack slots. (Rarely used.)
     32   //   [2^31;2^32) Virtual registers assigned by MachineRegisterInfo.
     33   //
     34   // Further sentinels can be allocated from the small negative integers.
     35   // DenseMapInfo<unsigned> uses -1u and -2u.
     36   static_assert(std::numeric_limits<decltype(Reg)>::max() >= 0xFFFFFFFF,
     37                 "Reg isn't large enough to hold full range.");
     38 
     39   /// isStackSlot - Sometimes it is useful the be able to store a non-negative
     40   /// frame index in a variable that normally holds a register. isStackSlot()
     41   /// returns true if Reg is in the range used for stack slots.
     42   ///
     43   /// FIXME: remove in favor of member.
     44   static bool isStackSlot(unsigned Reg) {
     45     return MCRegister::isStackSlot(Reg);
     46   }
     47 
     48   /// Return true if this is a stack slot.
     49   bool isStack() const { return MCRegister::isStackSlot(Reg); }
     50 
     51   /// Compute the frame index from a register value representing a stack slot.
     52   static int stackSlot2Index(Register Reg) {
     53     assert(Reg.isStack() && "Not a stack slot");
     54     return int(Reg - MCRegister::FirstStackSlot);
     55   }
     56 
     57   /// Convert a non-negative frame index to a stack slot register value.
     58   static Register index2StackSlot(int FI) {
     59     assert(FI >= 0 && "Cannot hold a negative frame index.");
     60     return Register(FI + MCRegister::FirstStackSlot);
     61   }
     62 
     63   /// Return true if the specified register number is in
     64   /// the physical register namespace.
     65   static bool isPhysicalRegister(unsigned Reg) {
     66     return MCRegister::isPhysicalRegister(Reg);
     67   }
     68 
     69   /// Return true if the specified register number is in
     70   /// the virtual register namespace.
     71   static bool isVirtualRegister(unsigned Reg) {
     72     return Reg & MCRegister::VirtualRegFlag && !isStackSlot(Reg);
     73   }
     74 
     75   /// Convert a virtual register number to a 0-based index.
     76   /// The first virtual register in a function will get the index 0.
     77   static unsigned virtReg2Index(Register Reg) {
     78     assert(isVirtualRegister(Reg) && "Not a virtual register");
     79     return Reg & ~MCRegister::VirtualRegFlag;
     80   }
     81 
     82   /// Convert a 0-based index to a virtual register number.
     83   /// This is the inverse operation of VirtReg2IndexFunctor below.
     84   static Register index2VirtReg(unsigned Index) {
     85     assert(Index < (1u << 31) && "Index too large for virtual register range.");
     86     return Index | MCRegister::VirtualRegFlag;
     87   }
     88 
     89   /// Return true if the specified register number is in the virtual register
     90   /// namespace.
     91   bool isVirtual() const {
     92     return isVirtualRegister(Reg);
     93   }
     94 
     95   /// Return true if the specified register number is in the physical register
     96   /// namespace.
     97   bool isPhysical() const {
     98     return isPhysicalRegister(Reg);
     99   }
    100 
    101   /// Convert a virtual register number to a 0-based index. The first virtual
    102   /// register in a function will get the index 0.
    103   unsigned virtRegIndex() const {
    104     return virtReg2Index(Reg);
    105   }
    106 
    107   constexpr operator unsigned() const {
    108     return Reg;
    109   }
    110 
    111   unsigned id() const { return Reg; }
    112 
    113   operator MCRegister() const {
    114     return MCRegister(Reg);
    115   }
    116 
    117   /// Utility to check-convert this value to a MCRegister. The caller is
    118   /// expected to have already validated that this Register is, indeed,
    119   /// physical.
    120   MCRegister asMCReg() const {
    121     assert(Reg == MCRegister::NoRegister ||
    122            MCRegister::isPhysicalRegister(Reg));
    123     return MCRegister(Reg);
    124   }
    125 
    126   bool isValid() const { return Reg != MCRegister::NoRegister; }
    127 
    128   /// Comparisons between register objects
    129   bool operator==(const Register &Other) const { return Reg == Other.Reg; }
    130   bool operator!=(const Register &Other) const { return Reg != Other.Reg; }
    131   bool operator==(const MCRegister &Other) const { return Reg == Other.id(); }
    132   bool operator!=(const MCRegister &Other) const { return Reg != Other.id(); }
    133 
    134   /// Comparisons against register constants. E.g.
    135   /// * R == AArch64::WZR
    136   /// * R == 0
    137   /// * R == VirtRegMap::NO_PHYS_REG
    138   bool operator==(unsigned Other) const { return Reg == Other; }
    139   bool operator!=(unsigned Other) const { return Reg != Other; }
    140   bool operator==(int Other) const { return Reg == unsigned(Other); }
    141   bool operator!=(int Other) const { return Reg != unsigned(Other); }
    142   // MSVC requires that we explicitly declare these two as well.
    143   bool operator==(MCPhysReg Other) const { return Reg == unsigned(Other); }
    144   bool operator!=(MCPhysReg Other) const { return Reg != unsigned(Other); }
    145 };
    146 
    147 // Provide DenseMapInfo for Register
    148 template<> struct DenseMapInfo<Register> {
    149   static inline unsigned getEmptyKey() {
    150     return DenseMapInfo<unsigned>::getEmptyKey();
    151   }
    152   static inline unsigned getTombstoneKey() {
    153     return DenseMapInfo<unsigned>::getTombstoneKey();
    154   }
    155   static unsigned getHashValue(const Register &Val) {
    156     return DenseMapInfo<unsigned>::getHashValue(Val.id());
    157   }
    158   static bool isEqual(const Register &LHS, const Register &RHS) {
    159     return DenseMapInfo<unsigned>::isEqual(LHS.id(), RHS.id());
    160   }
    161 };
    162 
    163 }
    164 
    165 #endif // LLVM_CODEGEN_REGISTER_H
    166