CodeGenRegisters.h revision d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45
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. 113c6a96ff6aeeb77e1007364e5603b72f3ab4cc7bdJakob Stoklund Olesen void addSubRegsPreOrder(SetVector<const CodeGenRegister*> &OSet, 1145fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen CodeGenRegBank&) const; 115026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen 116026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // List of super-registers in topological order, small to large. 117c6a96ff6aeeb77e1007364e5603b72f3ab4cc7bdJakob Stoklund Olesen typedef std::vector<const CodeGenRegister*> SuperRegList; 118026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen 119aec111a06b595742683b529a7f4391becd7e24ecAndrew Trick // Get the list of super-registers. This is valid after getSubReg 120aec111a06b595742683b529a7f4391becd7e24ecAndrew Trick // visits all registers during RegBank construction. 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 126dd9a50196cd75dbcb2bd604754cd62f8c1f30357Andrew Trick // List of register units in ascending order. 127dd9a50196cd75dbcb2bd604754cd62f8c1f30357Andrew Trick typedef SmallVector<unsigned, 16> RegUnitList; 128dd9a50196cd75dbcb2bd604754cd62f8c1f30357Andrew Trick 129dd9a50196cd75dbcb2bd604754cd62f8c1f30357Andrew Trick // Get the list of register units. 130dd9a50196cd75dbcb2bd604754cd62f8c1f30357Andrew Trick // This is only valid after getSubRegs() completes. 131dd9a50196cd75dbcb2bd604754cd62f8c1f30357Andrew Trick const RegUnitList &getRegUnits() const { return RegUnits; } 132dd9a50196cd75dbcb2bd604754cd62f8c1f30357Andrew Trick 133d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick // Inherit register units from subregisters. 134d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick // Return true if the RegUnits changed. 135d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick bool inheritRegUnits(CodeGenRegBank &RegBank); 136d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick 137d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick // Adopt a register unit for pressure tracking. 138d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick // A unit is adopted iff its unit number is >= NumNativeRegUnits. 139d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick void adoptRegUnit(unsigned RUID) { RegUnits.push_back(RUID); } 140d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick 141d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick // Get the sum of this register's register unit weights. 142d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick unsigned getWeight(const CodeGenRegBank &RegBank) const; 143d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick 144026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // Order CodeGenRegister pointers by EnumValue. 145026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen struct Less { 146ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen bool operator()(const CodeGenRegister *A, 147ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen const CodeGenRegister *B) const { 148babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen assert(A && B); 149026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen return A->EnumValue < B->EnumValue; 150026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen } 151026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen }; 152026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen 153026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // Canonically ordered set. 154ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen typedef std::set<const CodeGenRegister*, Less> Set; 155026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen 156b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen private: 157b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen bool SubRegsComplete; 158b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen SubRegMap SubRegs; 159026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen SuperRegList SuperRegs; 160dd9a50196cd75dbcb2bd604754cd62f8c1f30357Andrew Trick RegUnitList RegUnits; 1618dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner }; 1628dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner 1638dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner 164ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen class CodeGenRegisterClass { 165ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen CodeGenRegister::Set Members; 166cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen // Allocation orders. Order[0] always contains all registers in Members. 167cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen std::vector<SmallVector<Record*, 16> > Orders; 168203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen // Bit mask of sub-classes including this, indexed by their EnumValue. 169203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen BitVector SubClasses; 170f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen // List of super-classes, topologocally ordered to have the larger classes 171f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen // first. This is the same as sorting by EnumValue. 172f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen SmallVector<CodeGenRegisterClass*, 4> SuperClasses; 173056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner Record *TheDef; 1746fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen std::string Name; 175babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 176babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // For a synthesized class, inherit missing properties from the nearest 177babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // super-class. 178babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen void inheritProperties(CodeGenRegBank&); 179babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 180570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // Map SubRegIndex -> sub-class. This is the largest sub-class where all 181570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // registers have a SubRegIndex sub-register. 1825fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen DenseMap<CodeGenSubRegIndex*, CodeGenRegisterClass*> SubClassWithSubReg; 183845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen 184570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // Map SubRegIndex -> set of super-reg classes. This is all register 185570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // classes SuperRC such that: 186570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // 187570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // R:SubRegIndex in this RC for all R in SuperRC. 188570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // 1895fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen DenseMap<CodeGenSubRegIndex*, 1905fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen SmallPtrSet<CodeGenRegisterClass*, 8> > SuperRegClasses; 1916fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen public: 1927dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen unsigned EnumValue; 193c67c18fd2378fd2394c42f12b67897e7eba02d5cChris Lattner std::string Namespace; 194825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson std::vector<MVT::SimpleValueType> VTs; 195056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner unsigned SpillSize; 196056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner unsigned SpillAlignment; 197a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng int CopyCost; 198f462e3fac7ac67503657d63dc35330d0b19359b3Jakob Stoklund Olesen bool Allocatable; 19909bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen // Map SubRegIndex -> RegisterClass 20009bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen DenseMap<Record*,Record*> SubRegClasses; 20154c47c1ce94b9e549ef768e80fd004788d13ce85Jakob Stoklund Olesen std::string AltOrderSelect; 202056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner 2036fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen // Return the Record that defined this class, or NULL if the class was 2046fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen // created by TableGen. 2056fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen Record *getDef() const { return TheDef; } 2066fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen 2076fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen const std::string &getName() const { return Name; } 2086fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen std::string getQualifiedName() const; 209825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson const std::vector<MVT::SimpleValueType> &getValueTypes() const {return VTs;} 2105c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner unsigned getNumValueTypes() const { return VTs.size(); } 2115d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach 212825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson MVT::SimpleValueType getValueTypeNum(unsigned VTNum) const { 2136510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman if (VTNum < VTs.size()) 2146510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman return VTs[VTNum]; 215655b8de7b2ab773a977e0c524307e71354d8af29Craig Topper llvm_unreachable("VTNum greater than number of ValueTypes in RegClass!"); 2166510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman } 2175d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach 218ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen // Return true if this this class contains the register. 219ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen bool contains(const CodeGenRegister*) const; 2205d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach 221ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen // Returns true if RC is a subclass. 222a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // RC is a sub-class of this class if it is a valid replacement for any 2235d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach // instruction operand where a register of this classis required. It must 224a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // satisfy these conditions: 225a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // 226a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // 1. All RC registers are also in this. 227a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // 2. The RC spill size must not be smaller than our spill size. 228a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // 3. RC spill alignment must be compatible with ours. 229a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // 23052e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen bool hasSubClass(const CodeGenRegisterClass *RC) const { 23152e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen return SubClasses.test(RC->EnumValue); 23252e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen } 233a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher 234845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen // getSubClassWithSubReg - Returns the largest sub-class where all 235845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen // registers have a SubIdx sub-register. 2365fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen CodeGenRegisterClass* 2375fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen getSubClassWithSubReg(CodeGenSubRegIndex *SubIdx) const { 238845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen return SubClassWithSubReg.lookup(SubIdx); 239845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen } 240845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen 2415fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen void setSubClassWithSubReg(CodeGenSubRegIndex *SubIdx, 2425fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen CodeGenRegisterClass *SubRC) { 243845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen SubClassWithSubReg[SubIdx] = SubRC; 244845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen } 245845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen 246570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // getSuperRegClasses - Returns a bit vector of all register classes 247570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // containing only SubIdx super-registers of this class. 2485fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen void getSuperRegClasses(CodeGenSubRegIndex *SubIdx, BitVector &Out) const; 249570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen 250570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // addSuperRegClass - Add a class containing only SudIdx super-registers. 2515fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen void addSuperRegClass(CodeGenSubRegIndex *SubIdx, 2525fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen CodeGenRegisterClass *SuperRC) { 253570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen SuperRegClasses[SubIdx].insert(SuperRC); 254570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen } 255570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen 256f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen // getSubClasses - Returns a constant BitVector of subclasses indexed by 257f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen // EnumValue. 258f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen // The SubClasses vector includs an entry for this class. 259830378f6628ad3af1d0293a0b605065532f99e43Eli Friedman const BitVector &getSubClasses() const { return SubClasses; } 260f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen 261f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen // getSuperClasses - Returns a list of super classes ordered by EnumValue. 262f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen // The array does not include an entry for this class. 263f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen ArrayRef<CodeGenRegisterClass*> getSuperClasses() const { 264f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen return SuperClasses; 265f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen } 266f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen 267ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen // Returns an ordered list of class members. 268ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen // The order of registers is the same as in the .td file. 269b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen // No = 0 is the default allocation order, No = 1 is the first alternative. 270b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen ArrayRef<Record*> getOrder(unsigned No = 0) const { 271cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen return Orders[No]; 272a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher } 2736510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman 274b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen // Return the total number of allocation orders available. 275cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen unsigned getNumOrders() const { return Orders.size(); } 276b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen 27752e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen // Get the set of registers. This set contains the same registers as 27852e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen // getOrder(0). 27952e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen const CodeGenRegister::Set &getMembers() const { return Members; } 28052e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen 281ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen CodeGenRegisterClass(CodeGenRegBank&, Record *R); 282203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen 283babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // A key representing the parts of a register class used for forming 284babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // sub-classes. Note the ordering provided by this key is not the same as 285babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // the topological order used for the EnumValues. 286babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen struct Key { 287babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen const CodeGenRegister::Set *Members; 288babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen unsigned SpillSize; 289babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen unsigned SpillAlignment; 290babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 291babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen Key(const Key &O) 292babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen : Members(O.Members), 293babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen SpillSize(O.SpillSize), 294babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen SpillAlignment(O.SpillAlignment) {} 295babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 296babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen Key(const CodeGenRegister::Set *M, unsigned S = 0, unsigned A = 0) 297babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen : Members(M), SpillSize(S), SpillAlignment(A) {} 298babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 299babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen Key(const CodeGenRegisterClass &RC) 300babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen : Members(&RC.getMembers()), 301babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen SpillSize(RC.SpillSize), 302babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen SpillAlignment(RC.SpillAlignment) {} 303babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 304babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // Lexicographical order of (Members, SpillSize, SpillAlignment). 305babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen bool operator<(const Key&) const; 306babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen }; 307babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 308babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // Create a non-user defined register class. 309babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen CodeGenRegisterClass(StringRef Name, Key Props); 310babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 311203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen // Called by CodeGenRegBank::CodeGenRegBank(). 312babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen static void computeSubClasses(CodeGenRegBank&); 3138dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner }; 314dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen 315dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen // CodeGenRegBank - Represent a target's registers and the relations between 316dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen // them. 317dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen class CodeGenRegBank { 318dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen RecordKeeper &Records; 31959f26aadce1bb985b9befe841fc106c891e1c728Jakob Stoklund Olesen SetTheory Sets; 32059f26aadce1bb985b9befe841fc106c891e1c728Jakob Stoklund Olesen 3215fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen // SubRegIndices. 3225fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen std::vector<CodeGenSubRegIndex*> SubRegIndices; 3235fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen DenseMap<Record*, CodeGenSubRegIndex*> Def2SubRegIdx; 324dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen unsigned NumNamedIndices; 3255fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen 3265fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen // Registers. 327abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen std::vector<CodeGenRegister*> Registers; 328b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen DenseMap<Record*, CodeGenRegister*> Def2Reg; 329d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick unsigned NumNativeRegUnits; 330d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick unsigned NumRegUnits; // # native + adopted register units. 331d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick 332d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick // Map each register unit to a weight (for register pressure). 333d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick // Includes native and adopted register units. 334d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick std::vector<unsigned> RegUnitWeights; 335b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen 336babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // Register classes. 33729f018cee616e4082e5005bc9adee4dc777e621cJakob Stoklund Olesen std::vector<CodeGenRegisterClass*> RegClasses; 3387b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen DenseMap<Record*, CodeGenRegisterClass*> Def2RC; 339babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen typedef std::map<CodeGenRegisterClass::Key, CodeGenRegisterClass*> RCKeyMap; 340babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen RCKeyMap Key2RC; 341babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 342babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // Add RC to *2RC maps. 343babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen void addToMaps(CodeGenRegisterClass*); 344babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 3451b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen // Create a synthetic sub-class if it is missing. 3461b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen CodeGenRegisterClass *getOrCreateSubClass(const CodeGenRegisterClass *RC, 3471b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen const CodeGenRegister::Set *Membs, 3481b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen StringRef Name); 3491b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen 350babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // Infer missing register classes. 351babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen void computeInferredRegisterClasses(); 3527e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen void inferCommonSubClass(CodeGenRegisterClass *RC); 353fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen void inferSubClassWithSubReg(CodeGenRegisterClass *RC); 354a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen void inferMatchingSuperRegClass(CodeGenRegisterClass *RC, 355a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen unsigned FirstSubRegRC = 0); 3567b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen 357d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick // Compute a weight for each register unit created during getSubRegs. 358d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick void computeRegUnitWeights(); 359d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick 360b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen // Populate the Composite map from sub-register relationships. 361b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen void computeComposites(); 362dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen 363dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen public: 364dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen CodeGenRegBank(RecordKeeper&); 365dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen 36659f26aadce1bb985b9befe841fc106c891e1c728Jakob Stoklund Olesen SetTheory &getSets() { return Sets; } 36759f26aadce1bb985b9befe841fc106c891e1c728Jakob Stoklund Olesen 368b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen // Sub-register indices. The first NumNamedIndices are defined by the user 369b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen // in the .td files. The rest are synthesized such that all sub-registers 370b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen // have a unique name. 3715fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen ArrayRef<CodeGenSubRegIndex*> getSubRegIndices() { return SubRegIndices; } 372dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen unsigned getNumNamedIndices() { return NumNamedIndices; } 373dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen 3745fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen // Find a SubRegIndex form its Record def. 3755fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen CodeGenSubRegIndex *getSubRegIdx(Record*); 376dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen 377b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen // Find or create a sub-register index representing the A+B composition. 3785fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen CodeGenSubRegIndex *getCompositeSubRegIndex(CodeGenSubRegIndex *A, 37990498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen CodeGenSubRegIndex *B); 380b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen 381abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen const std::vector<CodeGenRegister*> &getRegisters() { return Registers; } 382b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen 383b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen // Find a register from its Record def. 384b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen CodeGenRegister *getReg(Record*); 385b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen 386d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick // Get a Register's index into the Registers array. 387d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick unsigned getRegIndex(const CodeGenRegister *Reg) const { 388d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick return Reg->EnumValue - 1; 389d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick } 390d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick 391d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick // Create a new non-native register unit that can be adopted by a register 392d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick // to increase its pressure. Note that NumNativeRegUnits is not increased. 393d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick unsigned newRegUnit(unsigned Weight) { 394d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick if (!RegUnitWeights.empty()) { 395d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick RegUnitWeights.resize(NumRegUnits+1); 396d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick RegUnitWeights[NumRegUnits] = Weight; 397d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick } 398d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick return NumRegUnits++; 399d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick } 400d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick 401d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick bool isNativeUnit(unsigned RUID) { 402d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick return RUID < NumNativeRegUnits; 403d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick } 404dd9a50196cd75dbcb2bd604754cd62f8c1f30357Andrew Trick 40529f018cee616e4082e5005bc9adee4dc777e621cJakob Stoklund Olesen ArrayRef<CodeGenRegisterClass*> getRegClasses() const { 4067b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen return RegClasses; 4077b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen } 4087b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen 4097b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen // Find a register class from its def. 4107b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen CodeGenRegisterClass *getRegClass(Record*); 4117b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen 4127b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen /// getRegisterClassForRegister - Find the register class that contains the 4137b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen /// specified physical register. If the register is not in a register 4147b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen /// class, return null. If the register is in multiple classes, and the 4157b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen /// classes have a superset-subset relationship and the same set of types, 4167b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen /// return the superclass. Otherwise return null. 4177b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen const CodeGenRegisterClass* getRegClassForRegister(Record *R); 4187b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen 419d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick unsigned getRegUnitWeight(unsigned RUID) const { 420d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick return RegUnitWeights[RUID]; 421d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick } 422d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick 423d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick void increaseRegUnitWeight(unsigned RUID, unsigned Inc) { 424d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick RegUnitWeights[RUID] += Inc; 425d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick } 426d35ac3c8bc37ab383b10a04b9c8b1087d6b2bc45Andrew Trick 427b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen // Computed derived records such as missing sub-register indices. 428b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen void computeDerivedInfo(); 429026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen 430026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // Compute full overlap sets for every register. These sets include the 431026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // rarely used aliases that are neither sub nor super-registers. 432026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // 433026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // Map[R1].count(R2) is reflexive and symmetric, but not transitive. 434026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // 435026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // If R1 is a sub-register of R2, Map[R1] is a subset of Map[R2]. 436026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen void computeOverlaps(std::map<const CodeGenRegister*, 437026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen CodeGenRegister::Set> &Map); 438ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen 439ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen // Compute the set of registers completely covered by the registers in Regs. 440ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen // The returned BitVector will have a bit set for each register in Regs, 441ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen // all sub-registers, and all super-registers that are covered by the 442ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen // registers in Regs. 443ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen // 444ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen // This is used to compute the mask of call-preserved registers from a list 445ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen // of callee-saves. 446ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen BitVector computeCoveredRegisters(ArrayRef<Record*> Regs); 447dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen }; 4488dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner} 4498dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner 4508dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner#endif 451