Slightly change TableGen's definition of a register subclass.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 30 Apr 2009 21:22:44 +0000 (21:22 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 30 Apr 2009 21:22:44 +0000 (21:22 +0000)
A subclass is allowed to have a larger spill size than the superclass, and the
spill alignment must be a multiple of the superclass alignment. This causes
the following new subclass relations:

=== Alpha ===
F4RC -> F8RC

=== PPC ===
F4RC -> F8RC

=== SPU ===
R8C -> R16C -> R32C/R32FP -> R64C/R64FP -> GPRC/VECREG

=== X86 ===
FR32  -> FR64  -> VR128
RFP32 -> RFP64 -> RFP80

These subclass relations are consistent with the behaviour of -join-cross-class-copies.

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

utils/TableGen/RegisterInfoEmitter.cpp

index 3c3b2e8ff4109c4e44482622d1e997875239a526..dcf965cc1d7909c6b82f39cc2b1327aea53b4e8f 100644 (file)
@@ -340,8 +340,21 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
       bool Empty = true;
       for (unsigned rc2 = 0, e2 = RegisterClasses.size(); rc2 != e2; ++rc2) {
         const CodeGenRegisterClass &RC2 = RegisterClasses[rc2];
+
+        // RC2 is a sub-class of RC if it is a valid replacement for any
+        // instruction operand where an RC register is required. It must satisfy
+        // these conditions:
+        //
+        // 1. All RC2 registers are also in RC.
+        // 2. The RC2 spill size must not be smaller that the RC spill size.
+        // 3. RC2 spill alignment must be compatible with RC.
+        //
+        // Sub-classes are used to determine if a virtual register can be used
+        // as an instruction operand, or if it must be copied first.
+
         if (rc == rc2 || RC2.Elements.size() > RC.Elements.size() ||
-            RC.SpillSize != RC2.SpillSize || !isSubRegisterClass(RC2, RegSet))
+            (RC.SpillAlignment && RC2.SpillAlignment % RC.SpillAlignment) ||
+            RC.SpillSize > RC2.SpillSize || !isSubRegisterClass(RC2, RegSet))
           continue;
       
         if (!Empty) OS << ", ";