hasFP() is now a virtual method of MRegisterInfo.
authorEvan Cheng <evan.cheng@apple.com>
Tue, 23 Jan 2007 00:57:47 +0000 (00:57 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Tue, 23 Jan 2007 00:57:47 +0000 (00:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33455 91177308-0d34-0410-b5e6-96231b3b80d8

15 files changed:
include/llvm/Target/MRegisterInfo.h
lib/Target/ARM/ARMRegisterInfo.cpp
lib/Target/ARM/ARMRegisterInfo.h
lib/Target/ARM/ARMRegisterInfo.td
lib/Target/Alpha/AlphaRegisterInfo.cpp
lib/Target/Alpha/AlphaRegisterInfo.h
lib/Target/IA64/IA64RegisterInfo.cpp
lib/Target/IA64/IA64RegisterInfo.h
lib/Target/PowerPC/PPCRegisterInfo.cpp
lib/Target/PowerPC/PPCRegisterInfo.h
lib/Target/Sparc/SparcRegisterInfo.cpp
lib/Target/Sparc/SparcRegisterInfo.h
lib/Target/X86/X86RegisterInfo.cpp
lib/Target/X86/X86RegisterInfo.h
lib/Target/X86/X86RegisterInfo.td

index ad4d3a83b04f8526eb2f5b992a787d5056145db2..29fd6b19f00bb2e5380a479bfb0f5821f669403b 100644 (file)
@@ -367,6 +367,11 @@ public:
     return 0;
   }
 
+  /// hasFP - Return true if the specified function should have a dedicated frame
+  /// pointer register. For most targets this is true only if the function has
+  /// variable sized allocas or if frame pointer elimination is disabled.
+  virtual bool hasFP(const MachineFunction &MF) const = 0;
+
   /// getCallFrameSetup/DestroyOpcode - These methods return the opcode of the
   /// frame setup/destroy instructions if they exist (-1 otherwise).  Some
   /// targets use pseudo instructions in order to abstract away the difference
index 979cb513ef94fb2055e129ff526c7f6db2830dc4..2b179cf8218505e8dccee2ad5f60e39d71224315 100644 (file)
@@ -277,7 +277,7 @@ ARMRegisterInfo::getCalleeSavedRegClasses() const {
 /// pointer register.  This is true if the function has variable sized allocas
 /// or if frame pointer elimination is disabled.
 ///
-static bool hasFP(const MachineFunction &MF) {
+bool ARMRegisterInfo::hasFP(const MachineFunction &MF) const {
   return NoFramePointerElim || MF.getFrameInfo()->hasVarSizedObjects();
 }
 
index 6b9ac39a41269af24dd2a231d5fbb6b653b8756e..96a969856f9888feae365da9b613255db5d6eb25 100644 (file)
@@ -68,6 +68,8 @@ public:
 
   const TargetRegisterClass* const* getCalleeSavedRegClasses() const;
 
+  bool hasFP(const MachineFunction &MF) const;
+
   void eliminateCallFramePseudoInstr(MachineFunction &MF,
                                      MachineBasicBlock &MBB,
                                      MachineBasicBlock::iterator I) const;
index cf33f8dbde166b0ee53e0fca773c755e00b45a74..0dfd790b56d539790d8de3395ddacdcd7ecc1389 100644 (file)
@@ -150,6 +150,7 @@ def GPR : RegisterClass<"ARM", [i32], 32, [R0, R1, R2, R3, R4, R5, R6,
     GPRClass::iterator
     GPRClass::allocation_order_end(const MachineFunction &MF) const {
       const TargetMachine &TM = MF.getTarget();
+      const MRegisterInfo *RI = TM.getRegisterInfo();
       const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
       GPRClass::iterator I;
       if (Subtarget.isThumb())
@@ -167,7 +168,7 @@ def GPR : RegisterClass<"ARM", [i32], 32, [R0, R1, R2, R3, R4, R5, R6,
       }
 
       // Mac OS X requires FP not to be clobbered for backtracing purpose.
-      return (Subtarget.isTargetDarwin() || hasFP(MF)) ? I-1 : I;
+      return (Subtarget.isTargetDarwin() || RI->hasFP(MF)) ? I-1 : I;
     }
   }];
 }
index 5ad7b1962175f6545e8493c9b4a022ef4807275a..37d4deed55faf179f9e2fb0122ceb0e130d0ab49 100644 (file)
@@ -186,7 +186,7 @@ AlphaRegisterInfo::getCalleeSavedRegClasses() const {
 // pointer register.  This is true if the function has variable sized allocas or
 // if frame pointer elimination is disabled.
 //
-static bool hasFP(const MachineFunction &MF) {
+bool AlphaRegisterInfo::hasFP(const MachineFunction &MF) const {
   MachineFrameInfo *MFI = MF.getFrameInfo();
   return MFI->hasVarSizedObjects();
 }
index 6e76e4c50821c306410444225b65896215e40230..5c3f8ecbf685089c5c071c9ad15042d54f42dad1 100644 (file)
@@ -49,6 +49,8 @@ struct AlphaRegisterInfo : public AlphaGenRegisterInfo {
 
   const TargetRegisterClass* const* getCalleeSavedRegClasses() const;
 
+  bool hasFP(const MachineFunction &MF) const;
+
   void eliminateCallFramePseudoInstr(MachineFunction &MF,
                                      MachineBasicBlock &MBB,
                                      MachineBasicBlock::iterator I) const;
index 4e6ebd64ab7bb2e5d7d28ee5854bd96741130543..bd62852013c6f51923c0cdeb118d48cceb63ea0f 100644 (file)
@@ -114,7 +114,7 @@ IA64RegisterInfo::getCalleeSavedRegClasses() const {
 // pointer register.  This is true if the function has variable sized allocas or
 // if frame pointer elimination is disabled.
 //
-static bool hasFP(const MachineFunction &MF) {
+bool IA64RegisterInfo::hasFP(const MachineFunction &MF) const {
   return NoFramePointerElim || MF.getFrameInfo()->hasVarSizedObjects();
 }
 
index e107e7d1c95ca5ed83d7772328eac44729009d8b..42a2567bfaa9e8172182c3d05f51a56de4041871 100644 (file)
@@ -48,6 +48,8 @@ struct IA64RegisterInfo : public IA64GenRegisterInfo {
 
   const TargetRegisterClass* const* getCalleeSavedRegClasses() const;
 
+  bool hasFP(const MachineFunction &MF) const;
+
   void eliminateCallFramePseudoInstr(MachineFunction &MF,
                                      MachineBasicBlock &MBB,
                                      MachineBasicBlock::iterator MI) const;
index 371ab7fa478968ac07a92695d505129c5923b371..e4bea7c4a40ad67ec42c8fb11a46318906a17e56 100644 (file)
@@ -410,7 +410,7 @@ static bool needsFP(const MachineFunction &MF) {
 // hasFP - Return true if the specified function actually has a dedicated frame
 // pointer register.  This is true if the function needs a frame pointer and has
 // a non-zero stack size.
-static bool hasFP(const MachineFunction &MF) {
+bool PPCRegisterInfo::hasFP(const MachineFunction &MF) const {
   const MachineFrameInfo *MFI = MF.getFrameInfo();
   return MFI->getStackSize() && needsFP(MF);
 }
index 5af613896e3fccf5d70cdf3e9955b2f3a12e3989..5408c9f0c42cfab34e0c3c7a3a96e61668721a23 100644 (file)
@@ -58,6 +58,8 @@ public:
 
   const TargetRegisterClass* const* getCalleeSavedRegClasses() const;
 
+  bool hasFP(const MachineFunction &MF) const;
+
   void eliminateCallFramePseudoInstr(MachineFunction &MF,
                                      MachineBasicBlock &MBB,
                                      MachineBasicBlock::iterator I) const;
index 0c884369fb8339c93d1f108675a8d496be86abfd..3cb5e502f90629219f936dcb12abf986494392d6 100644 (file)
@@ -122,6 +122,9 @@ SparcRegisterInfo::getCalleeSavedRegClasses() const {
   return CalleeSavedRegClasses;
 }
 
+bool SparcRegisterInfo::hasFP(const MachineFunction &MF) const {
+  return false;
+}
 
 void SparcRegisterInfo::
 eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
index 263a95fe80db4e3b667638a528521e62b2e6c222..6f80339c01866674e620b0b31dfa0d878a76ce1b 100644 (file)
@@ -52,6 +52,8 @@ struct SparcRegisterInfo : public SparcGenRegisterInfo {
 
   const TargetRegisterClass* const* getCalleeSavedRegClasses() const;
 
+  bool hasFP(const MachineFunction &MF) const;
+
   void eliminateCallFramePseudoInstr(MachineFunction &MF,
                                      MachineBasicBlock &MBB,
                                      MachineBasicBlock::iterator I) const;
index 3579b8439ae2a1bf6ec483609991de4e9717b45b..1ca0f465ffd269f0119ca25d8daa45b59d5c5122 100644 (file)
@@ -891,7 +891,7 @@ X86RegisterInfo::getCalleeSavedRegClasses() const {
 // pointer register.  This is true if the function has variable sized allocas or
 // if frame pointer elimination is disabled.
 //
-static bool hasFP(const MachineFunction &MF) {
+bool X86RegisterInfo::hasFP(const MachineFunction &MF) const {
   return (NoFramePointerElim || 
           MF.getFrameInfo()->hasVarSizedObjects() ||
           MF.getInfo<X86FunctionInfo>()->getForceFramePointer());
@@ -998,7 +998,7 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
   
   // Get the number of bytes to allocate from the FrameInfo
   unsigned NumBytes = MFI->getStackSize();
-  if (MFI->hasCalls() || MF.getFrameInfo()->hasVarSizedObjects()) {
+  if (MFI->hasCalls() || MFI->hasVarSizedObjects()) {
     // When we have no frame pointer, we reserve argument space for call sites
     // in the function immediately on entry to the current function.  This
     // eliminates the need for add/sub ESP brackets around call sites.
index d8bf486cae41d8800fd5965cfa7b442fa0b590ef..904c1fb8ac0b01a2b39369729b9cab796930c9e9 100644 (file)
@@ -78,6 +78,8 @@ public:
   /// length of this list match the getCalleeSavedRegs() list.
   const TargetRegisterClass* const* getCalleeSavedRegClasses() const;
 
+  bool hasFP(const MachineFunction &MF) const;
+
   void eliminateCallFramePseudoInstr(MachineFunction &MF,
                                      MachineBasicBlock &MBB,
                                      MachineBasicBlock::iterator MI) const;
index 4728c0c960a7ee8fd7c5a88c6ec21e928faa331f..696068e75915478879557842d0fa3262f80d619f 100644 (file)
@@ -197,10 +197,11 @@ def GR8 : RegisterClass<"X86", [i8],  8,
     GR8Class::iterator
     GR8Class::allocation_order_begin(const MachineFunction &MF) const {
       const TargetMachine &TM = MF.getTarget();
+      const MRegisterInfo *RI = TM.getRegisterInfo();
       const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
       if (!Subtarget.is64Bit())
         return X86_GR8_AO_32;
-      else if (hasFP(MF))
+      else if (RI->hasFP(MF))
         return X86_GR8_AO_64_fp;
       else
         return X86_GR8_AO_64;
@@ -209,10 +210,11 @@ def GR8 : RegisterClass<"X86", [i8],  8,
     GR8Class::iterator
     GR8Class::allocation_order_end(const MachineFunction &MF) const {
       const TargetMachine &TM = MF.getTarget();
+      const MRegisterInfo *RI = TM.getRegisterInfo();
       const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
       if (!Subtarget.is64Bit())
         return X86_GR8_AO_32 + (sizeof(X86_GR8_AO_32) / sizeof(unsigned));
-      else if (hasFP(MF))
+      else if (RI->hasFP(MF))
         return X86_GR8_AO_64_fp + (sizeof(X86_GR8_AO_64_fp) / sizeof(unsigned));
       else
         return X86_GR8_AO_64 + (sizeof(X86_GR8_AO_64) / sizeof(unsigned));
@@ -248,14 +250,15 @@ def GR16 : RegisterClass<"X86", [i16], 16,
     GR16Class::iterator
     GR16Class::allocation_order_begin(const MachineFunction &MF) const {
       const TargetMachine &TM = MF.getTarget();
+      const MRegisterInfo *RI = TM.getRegisterInfo();
       const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
       if (Subtarget.is64Bit()) {
-        if (hasFP(MF))
+        if (RI->hasFP(MF))
           return X86_GR16_AO_64_fp;
         else
           return X86_GR16_AO_64;
       } else {
-        if (hasFP(MF))
+        if (RI->hasFP(MF))
           return X86_GR16_AO_32_fp;
         else
           return X86_GR16_AO_32;
@@ -265,14 +268,15 @@ def GR16 : RegisterClass<"X86", [i16], 16,
     GR16Class::iterator
     GR16Class::allocation_order_end(const MachineFunction &MF) const {
       const TargetMachine &TM = MF.getTarget();
+      const MRegisterInfo *RI = TM.getRegisterInfo();
       const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
       if (Subtarget.is64Bit()) {
-        if (hasFP(MF))
+        if (RI->hasFP(MF))
           return X86_GR16_AO_64_fp+(sizeof(X86_GR16_AO_64_fp)/sizeof(unsigned));
         else
           return X86_GR16_AO_64 + (sizeof(X86_GR16_AO_64) / sizeof(unsigned));
       } else {
-        if (hasFP(MF))
+        if (RI->hasFP(MF))
           return X86_GR16_AO_32_fp+(sizeof(X86_GR16_AO_32_fp)/sizeof(unsigned));
         else
           return X86_GR16_AO_32 + (sizeof(X86_GR16_AO_32) / sizeof(unsigned));
@@ -309,14 +313,15 @@ def GR32 : RegisterClass<"X86", [i32], 32,
     GR32Class::iterator
     GR32Class::allocation_order_begin(const MachineFunction &MF) const {
       const TargetMachine &TM = MF.getTarget();
+      const MRegisterInfo *RI = TM.getRegisterInfo();
       const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
       if (Subtarget.is64Bit()) {
-        if (hasFP(MF))
+        if (RI->hasFP(MF))
           return X86_GR32_AO_64_fp;
         else
           return X86_GR32_AO_64;
       } else {
-        if (hasFP(MF))
+        if (RI->hasFP(MF))
           return X86_GR32_AO_32_fp;
         else
           return X86_GR32_AO_32;
@@ -326,14 +331,15 @@ def GR32 : RegisterClass<"X86", [i32], 32,
     GR32Class::iterator
     GR32Class::allocation_order_end(const MachineFunction &MF) const {
       const TargetMachine &TM = MF.getTarget();
+      const MRegisterInfo *RI = TM.getRegisterInfo();
       const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>();
       if (Subtarget.is64Bit()) {
-        if (hasFP(MF))
+        if (RI->hasFP(MF))
           return X86_GR32_AO_64_fp+(sizeof(X86_GR32_AO_64_fp)/sizeof(unsigned));
         else
           return X86_GR32_AO_64 + (sizeof(X86_GR32_AO_64) / sizeof(unsigned));
       } else {
-        if (hasFP(MF))
+        if (RI->hasFP(MF))
           return X86_GR32_AO_32_fp+(sizeof(X86_GR32_AO_32_fp)/sizeof(unsigned));
         else
           return X86_GR32_AO_32 + (sizeof(X86_GR32_AO_32) / sizeof(unsigned));
@@ -352,7 +358,9 @@ def GR64 : RegisterClass<"X86", [i64], 64,
   let MethodBodies = [{
     GR64Class::iterator
     GR64Class::allocation_order_end(const MachineFunction &MF) const {
-      if (hasFP(MF))     // Does the function dedicate RBP to being a frame ptr?
+      const TargetMachine &TM = MF.getTarget();
+      const MRegisterInfo *RI = TM.getRegisterInfo();
+      if (RI->hasFP(MF)) // Does the function dedicate RBP to being a frame ptr?
         return end()-2;  // If so, don't allocate RSP or RBP
       else
         return end()-1;  // If not, just don't allocate RSP