Add register size info back to MCRegisterClass
authorRafael Auler <rafaelauler@fb.com>
Wed, 3 Mar 2021 22:31:57 +0000 (14:31 -0800)
committerRafael Auler <rafaelauler@fb.com>
Tue, 23 Mar 2021 22:04:44 +0000 (15:04 -0700)
This patch addresses the removal of register size information done in
commit c8b782c.

Without this change, there is no viable option to get register size
information outside libTarget. We need this information to run
analysis that know the register size from the MC layer, used by
BOLT.

Discussion D50285 and D47199.

Reviewed By: kparzysz

Differential Revision: https://reviews.llvm.org/D97891

llvm/include/llvm/MC/MCRegisterInfo.h
llvm/utils/TableGen/RegisterInfoEmitter.cpp

index 0c1ac62..65436dc 100644 (file)
@@ -39,6 +39,7 @@ public:
   const uint16_t RegsSize;
   const uint16_t RegSetSize;
   const uint16_t ID;
+  const uint16_t RegSizeInBits;
   const int8_t CopyCost;
   const bool Allocatable;
 
@@ -78,6 +79,12 @@ public:
     return contains(Reg1) && contains(Reg2);
   }
 
+  /// Return the size of the physical register in bits if we are able to
+  /// determine it. This always returns zero for registers of targets that use
+  /// HW modes, as we need more information to determine the size of registers
+  /// in such cases. Use TargetRegisterInfo to cover them.
+  unsigned getSizeInBits() const { return RegSizeInBits; }
+
   /// getCopyCost - Return the cost of copying a value between two registers in
   /// this class. A negative number means the register class is very expensive
   /// to copy e.g. status flag register classes.
index 41d5720..8a744e6 100644 (file)
@@ -1084,12 +1084,15 @@ RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
 
   for (const auto &RC : RegisterClasses) {
     assert(isInt<8>(RC.CopyCost) && "Copy cost too large.");
+    uint32_t RegSize = 0;
+    if (RC.RSI.isSimple())
+      RegSize = RC.RSI.getSimple().RegSize;
     OS << "  { " << RC.getName() << ", " << RC.getName() << "Bits, "
-       << RegClassStrings.get(RC.getName()) << ", "
-       << RC.getOrder().size() << ", sizeof(" << RC.getName() << "Bits), "
-       << RC.getQualifiedName() + "RegClassID" << ", "
-       << RC.CopyCost << ", "
-       << ( RC.Allocatable ? "true" : "false" ) << " },\n";
+       << RegClassStrings.get(RC.getName()) << ", " << RC.getOrder().size()
+       << ", sizeof(" << RC.getName() << "Bits), "
+       << RC.getQualifiedName() + "RegClassID"
+       << ", " << RegSize << ", " << RC.CopyCost << ", "
+       << (RC.Allocatable ? "true" : "false") << " },\n";
   }
 
   OS << "};\n\n";