[llvm-commits] [llvm] r108761 - in /llvm/trunk: include/llvm/Target/TargetLowering.h lib/CodeGen/SelectionDAG/TargetLowering.cpp lib/Target/ARM/ARMISelLowering.cpp lib/Target/ARM/ARMISelLowering.h

Evan Cheng evan.cheng at apple.com
Mon Jul 19 15:15:08 PDT 2010


Author: evancheng
Date: Mon Jul 19 17:15:08 2010
New Revision: 108761

URL: http://llvm.org/viewvc/llvm-project?rev=108761&view=rev
Log:
ARM has to provide its own TargetLowering::findRepresentativeClass because its scalar floating point registers alias its vector registers.

Modified:
    llvm/trunk/include/llvm/Target/TargetLowering.h
    llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
    llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
    llvm/trunk/lib/Target/ARM/ARMISelLowering.h

Modified: llvm/trunk/include/llvm/Target/TargetLowering.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetLowering.h?rev=108761&r1=108760&r2=108761&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Target/TargetLowering.h (original)
+++ llvm/trunk/include/llvm/Target/TargetLowering.h Mon Jul 19 17:15:08 2010
@@ -993,6 +993,11 @@
     Synthesizable[VT.getSimpleVT().SimpleTy] = isSynthesizable;
   }
 
+  /// findRepresentativeClass - Return the largest legal super-reg register class
+  /// of the specified register class.
+  virtual const TargetRegisterClass *
+  findRepresentativeClass(const TargetRegisterClass *RC) const;
+
   /// computeRegisterProperties - Once all of the register classes are added,
   /// this allows us to compute derived properties we expose.
   void computeRegisterProperties();
@@ -1698,12 +1703,7 @@
 
   /// hasLegalSuperRegRegClasses - Return true if the specified register class
   /// has one or more super-reg register classes that are legal.
-  bool hasLegalSuperRegRegClasses(const TargetRegisterClass *RC);
-
-  /// findRepresentativeClass - Return the largest legal super-reg register class
-  /// of the specified register class.
-  const TargetRegisterClass *
-  findRepresentativeClass(const TargetRegisterClass *RC);
+  bool hasLegalSuperRegRegClasses(const TargetRegisterClass *RC) const;
 };
 
 /// GetReturnInfo - Given an LLVM IR type and return type attributes,

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp?rev=108761&r1=108760&r2=108761&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp Mon Jul 19 17:15:08 2010
@@ -664,7 +664,8 @@
 
 /// hasLegalSuperRegRegClasses - Return true if the specified register class
 /// has one or more super-reg register classes that are legal.
-bool TargetLowering::hasLegalSuperRegRegClasses(const TargetRegisterClass *RC) {
+bool
+TargetLowering::hasLegalSuperRegRegClasses(const TargetRegisterClass *RC) const{
   if (*RC->superregclasses_begin() == 0)
     return false;
   for (TargetRegisterInfo::regclass_iterator I = RC->superregclasses_begin(),
@@ -679,9 +680,7 @@
 /// findRepresentativeClass - Return the largest legal super-reg register class
 /// of the specified register class.
 const TargetRegisterClass *
-TargetLowering::findRepresentativeClass(const TargetRegisterClass *RC) {
-  if (!RC) return 0;
-
+TargetLowering::findRepresentativeClass(const TargetRegisterClass *RC) const {
   const TargetRegisterClass *BestRC = RC;
   for (TargetRegisterInfo::regclass_iterator I = RC->superregclasses_begin(),
          E = RC->superregclasses_end(); I != E; ++I) {
@@ -820,8 +819,10 @@
   // not a sub-register class / subreg register class) legal register class for
   // a group of value types. For example, on i386, i8, i16, and i32
   // representative would be GR32; while on x86_64 it's GR64.
-  for (unsigned i = 0; i != MVT::LAST_VALUETYPE; ++i)
-    RepRegClassForVT[i] = findRepresentativeClass(RegClassForVT[i]);
+  for (unsigned i = 0; i != MVT::LAST_VALUETYPE; ++i) {
+    const TargetRegisterClass *RC = RegClassForVT[i];
+    RepRegClassForVT[i] = RC ? findRepresentativeClass(RC) : 0;
+  }
 }
 
 const char *TargetLowering::getTargetNodeName(unsigned Opcode) const {

Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=108761&r1=108760&r2=108761&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Mon Jul 19 17:15:08 2010
@@ -550,6 +550,22 @@
     benefitFromCodePlacementOpt = true;
 }
 
+const TargetRegisterClass *
+ARMTargetLowering::findRepresentativeClass(const TargetRegisterClass *RC) const{
+  switch (RC->getID()) {
+  default:
+    return RC;
+  case ARM::tGPRRegClassID:
+  case ARM::GPRRegClassID:
+    return ARM::GPRRegisterClass;
+  case ARM::SPRRegClassID:
+  case ARM::DPRRegClassID:
+    return ARM::DPRRegisterClass;
+  case ARM::QPRRegClassID:
+    return ARM::QPRRegisterClass;
+  }
+}
+
 const char *ARMTargetLowering::getTargetNodeName(unsigned Opcode) const {
   switch (Opcode) {
   default: return 0;

Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.h?rev=108761&r1=108760&r2=108761&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMISelLowering.h (original)
+++ llvm/trunk/lib/Target/ARM/ARMISelLowering.h Mon Jul 19 17:15:08 2010
@@ -271,6 +271,10 @@
     /// materialize the FP immediate as a load from a constant pool.
     virtual bool isFPImmLegal(const APFloat &Imm, EVT VT) const;
 
+  protected:
+    const TargetRegisterClass *
+    findRepresentativeClass(const TargetRegisterClass *RC) const;
+
   private:
     /// Subtarget - Keep a pointer to the ARMSubtarget around so that we can
     /// make the right decision when generating code for different targets.





More information about the llvm-commits mailing list