[llvm-commits] [llvm] r48220 - /llvm/trunk/lib/Target/TargetRegisterInfo.cpp

Evan Cheng evan.cheng at apple.com
Tue Mar 11 00:54:14 PDT 2008


Author: evancheng
Date: Tue Mar 11 02:54:14 2008
New Revision: 48220

URL: http://llvm.org/viewvc/llvm-project?rev=48220&view=rev
Log:
If there are multiple register classes that a register belongs to, return the super-class (e.g. on x86, returns GR32, not GR32_).

Modified:
    llvm/trunk/lib/Target/TargetRegisterInfo.cpp

Modified: llvm/trunk/lib/Target/TargetRegisterInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetRegisterInfo.cpp?rev=48220&r1=48219&r2=48220&view=diff

==============================================================================
--- llvm/trunk/lib/Target/TargetRegisterInfo.cpp (original)
+++ llvm/trunk/lib/Target/TargetRegisterInfo.cpp Tue Mar 11 02:54:14 2008
@@ -33,6 +33,17 @@
 
 TargetRegisterInfo::~TargetRegisterInfo() {}
 
+namespace {
+  // Sort according to super- / sub- class relations.
+  // i.e. super- register class < sub- register class.
+  struct RCCompare {
+    bool operator()(const TargetRegisterClass* const &LHS,
+                    const TargetRegisterClass* const &RHS) {
+      return RHS->hasSuperClass(LHS);
+    }
+  };
+}
+
 /// getPhysicalRegisterRegClass - Returns the Register Class of a physical
 /// register of the given type. If type is MVT::Other, then just return any
 /// register class the register belongs to.
@@ -40,11 +51,23 @@
 TargetRegisterInfo::getPhysicalRegisterRegClass(unsigned reg,
                                                 MVT::ValueType VT) const {
   assert(isPhysicalRegister(reg) && "reg must be a physical register");
+
   // Pick the register class of the right type that contains this physreg.
-  for (regclass_iterator I = regclass_begin(), E = regclass_end(); I != E; ++I)
-    if ((VT == MVT::Other || (*I)->hasType(VT))
-        && (*I)->contains(reg))
-      return *I;
+  SmallVector<const TargetRegisterClass*, 4> RCs;
+  for (regclass_iterator I = regclass_begin(), E = regclass_end(); I != E; ++I) {
+    if ((VT == MVT::Other || (*I)->hasType(VT)) && (*I)->contains(reg))
+      RCs.push_back(*I);
+  }
+
+  if (RCs.size() == 1)
+    return RCs[0];
+
+  if (RCs.size()) {
+    // Multiple compatible register classes. Get the super- class.
+    std::stable_sort(RCs.begin(), RCs.end(), RCCompare());
+    return RCs[0];
+  }
+
   assert(false && "Couldn't find the register class");
   return 0;
 }





More information about the llvm-commits mailing list