Add CopyCost to TargetRegisterClass. This specifies the cost of copying a value
authorEvan Cheng <evan.cheng@apple.com>
Wed, 19 Sep 2007 01:35:01 +0000 (01:35 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 19 Sep 2007 01:35:01 +0000 (01:35 +0000)
between two registers in the specific class.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42123 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/MRegisterInfo.h
lib/Target/Target.td
utils/TableGen/CodeGenRegisters.h
utils/TableGen/CodeGenTarget.cpp
utils/TableGen/RegisterInfoEmitter.cpp

index a4846d8afa8aba332d386eeea0d5eb10336ec2ae..dab5d20b3c2f3b1aebebc6f1a728e5cf0a13cdb8 100644 (file)
@@ -70,6 +70,7 @@ private:
   const sc_iterator SubRegClasses;
   const sc_iterator SuperRegClasses;
   const unsigned RegSize, Alignment;    // Size & Alignment of register in bytes
+  const int CopyCost;
   const iterator RegsBegin, RegsEnd;
 public:
   TargetRegisterClass(unsigned id,
@@ -78,10 +79,11 @@ public:
                       const TargetRegisterClass * const *supcs,
                       const TargetRegisterClass * const *subregcs,
                       const TargetRegisterClass * const *superregcs,
-                      unsigned RS, unsigned Al, iterator RB, iterator RE)
+                      unsigned RS, unsigned Al, int CC,
+                      iterator RB, iterator RE)
     : ID(id), VTs(vts), SubClasses(subcs), SuperClasses(supcs),
     SubRegClasses(subregcs), SuperRegClasses(superregcs),
-    RegSize(RS), Alignment(Al), RegsBegin(RB), RegsEnd(RE) {}
+    RegSize(RS), Alignment(Al), CopyCost(CC), RegsBegin(RB), RegsEnd(RE) {}
   virtual ~TargetRegisterClass() {}     // Allow subclasses
   
   /// getID() - Return the register class ID number.
@@ -258,6 +260,10 @@ public:
   /// getAlignment - Return the minimum required alignment for a register of
   /// this class.
   unsigned getAlignment() const { return Alignment; }
+
+  /// getCopyCost - Return the cost of copying a value between two registers in
+  /// this class.
+  int getCopyCost() const { return CopyCost; }
 };
 
 
index 4e495fb75cd562803bce8b3212d51c4f58e6cffd..15213ce2831a86f30b60cd360ca2ee621f029662 100644 (file)
@@ -104,6 +104,12 @@ class RegisterClass<string namespace, list<ValueType> regTypes, int alignment,
   //
   int Alignment = alignment;
 
+  // CopyCost - This value is used to specify the cost of copying a value
+  // between two registers in this register class. The default value is one
+  // meaning it takes a single instruction to perform the copying. A negative
+  // value means copying is extremely expensive or impossible.
+  int CopyCost = 1;
+
   // MemberList - Specify which registers are in this class.  If the
   // allocation_order_* method are not specified, this also defines the order of
   // allocation used by the register allocator.
index cee81e9092cb6866bc9072c0ed9083b51d26ef23..a5636e34f21e208768d1bfcc3f5195016cd46be1 100644 (file)
@@ -38,6 +38,7 @@ namespace llvm {
     std::vector<MVT::ValueType> VTs;
     unsigned SpillSize;
     unsigned SpillAlignment;
+    int CopyCost;
     std::vector<Record*> SubRegClasses;
     std::string MethodProtos, MethodBodies;
 
index 1fee306e9f832f5a9b2fc0d218301374ff1b3252..c73ffb98ef1a42a3ad415e3e11fb75380e080f7b 100644 (file)
@@ -221,6 +221,7 @@ CodeGenRegisterClass::CodeGenRegisterClass(Record *R) : TheDef(R) {
   Namespace = R->getValueAsString("Namespace");
   SpillSize = Size ? Size : MVT::getSizeInBits(VTs[0]);
   SpillAlignment = R->getValueAsInt("Alignment");
+  CopyCost = R->getValueAsInt("CopyCost");
   MethodBodies = R->getValueAsCode("MethodBodies");
   MethodProtos = R->getValueAsCode("MethodProtos");
 }
index 06c575da3ae3ca18ab57ecffbda0e4b184e3716f..2f948afa3deec31d5b98f48d4569e296ba9bb701 100644 (file)
@@ -384,8 +384,10 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
          << RC.getName() + "SubRegClasses" << ", "
          << RC.getName() + "SuperRegClasses" << ", "
          << RC.SpillSize/8 << ", "
-         << RC.SpillAlignment/8 << ", " << RC.getName() << ", "
-         << RC.getName() << " + " << RC.Elements.size() << ") {}\n";
+         << RC.SpillAlignment/8 << ", "
+         << RC.CopyCost << ", "
+         << RC.getName() << ", " << RC.getName() << " + " << RC.Elements.size()
+         << ") {}\n";
     }
   
     OS << "}\n";