From: Krzysztof Parzyszek Date: Fri, 24 Mar 2017 21:01:16 +0000 (+0000) Subject: Move spill size and alignment info from MC to TargetRegisterInfo X-Git-Tag: llvmorg-5.0.0-rc1~9212 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ccc075ca206f7b80493bd8612b297004ff6e7164;p=platform%2Fupstream%2Fllvm.git Move spill size and alignment info from MC to TargetRegisterInfo This is another step towards implementing register classes with parametrized register/spill sizes and value types. This is an updated version of r298652. The difference is that MCRegister- Class still contains register size, available as getPhysRegSize(). The old function getSize was retained as a temporary measure to avoid build breakage for out-of-tree targets. llvm-svn: 298739 --- diff --git a/llvm/include/llvm/MC/MCRegisterInfo.h b/llvm/include/llvm/MC/MCRegisterInfo.h index 76ab4ad..015d0b9 100644 --- a/llvm/include/llvm/MC/MCRegisterInfo.h +++ b/llvm/include/llvm/MC/MCRegisterInfo.h @@ -41,7 +41,7 @@ public: const uint16_t RegsSize; const uint16_t RegSetSize; const uint16_t ID; - const uint16_t RegSize, Alignment; // Size & Alignment of register in bytes + const uint16_t PhysRegSize; const int8_t CopyCost; const bool Allocatable; @@ -80,13 +80,10 @@ public: return contains(Reg1) && contains(Reg2); } - /// getSize - Return the size of the register in bytes, which is also the size - /// of a stack slot allocated to hold a spilled copy of this register. - unsigned getSize() const { return RegSize; } - - /// getAlignment - Return the minimum required alignment for a register of - /// this class. - unsigned getAlignment() const { return Alignment; } + /// Return the size of the physical register in bytes. + unsigned getPhysRegSize() const { return PhysRegSize; } + /// Temporary function to allow out-of-tree targets to switch. + unsigned getSize() const { return getPhysRegSize(); } /// getCopyCost - Return the cost of copying a value between two registers in /// this class. A negative number means the register class is very expensive diff --git a/llvm/include/llvm/Target/TargetRegisterInfo.h b/llvm/include/llvm/Target/TargetRegisterInfo.h index 5a4f1a7..3f5daea 100644 --- a/llvm/include/llvm/Target/TargetRegisterInfo.h +++ b/llvm/include/llvm/Target/TargetRegisterInfo.h @@ -45,6 +45,7 @@ public: // Instance variables filled by tablegen, do not use! const MCRegisterClass *MC; + const uint16_t SpillSize, SpillAlignment; const vt_iterator VTs; const uint32_t *SubClassMask; const uint16_t *SuperRegIndices; @@ -94,10 +95,10 @@ public: /// Return the size of the register in bytes, which is also the size /// of a stack slot allocated to hold a spilled copy of this register. - unsigned getSize() const { return MC->getSize(); } + unsigned getSize() const { return SpillSize; } /// Return the minimum required alignment for a register of this class. - unsigned getAlignment() const { return MC->getAlignment(); } + unsigned getAlignment() const { return SpillAlignment; } /// Return the cost of copying a value between two registers in this class. /// A negative number means the register class is very expensive diff --git a/llvm/utils/TableGen/RegisterInfoEmitter.cpp b/llvm/utils/TableGen/RegisterInfoEmitter.cpp index b75be13..5b56578 100644 --- a/llvm/utils/TableGen/RegisterInfoEmitter.cpp +++ b/llvm/utils/TableGen/RegisterInfoEmitter.cpp @@ -1023,18 +1023,14 @@ RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target, << "MCRegisterClasses[] = {\n"; for (const auto &RC : RegisterClasses) { - // Asserts to make sure values will fit in table assuming types from - // MCRegisterInfo.h - assert((RC.SpillSize/8) <= 0xffff && "SpillSize too large."); - assert((RC.SpillAlignment/8) <= 0xffff && "SpillAlignment too large."); - assert(RC.CopyCost >= -128 && RC.CopyCost <= 127 && "Copy cost too large."); - + assert(isInt<8>(RC.CopyCost) && "Copy cost too large."); + // Register size and spill size will become independent, but are not at + // the moment. For now use SpillSize as the register size. OS << " { " << RC.getName() << ", " << RC.getName() << "Bits, " << RegClassStrings.get(RC.getName()) << ", " << RC.getOrder().size() << ", sizeof(" << RC.getName() << "Bits), " << RC.getQualifiedName() + "RegClassID" << ", " << RC.SpillSize/8 << ", " - << RC.SpillAlignment/8 << ", " << RC.CopyCost << ", " << ( RC.Allocatable ? "true" : "false" ) << " },\n"; } @@ -1316,9 +1312,13 @@ RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target, << " { // Register class instances\n"; for (const auto &RC : RegisterClasses) { + assert(isUInt<16>(RC.SpillSize/8) && "SpillSize too large."); + assert(isUInt<16>(RC.SpillAlignment/8) && "SpillAlignment too large."); OS << " extern const TargetRegisterClass " << RC.getName() << "RegClass = {\n " << '&' << Target.getName() << "MCRegisterClasses[" << RC.getName() << "RegClassID],\n " + << RC.SpillSize/8 << ", /* SpillSize */\n " + << RC.SpillAlignment/8 << ", /* SpillAlignment */\n " << "VTLists + " << VTSeqs.get(RC.VTs) << ",\n " << RC.getName() << "SubClassMask,\n SuperRegIdxSeqs + " << SuperRegIdxSeqs.get(SuperRegIdxLists[RC.EnumValue]) << ",\n ";