CodeGenRegisters.h revision 655b8de7b2ab773a977e0c524307e71354d8af29
18dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner//===- CodeGenRegisters.h - Register and RegisterClass Info -----*- C++ -*-===//
23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
38dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner//                     The LLVM Compiler Infrastructure
48dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner//
53060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// This file is distributed under the University of Illinois Open Source
63060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// License. See LICENSE.TXT for details.
73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
88dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner//===----------------------------------------------------------------------===//
98dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner//
108dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner// This file defines structures to encapsulate information gleaned from the
118dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner// target register and register class definitions.
128dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner//
138dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner//===----------------------------------------------------------------------===//
148dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner
158dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner#ifndef CODEGEN_REGISTERS_H
168dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner#define CODEGEN_REGISTERS_H
178dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner
1859f26aadce1bb985b9befe841fc106c891e1c728Jakob Stoklund Olesen#include "SetTheory.h"
197c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#include "llvm/TableGen/Record.h"
20ae9f3a3b7c915f725aef5a7250e88eaeddda03c6Anton Korobeynikov#include "llvm/CodeGen/ValueTypes.h"
21ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen#include "llvm/ADT/ArrayRef.h"
22203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen#include "llvm/ADT/BitVector.h"
2309bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen#include "llvm/ADT/DenseMap.h"
24026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen#include "llvm/ADT/SetVector.h"
25655b8de7b2ab773a977e0c524307e71354d8af29Craig Topper#include "llvm/Support/ErrorHandling.h"
26b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen#include <cstdlib>
27b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen#include <map>
288dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner#include <string>
29a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher#include <set>
30b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen#include <vector>
318dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner
328dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattnernamespace llvm {
33b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  class CodeGenRegBank;
348dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner
355fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen  /// CodeGenSubRegIndex - Represents a sub-register index.
365fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen  class CodeGenSubRegIndex {
375fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    Record *const TheDef;
385fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    const unsigned EnumValue;
395fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen
405fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen  public:
415fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    CodeGenSubRegIndex(Record *R, unsigned Enum);
425fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen
435fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    const std::string &getName() const;
445fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    std::string getNamespace() const;
455fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    std::string getQualifiedName() const;
465fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen
475fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    // Order CodeGenSubRegIndex pointers by EnumValue.
485fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    struct Less {
495fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen      bool operator()(const CodeGenSubRegIndex *A,
505fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen                      const CodeGenSubRegIndex *B) const {
515fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen        assert(A && B);
525fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen        return A->EnumValue < B->EnumValue;
535fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen      }
545fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    };
5590498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen
5690498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen    // Map of composite subreg indices.
5790498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen    typedef std::map<CodeGenSubRegIndex*, CodeGenSubRegIndex*, Less> CompMap;
5890498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen
5990498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen    // Returns the subreg index that results from composing this with Idx.
6090498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen    // Returns NULL if this and Idx don't compose.
6190498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen    CodeGenSubRegIndex *compose(CodeGenSubRegIndex *Idx) const {
6290498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen      CompMap::const_iterator I = Composed.find(Idx);
6390498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen      return I == Composed.end() ? 0 : I->second;
6490498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen    }
6590498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen
6690498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen    // Add a composite subreg index: this+A = B.
6790498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen    // Return a conflicting composite, or NULL
6890498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen    CodeGenSubRegIndex *addComposite(CodeGenSubRegIndex *A,
6990498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen                                     CodeGenSubRegIndex *B) {
7090498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen      std::pair<CompMap::iterator, bool> Ins =
7190498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen        Composed.insert(std::make_pair(A, B));
7290498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen      return (Ins.second || Ins.first->second == B) ? 0 : Ins.first->second;
7390498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen    }
7490498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen
75b5af2d943ed568f2f4cac545b6dfb150ae9d73aaJakob Stoklund Olesen    // Update the composite maps of components specified in 'ComposedOf'.
76b5af2d943ed568f2f4cac545b6dfb150ae9d73aaJakob Stoklund Olesen    void updateComponents(CodeGenRegBank&);
77b5af2d943ed568f2f4cac545b6dfb150ae9d73aaJakob Stoklund Olesen
7890498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen    // Clean out redundant composite mappings.
7990498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen    void cleanComposites();
8090498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen
8190498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen    // Return the map of composites.
8290498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen    const CompMap &getComposites() const { return Composed; }
8390498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen
8490498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen  private:
8590498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen    CompMap Composed;
865fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen  };
875fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen
888dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner  /// CodeGenRegister - Represents a register definition.
898dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner  struct CodeGenRegister {
908dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner    Record *TheDef;
9117fad045cccf34822d3163ada9e70a8f4528746eJim Grosbach    unsigned EnumValue;
926bfba2e5af163442a1c6b11fe14aa9df9101cfd7Jakob Stoklund Olesen    unsigned CostPerUse;
9331867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen    bool CoveredBySubRegs;
94b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
95b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    // Map SubRegIndex -> Register.
965fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    typedef std::map<CodeGenSubRegIndex*, CodeGenRegister*,
975fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen                     CodeGenSubRegIndex::Less> SubRegMap;
98b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
99b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    CodeGenRegister(Record *R, unsigned Enum);
100b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
101b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    const std::string &getName() const;
102b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
103b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    // Get a map of sub-registers computed lazily.
104b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    // This includes unique entries for all sub-sub-registers.
105b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    const SubRegMap &getSubRegs(CodeGenRegBank&);
106b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
107b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    const SubRegMap &getSubRegs() const {
108b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      assert(SubRegsComplete && "Must precompute sub-registers");
109b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      return SubRegs;
110b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    }
111b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
112026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    // Add sub-registers to OSet following a pre-order defined by the .td file.
1135fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    void addSubRegsPreOrder(SetVector<CodeGenRegister*> &OSet,
1145fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen                            CodeGenRegBank&) const;
115026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen
116026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    // List of super-registers in topological order, small to large.
117026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    typedef std::vector<CodeGenRegister*> SuperRegList;
118026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen
119026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    // Get the list of super-registers.
120026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    // This is only valid after computeDerivedInfo has visited all registers.
121026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    const SuperRegList &getSuperRegs() const {
122026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen      assert(SubRegsComplete && "Must precompute sub-registers");
123026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen      return SuperRegs;
124026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    }
125026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen
126026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    // Order CodeGenRegister pointers by EnumValue.
127026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    struct Less {
128ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen      bool operator()(const CodeGenRegister *A,
129ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen                      const CodeGenRegister *B) const {
130babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen        assert(A && B);
131026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen        return A->EnumValue < B->EnumValue;
132026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen      }
133026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    };
134026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen
135026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    // Canonically ordered set.
136ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen    typedef std::set<const CodeGenRegister*, Less> Set;
137026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen
138b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  private:
139b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    bool SubRegsComplete;
140b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    SubRegMap SubRegs;
141026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    SuperRegList SuperRegs;
1428dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner  };
1438dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner
1448dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner
145ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen  class CodeGenRegisterClass {
146ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen    CodeGenRegister::Set Members;
147cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen    // Allocation orders. Order[0] always contains all registers in Members.
148cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen    std::vector<SmallVector<Record*, 16> > Orders;
149203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen    // Bit mask of sub-classes including this, indexed by their EnumValue.
150203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen    BitVector SubClasses;
151f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen    // List of super-classes, topologocally ordered to have the larger classes
152f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen    // first.  This is the same as sorting by EnumValue.
153f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen    SmallVector<CodeGenRegisterClass*, 4> SuperClasses;
154056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner    Record *TheDef;
1556fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen    std::string Name;
156babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
157babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    // For a synthesized class, inherit missing properties from the nearest
158babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    // super-class.
159babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    void inheritProperties(CodeGenRegBank&);
160babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
161570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen    // Map SubRegIndex -> sub-class.  This is the largest sub-class where all
162570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen    // registers have a SubRegIndex sub-register.
1635fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    DenseMap<CodeGenSubRegIndex*, CodeGenRegisterClass*> SubClassWithSubReg;
164845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen
165570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen    // Map SubRegIndex -> set of super-reg classes.  This is all register
166570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen    // classes SuperRC such that:
167570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen    //
168570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen    //   R:SubRegIndex in this RC for all R in SuperRC.
169570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen    //
1705fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    DenseMap<CodeGenSubRegIndex*,
1715fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen             SmallPtrSet<CodeGenRegisterClass*, 8> > SuperRegClasses;
1726fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen  public:
1737dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen    unsigned EnumValue;
174c67c18fd2378fd2394c42f12b67897e7eba02d5cChris Lattner    std::string Namespace;
175825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    std::vector<MVT::SimpleValueType> VTs;
176056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner    unsigned SpillSize;
177056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner    unsigned SpillAlignment;
178a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng    int CopyCost;
179f462e3fac7ac67503657d63dc35330d0b19359b3Jakob Stoklund Olesen    bool Allocatable;
18009bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen    // Map SubRegIndex -> RegisterClass
18109bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen    DenseMap<Record*,Record*> SubRegClasses;
18254c47c1ce94b9e549ef768e80fd004788d13ce85Jakob Stoklund Olesen    std::string AltOrderSelect;
183056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner
1846fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen    // Return the Record that defined this class, or NULL if the class was
1856fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen    // created by TableGen.
1866fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen    Record *getDef() const { return TheDef; }
1876fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen
1886fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen    const std::string &getName() const { return Name; }
1896fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen    std::string getQualifiedName() const;
190825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    const std::vector<MVT::SimpleValueType> &getValueTypes() const {return VTs;}
1915c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner    unsigned getNumValueTypes() const { return VTs.size(); }
1925d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach
193825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    MVT::SimpleValueType getValueTypeNum(unsigned VTNum) const {
1946510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman      if (VTNum < VTs.size())
1956510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman        return VTs[VTNum];
196655b8de7b2ab773a977e0c524307e71354d8af29Craig Topper      llvm_unreachable("VTNum greater than number of ValueTypes in RegClass!");
1976510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman    }
1985d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach
199ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen    // Return true if this this class contains the register.
200ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen    bool contains(const CodeGenRegister*) const;
2015d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach
202ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen    // Returns true if RC is a subclass.
203a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher    // RC is a sub-class of this class if it is a valid replacement for any
2045d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach    // instruction operand where a register of this classis required. It must
205a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher    // satisfy these conditions:
206a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher    //
207a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher    // 1. All RC registers are also in this.
208a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher    // 2. The RC spill size must not be smaller than our spill size.
209a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher    // 3. RC spill alignment must be compatible with ours.
210a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher    //
21152e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen    bool hasSubClass(const CodeGenRegisterClass *RC) const {
21252e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen      return SubClasses.test(RC->EnumValue);
21352e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen    }
214a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher
215845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen    // getSubClassWithSubReg - Returns the largest sub-class where all
216845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen    // registers have a SubIdx sub-register.
2175fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    CodeGenRegisterClass*
2185fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    getSubClassWithSubReg(CodeGenSubRegIndex *SubIdx) const {
219845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen      return SubClassWithSubReg.lookup(SubIdx);
220845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen    }
221845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen
2225fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    void setSubClassWithSubReg(CodeGenSubRegIndex *SubIdx,
2235fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen                               CodeGenRegisterClass *SubRC) {
224845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen      SubClassWithSubReg[SubIdx] = SubRC;
225845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen    }
226845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen
227570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen    // getSuperRegClasses - Returns a bit vector of all register classes
228570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen    // containing only SubIdx super-registers of this class.
2295fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    void getSuperRegClasses(CodeGenSubRegIndex *SubIdx, BitVector &Out) const;
230570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen
231570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen    // addSuperRegClass - Add a class containing only SudIdx super-registers.
2325fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    void addSuperRegClass(CodeGenSubRegIndex *SubIdx,
2335fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen                          CodeGenRegisterClass *SuperRC) {
234570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen      SuperRegClasses[SubIdx].insert(SuperRC);
235570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen    }
236570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen
237f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen    // getSubClasses - Returns a constant BitVector of subclasses indexed by
238f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen    // EnumValue.
239f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen    // The SubClasses vector includs an entry for this class.
240830378f6628ad3af1d0293a0b605065532f99e43Eli Friedman    const BitVector &getSubClasses() const { return SubClasses; }
241f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen
242f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen    // getSuperClasses - Returns a list of super classes ordered by EnumValue.
243f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen    // The array does not include an entry for this class.
244f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen    ArrayRef<CodeGenRegisterClass*> getSuperClasses() const {
245f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen      return SuperClasses;
246f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen    }
247f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen
248ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen    // Returns an ordered list of class members.
249ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen    // The order of registers is the same as in the .td file.
250b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen    // No = 0 is the default allocation order, No = 1 is the first alternative.
251b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen    ArrayRef<Record*> getOrder(unsigned No = 0) const {
252cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen        return Orders[No];
253a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher    }
2546510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman
255b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen    // Return the total number of allocation orders available.
256cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen    unsigned getNumOrders() const { return Orders.size(); }
257b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen
25852e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen    // Get the set of registers.  This set contains the same registers as
25952e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen    // getOrder(0).
26052e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen    const CodeGenRegister::Set &getMembers() const { return Members; }
26152e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen
262ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen    CodeGenRegisterClass(CodeGenRegBank&, Record *R);
263203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen
264babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    // A key representing the parts of a register class used for forming
265babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    // sub-classes.  Note the ordering provided by this key is not the same as
266babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    // the topological order used for the EnumValues.
267babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    struct Key {
268babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen      const CodeGenRegister::Set *Members;
269babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen      unsigned SpillSize;
270babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen      unsigned SpillAlignment;
271babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
272babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen      Key(const Key &O)
273babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen        : Members(O.Members),
274babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen          SpillSize(O.SpillSize),
275babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen          SpillAlignment(O.SpillAlignment) {}
276babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
277babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen      Key(const CodeGenRegister::Set *M, unsigned S = 0, unsigned A = 0)
278babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen        : Members(M), SpillSize(S), SpillAlignment(A) {}
279babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
280babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen      Key(const CodeGenRegisterClass &RC)
281babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen        : Members(&RC.getMembers()),
282babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen          SpillSize(RC.SpillSize),
283babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen          SpillAlignment(RC.SpillAlignment) {}
284babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
285babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen      // Lexicographical order of (Members, SpillSize, SpillAlignment).
286babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen      bool operator<(const Key&) const;
287babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    };
288babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
289babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    // Create a non-user defined register class.
290babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    CodeGenRegisterClass(StringRef Name, Key Props);
291babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
292203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen    // Called by CodeGenRegBank::CodeGenRegBank().
293babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    static void computeSubClasses(CodeGenRegBank&);
2948dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner  };
295dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen
296dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen  // CodeGenRegBank - Represent a target's registers and the relations between
297dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen  // them.
298dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen  class CodeGenRegBank {
299dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen    RecordKeeper &Records;
30059f26aadce1bb985b9befe841fc106c891e1c728Jakob Stoklund Olesen    SetTheory Sets;
30159f26aadce1bb985b9befe841fc106c891e1c728Jakob Stoklund Olesen
3025fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    // SubRegIndices.
3035fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    std::vector<CodeGenSubRegIndex*> SubRegIndices;
3045fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    DenseMap<Record*, CodeGenSubRegIndex*> Def2SubRegIdx;
305dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen    unsigned NumNamedIndices;
3065fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen
3075fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    // Registers.
308abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen    std::vector<CodeGenRegister*> Registers;
309b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    DenseMap<Record*, CodeGenRegister*> Def2Reg;
310b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
311babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    // Register classes.
31229f018cee616e4082e5005bc9adee4dc777e621cJakob Stoklund Olesen    std::vector<CodeGenRegisterClass*> RegClasses;
3137b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    DenseMap<Record*, CodeGenRegisterClass*> Def2RC;
314babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    typedef std::map<CodeGenRegisterClass::Key, CodeGenRegisterClass*> RCKeyMap;
315babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    RCKeyMap Key2RC;
316babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
317babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    // Add RC to *2RC maps.
318babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    void addToMaps(CodeGenRegisterClass*);
319babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
3201b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen    // Create a synthetic sub-class if it is missing.
3211b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen    CodeGenRegisterClass *getOrCreateSubClass(const CodeGenRegisterClass *RC,
3221b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen                                              const CodeGenRegister::Set *Membs,
3231b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen                                              StringRef Name);
3241b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen
325babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    // Infer missing register classes.
326babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    void computeInferredRegisterClasses();
3277e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen    void inferCommonSubClass(CodeGenRegisterClass *RC);
328fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen    void inferSubClassWithSubReg(CodeGenRegisterClass *RC);
329a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    void inferMatchingSuperRegClass(CodeGenRegisterClass *RC,
330a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen                                    unsigned FirstSubRegRC = 0);
3317b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen
332b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    // Populate the Composite map from sub-register relationships.
333b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    void computeComposites();
334dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen
335dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen  public:
336dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen    CodeGenRegBank(RecordKeeper&);
337dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen
33859f26aadce1bb985b9befe841fc106c891e1c728Jakob Stoklund Olesen    SetTheory &getSets() { return Sets; }
33959f26aadce1bb985b9befe841fc106c891e1c728Jakob Stoklund Olesen
340b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    // Sub-register indices. The first NumNamedIndices are defined by the user
341b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    // in the .td files. The rest are synthesized such that all sub-registers
342b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    // have a unique name.
3435fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    ArrayRef<CodeGenSubRegIndex*> getSubRegIndices() { return SubRegIndices; }
344dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen    unsigned getNumNamedIndices() { return NumNamedIndices; }
345dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen
3465fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    // Find a SubRegIndex form its Record def.
3475fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    CodeGenSubRegIndex *getSubRegIdx(Record*);
348dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen
349b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    // Find or create a sub-register index representing the A+B composition.
3505fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen    CodeGenSubRegIndex *getCompositeSubRegIndex(CodeGenSubRegIndex *A,
35190498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen                                                CodeGenSubRegIndex *B);
352b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
353abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen    const std::vector<CodeGenRegister*> &getRegisters() { return Registers; }
354b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
355b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    // Find a register from its Record def.
356b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    CodeGenRegister *getReg(Record*);
357b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
35829f018cee616e4082e5005bc9adee4dc777e621cJakob Stoklund Olesen    ArrayRef<CodeGenRegisterClass*> getRegClasses() const {
3597b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen      return RegClasses;
3607b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    }
3617b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen
3627b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    // Find a register class from its def.
3637b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    CodeGenRegisterClass *getRegClass(Record*);
3647b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen
3657b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    /// getRegisterClassForRegister - Find the register class that contains the
3667b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    /// specified physical register.  If the register is not in a register
3677b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    /// class, return null. If the register is in multiple classes, and the
3687b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    /// classes have a superset-subset relationship and the same set of types,
3697b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    /// return the superclass.  Otherwise return null.
3707b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    const CodeGenRegisterClass* getRegClassForRegister(Record *R);
3717b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen
372b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    // Computed derived records such as missing sub-register indices.
373b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    void computeDerivedInfo();
374026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen
375026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    // Compute full overlap sets for every register. These sets include the
376026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    // rarely used aliases that are neither sub nor super-registers.
377026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    //
378026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    // Map[R1].count(R2) is reflexive and symmetric, but not transitive.
379026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    //
380026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    // If R1 is a sub-register of R2, Map[R1] is a subset of Map[R2].
381026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    void computeOverlaps(std::map<const CodeGenRegister*,
382026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen                                  CodeGenRegister::Set> &Map);
383ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen
384ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen    // Compute the set of registers completely covered by the registers in Regs.
385ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen    // The returned BitVector will have a bit set for each register in Regs,
386ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen    // all sub-registers, and all super-registers that are covered by the
387ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen    // registers in Regs.
388ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen    //
389ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen    // This is used to compute the mask of call-preserved registers from a list
390ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen    // of callee-saves.
391ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen    BitVector computeCoveredRegisters(ArrayRef<Record*> Regs);
392dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen  };
3938dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner}
3948dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner
3958dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner#endif
396