diff options
| author | Eric Christopher <echristo@gmail.com> | 2015-03-12 22:48:50 +0000 | 
|---|---|---|
| committer | Eric Christopher <echristo@gmail.com> | 2015-03-12 22:48:50 +0000 | 
| commit | ae32649ff256395d2f56ab86ff5eefc06755dea7 (patch) | |
| tree | f14231332e560c92a4dd47fcb82fe93fe3001660 /llvm/lib/Target | |
| parent | 2aa191c8781671d76cfc2dfde99f79a413bad5d9 (diff) | |
| download | bcm5719-llvm-ae32649ff256395d2f56ab86ff5eefc06755dea7.tar.gz bcm5719-llvm-ae32649ff256395d2f56ab86ff5eefc06755dea7.zip | |
In preparation for moving ARM's TargetRegisterInfo to the TargetMachine
merge Thumb1RegisterInfo and Thumb2RegisterInfo. This will enable
us to match the TargetMachine for our TargetRegisterInfo classes.
llvm-svn: 232117
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/README-Thumb.txt | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/Thumb1FrameLowering.cpp | 14 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/Thumb1FrameLowering.h | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/Thumb1InstrInfo.h | 6 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/Thumb2InstrInfo.h | 6 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/Thumb2RegisterInfo.cpp | 51 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/Thumb2RegisterInfo.h | 38 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ThumbRegisterInfo.cpp (renamed from llvm/lib/Target/ARM/Thumb1RegisterInfo.cpp) | 114 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ThumbRegisterInfo.h (renamed from llvm/lib/Target/ARM/Thumb1RegisterInfo.h) | 11 | 
12 files changed, 105 insertions, 146 deletions
| diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index aa225403b43..74e8512851e 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -1991,7 +1991,7 @@ ARMTargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,    if (isCalleeStructRet || isCallerStructRet)      return false; -  // FIXME: Completely disable sibcall for Thumb1 since Thumb1RegisterInfo:: +  // FIXME: Completely disable sibcall for Thumb1 since ThumbRegisterInfo::    // emitEpilogue is not ready for them. Thumb tail calls also use t2B, as    // the Thumb1 16-bit unconditional branch doesn't have sufficient relocation    // support in the assembler and linker to be used. This would need to be diff --git a/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp b/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp index a8d09818978..e3412e978b0 100644 --- a/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp +++ b/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp @@ -19,7 +19,7 @@  #include "ARMMachineFunctionInfo.h"  #include "ARMSubtarget.h"  #include "MCTargetDesc/ARMAddressingModes.h" -#include "Thumb1RegisterInfo.h" +#include "ThumbRegisterInfo.h"  #include "llvm/ADT/DenseMap.h"  #include "llvm/ADT/STLExtras.h"  #include "llvm/ADT/SmallPtrSet.h" diff --git a/llvm/lib/Target/ARM/CMakeLists.txt b/llvm/lib/Target/ARM/CMakeLists.txt index 2530640139a..0b6981979cf 100644 --- a/llvm/lib/Target/ARM/CMakeLists.txt +++ b/llvm/lib/Target/ARM/CMakeLists.txt @@ -40,10 +40,9 @@ add_llvm_target(ARMCodeGen    MLxExpansionPass.cpp    Thumb1FrameLowering.cpp    Thumb1InstrInfo.cpp -  Thumb1RegisterInfo.cpp +  ThumbRegisterInfo.cpp    Thumb2ITBlockPass.cpp    Thumb2InstrInfo.cpp -  Thumb2RegisterInfo.cpp    Thumb2SizeReduction.cpp    ) diff --git a/llvm/lib/Target/ARM/README-Thumb.txt b/llvm/lib/Target/ARM/README-Thumb.txt index f4d9be3beb6..2d031d015f3 100644 --- a/llvm/lib/Target/ARM/README-Thumb.txt +++ b/llvm/lib/Target/ARM/README-Thumb.txt @@ -232,7 +232,7 @@ Make use of hi register variants of cmp: tCMPhir / tCMPZhir.  //===---------------------------------------------------------------------===//  Thumb1 immediate field sometimes keep pre-scaled values. See -Thumb1RegisterInfo::eliminateFrameIndex. This is inconsistent from ARM and +ThumbRegisterInfo::eliminateFrameIndex. This is inconsistent from ARM and  Thumb2.  //===---------------------------------------------------------------------===// diff --git a/llvm/lib/Target/ARM/Thumb1FrameLowering.cpp b/llvm/lib/Target/ARM/Thumb1FrameLowering.cpp index 825d359727b..c496cd7c759 100644 --- a/llvm/lib/Target/ARM/Thumb1FrameLowering.cpp +++ b/llvm/lib/Target/ARM/Thumb1FrameLowering.cpp @@ -41,7 +41,7 @@ static void  emitSPUpdate(MachineBasicBlock &MBB,               MachineBasicBlock::iterator &MBBI,               const TargetInstrInfo &TII, DebugLoc dl, -             const Thumb1RegisterInfo &MRI, +             const ThumbRegisterInfo &MRI,               int NumBytes, unsigned MIFlags = MachineInstr::NoFlags)  {    emitThumbRegPlusImmediate(MBB, MBBI, dl, ARM::SP, ARM::SP, NumBytes, TII,                              MRI, MIFlags); @@ -53,8 +53,8 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,                                MachineBasicBlock::iterator I) const {    const Thumb1InstrInfo &TII =        *static_cast<const Thumb1InstrInfo *>(STI.getInstrInfo()); -  const Thumb1RegisterInfo *RegInfo = -      static_cast<const Thumb1RegisterInfo *>(STI.getRegisterInfo()); +  const ThumbRegisterInfo *RegInfo = +      static_cast<const ThumbRegisterInfo *>(STI.getRegisterInfo());    if (!hasReservedCallFrame(MF)) {      // If we have alloca, convert as follows:      // ADJCALLSTACKDOWN -> sub, sp, sp, amount @@ -89,8 +89,8 @@ void Thumb1FrameLowering::emitPrologue(MachineFunction &MF) const {    ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();    MachineModuleInfo &MMI = MF.getMMI();    const MCRegisterInfo *MRI = MMI.getContext().getRegisterInfo(); -  const Thumb1RegisterInfo *RegInfo = -      static_cast<const Thumb1RegisterInfo *>(STI.getRegisterInfo()); +  const ThumbRegisterInfo *RegInfo = +      static_cast<const ThumbRegisterInfo *>(STI.getRegisterInfo());    const Thumb1InstrInfo &TII =        *static_cast<const Thumb1InstrInfo *>(STI.getInstrInfo()); @@ -327,8 +327,8 @@ void Thumb1FrameLowering::emitEpilogue(MachineFunction &MF,    DebugLoc dl = MBBI->getDebugLoc();    MachineFrameInfo *MFI = MF.getFrameInfo();    ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>(); -  const Thumb1RegisterInfo *RegInfo = -      static_cast<const Thumb1RegisterInfo *>(STI.getRegisterInfo()); +  const ThumbRegisterInfo *RegInfo = +      static_cast<const ThumbRegisterInfo *>(STI.getRegisterInfo());    const Thumb1InstrInfo &TII =        *static_cast<const Thumb1InstrInfo *>(STI.getInstrInfo()); diff --git a/llvm/lib/Target/ARM/Thumb1FrameLowering.h b/llvm/lib/Target/ARM/Thumb1FrameLowering.h index b785b2823da..cf932035b8d 100644 --- a/llvm/lib/Target/ARM/Thumb1FrameLowering.h +++ b/llvm/lib/Target/ARM/Thumb1FrameLowering.h @@ -16,7 +16,7 @@  #include "ARMFrameLowering.h"  #include "Thumb1InstrInfo.h" -#include "Thumb1RegisterInfo.h" +#include "ThumbRegisterInfo.h"  #include "llvm/Target/TargetFrameLowering.h"  namespace llvm { diff --git a/llvm/lib/Target/ARM/Thumb1InstrInfo.h b/llvm/lib/Target/ARM/Thumb1InstrInfo.h index 9fba76052a1..f3f493d8923 100644 --- a/llvm/lib/Target/ARM/Thumb1InstrInfo.h +++ b/llvm/lib/Target/ARM/Thumb1InstrInfo.h @@ -15,13 +15,13 @@  #define LLVM_LIB_TARGET_ARM_THUMB1INSTRINFO_H  #include "ARMBaseInstrInfo.h" -#include "Thumb1RegisterInfo.h" +#include "ThumbRegisterInfo.h"  namespace llvm {    class ARMSubtarget;  class Thumb1InstrInfo : public ARMBaseInstrInfo { -  Thumb1RegisterInfo RI; +  ThumbRegisterInfo RI;  public:    explicit Thumb1InstrInfo(const ARMSubtarget &STI); @@ -36,7 +36,7 @@ public:    /// such, whenever a client has an instance of instruction info, it should    /// always be able to get register info as well (through this method).    /// -  const Thumb1RegisterInfo &getRegisterInfo() const override { return RI; } +  const ThumbRegisterInfo &getRegisterInfo() const override { return RI; }    void copyPhysReg(MachineBasicBlock &MBB,                     MachineBasicBlock::iterator I, DebugLoc DL, diff --git a/llvm/lib/Target/ARM/Thumb2InstrInfo.h b/llvm/lib/Target/ARM/Thumb2InstrInfo.h index 46a1f6d600a..916ab06ec30 100644 --- a/llvm/lib/Target/ARM/Thumb2InstrInfo.h +++ b/llvm/lib/Target/ARM/Thumb2InstrInfo.h @@ -15,14 +15,14 @@  #define LLVM_LIB_TARGET_ARM_THUMB2INSTRINFO_H  #include "ARMBaseInstrInfo.h" -#include "Thumb2RegisterInfo.h" +#include "ThumbRegisterInfo.h"  namespace llvm {  class ARMSubtarget;  class ScheduleHazardRecognizer;  class Thumb2InstrInfo : public ARMBaseInstrInfo { -  Thumb2RegisterInfo RI; +  ThumbRegisterInfo RI;  public:    explicit Thumb2InstrInfo(const ARMSubtarget &STI); @@ -60,7 +60,7 @@ public:    /// such, whenever a client has an instance of instruction info, it should    /// always be able to get register info as well (through this method).    /// -  const Thumb2RegisterInfo &getRegisterInfo() const override { return RI; } +  const ThumbRegisterInfo &getRegisterInfo() const override { return RI; }  private:    void expandLoadStackGuard(MachineBasicBlock::iterator MI, diff --git a/llvm/lib/Target/ARM/Thumb2RegisterInfo.cpp b/llvm/lib/Target/ARM/Thumb2RegisterInfo.cpp deleted file mode 100644 index e7cab6fb880..00000000000 --- a/llvm/lib/Target/ARM/Thumb2RegisterInfo.cpp +++ /dev/null @@ -1,51 +0,0 @@ -//===-- Thumb2RegisterInfo.cpp - Thumb-2 Register Information -------------===// -// -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file contains the Thumb-2 implementation of the TargetRegisterInfo -// class. -// -//===----------------------------------------------------------------------===// - -#include "Thumb2RegisterInfo.h" -#include "ARM.h" -#include "ARMSubtarget.h" -#include "llvm/CodeGen/MachineConstantPool.h" -#include "llvm/CodeGen/MachineFunction.h" -#include "llvm/CodeGen/MachineInstrBuilder.h" -#include "llvm/IR/Constants.h" -#include "llvm/IR/DerivedTypes.h" -#include "llvm/IR/Function.h" -#include "llvm/Target/TargetInstrInfo.h" -#include "llvm/Target/TargetMachine.h" -using namespace llvm; - -Thumb2RegisterInfo::Thumb2RegisterInfo() : ARMBaseRegisterInfo() {} - -/// emitLoadConstPool - Emits a load from constpool to materialize the -/// specified immediate. -void -Thumb2RegisterInfo::emitLoadConstPool(MachineBasicBlock &MBB, -                                      MachineBasicBlock::iterator &MBBI, -                                      DebugLoc dl, -                                      unsigned DestReg, unsigned SubIdx, -                                      int Val, -                                      ARMCC::CondCodes Pred, unsigned PredReg, -                                      unsigned MIFlags) const { -  MachineFunction &MF = *MBB.getParent(); -  const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo(); -  MachineConstantPool *ConstantPool = MF.getConstantPool(); -  const Constant *C = ConstantInt::get( -           Type::getInt32Ty(MBB.getParent()->getFunction()->getContext()), Val); -  unsigned Idx = ConstantPool->getConstantPoolIndex(C, 4); - -  BuildMI(MBB, MBBI, dl, TII.get(ARM::t2LDRpci)) -    .addReg(DestReg, getDefRegState(true), SubIdx) -    .addConstantPoolIndex(Idx).addImm((int64_t)ARMCC::AL).addReg(0) -    .setMIFlags(MIFlags); -} diff --git a/llvm/lib/Target/ARM/Thumb2RegisterInfo.h b/llvm/lib/Target/ARM/Thumb2RegisterInfo.h deleted file mode 100644 index c5279a98f0f..00000000000 --- a/llvm/lib/Target/ARM/Thumb2RegisterInfo.h +++ /dev/null @@ -1,38 +0,0 @@ -//===- Thumb2RegisterInfo.h - Thumb-2 Register Information Impl -*- C++ -*-===// -// -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file contains the Thumb-2 implementation of the TargetRegisterInfo -// class. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_LIB_TARGET_ARM_THUMB2REGISTERINFO_H -#define LLVM_LIB_TARGET_ARM_THUMB2REGISTERINFO_H - -#include "ARMBaseRegisterInfo.h" - -namespace llvm { - -class ARMSubtarget; - -struct Thumb2RegisterInfo : public ARMBaseRegisterInfo { -public: -  Thumb2RegisterInfo(); - -  /// emitLoadConstPool - Emits a load from constpool to materialize the -  /// specified immediate. -  void -  emitLoadConstPool(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, -                    DebugLoc dl, unsigned DestReg, unsigned SubIdx, int Val, -                    ARMCC::CondCodes Pred = ARMCC::AL, unsigned PredReg = 0, -                    unsigned MIFlags = MachineInstr::NoFlags) const override; -}; -} - -#endif diff --git a/llvm/lib/Target/ARM/Thumb1RegisterInfo.cpp b/llvm/lib/Target/ARM/ThumbRegisterInfo.cpp index 9725e19e1d0..e70b6172b46 100644 --- a/llvm/lib/Target/ARM/Thumb1RegisterInfo.cpp +++ b/llvm/lib/Target/ARM/ThumbRegisterInfo.cpp @@ -1,4 +1,4 @@ -//===-- Thumb1RegisterInfo.cpp - Thumb-1 Register Information -------------===// +//===-- ThumbRegisterInfo.cpp - Thumb-1 Register Information -------------===//  //  //                     The LLVM Compiler Infrastructure  // @@ -12,7 +12,7 @@  //  //===----------------------------------------------------------------------===// -#include "Thumb1RegisterInfo.h" +#include "ThumbRegisterInfo.h"  #include "ARMBaseInstrInfo.h"  #include "ARMMachineFunctionInfo.h"  #include "ARMSubtarget.h" @@ -38,32 +38,33 @@ extern cl::opt<bool> ReuseFrameIndexVals;  using namespace llvm; -Thumb1RegisterInfo::Thumb1RegisterInfo() : ARMBaseRegisterInfo() {} +ThumbRegisterInfo::ThumbRegisterInfo() : ARMBaseRegisterInfo() {}  const TargetRegisterClass * -Thumb1RegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC, +ThumbRegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC,                                                const MachineFunction &MF) const { +  if (!MF.getSubtarget<ARMSubtarget>().isThumb1Only()) +    return ARMBaseRegisterInfo::getLargestLegalSuperClass(RC, MF); +    if (ARM::tGPRRegClass.hasSubClassEq(RC))      return &ARM::tGPRRegClass;    return ARMBaseRegisterInfo::getLargestLegalSuperClass(RC, MF);  }  const TargetRegisterClass * -Thumb1RegisterInfo::getPointerRegClass(const MachineFunction &MF, unsigned Kind) -                                                                         const { +ThumbRegisterInfo::getPointerRegClass(const MachineFunction &MF, +                                      unsigned Kind) const { +  if (!MF.getSubtarget<ARMSubtarget>().isThumb1Only()) +    return ARMBaseRegisterInfo::getPointerRegClass(MF, Kind);    return &ARM::tGPRRegClass;  } -/// emitLoadConstPool - Emits a load from constpool to materialize the -/// specified immediate. -void Thumb1RegisterInfo::emitLoadConstPool( -    MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, DebugLoc dl, -    unsigned DestReg, unsigned SubIdx, int Val, ARMCC::CondCodes Pred, -    unsigned PredReg, unsigned MIFlags) const { -  assert((isARMLowRegister(DestReg) || -          isVirtualRegister(DestReg)) && -             "Thumb1 does not have ldr to high register"); - +static void emitThumb1LoadConstPool(MachineBasicBlock &MBB, +                                    MachineBasicBlock::iterator &MBBI, +                                    DebugLoc dl, unsigned DestReg, +                                    unsigned SubIdx, int Val, +                                    ARMCC::CondCodes Pred, unsigned PredReg, +                                    unsigned MIFlags) {    MachineFunction &MF = *MBB.getParent();    const ARMSubtarget &STI = MF.getSubtarget<ARMSubtarget>();    const TargetInstrInfo &TII = *STI.getInstrInfo(); @@ -78,6 +79,42 @@ void Thumb1RegisterInfo::emitLoadConstPool(      .setMIFlags(MIFlags);  } +static void emitThumb2LoadConstPool(MachineBasicBlock &MBB, +                                    MachineBasicBlock::iterator &MBBI, +                                    DebugLoc dl, unsigned DestReg, +                                    unsigned SubIdx, int Val, +                                    ARMCC::CondCodes Pred, unsigned PredReg, +                                    unsigned MIFlags) { +  MachineFunction &MF = *MBB.getParent(); +  const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo(); +  MachineConstantPool *ConstantPool = MF.getConstantPool(); +  const Constant *C = ConstantInt::get( +           Type::getInt32Ty(MBB.getParent()->getFunction()->getContext()), Val); +  unsigned Idx = ConstantPool->getConstantPoolIndex(C, 4); + +  BuildMI(MBB, MBBI, dl, TII.get(ARM::t2LDRpci)) +    .addReg(DestReg, getDefRegState(true), SubIdx) +    .addConstantPoolIndex(Idx).addImm((int64_t)ARMCC::AL).addReg(0) +    .setMIFlags(MIFlags); +} + +/// emitLoadConstPool - Emits a load from constpool to materialize the +/// specified immediate. +void ThumbRegisterInfo::emitLoadConstPool( +    MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, DebugLoc dl, +    unsigned DestReg, unsigned SubIdx, int Val, ARMCC::CondCodes Pred, +    unsigned PredReg, unsigned MIFlags) const { +  MachineFunction &MF = *MBB.getParent(); +  const ARMSubtarget &STI = MF.getSubtarget<ARMSubtarget>(); +  if (STI.isThumb1Only()) { +    assert((isARMLowRegister(DestReg) || isVirtualRegister(DestReg)) && +           "Thumb1 does not have ldr to high register"); +    return emitThumb1LoadConstPool(MBB, MBBI, dl, DestReg, SubIdx, Val, Pred, +                                   PredReg, MIFlags); +  } +  return emitThumb2LoadConstPool(MBB, MBBI, dl, DestReg, SubIdx, Val, Pred, +                                 PredReg, MIFlags); +}  /// emitThumbRegPlusImmInReg - Emits a series of instructions to materialize  /// a destreg = basereg + immediate in Thumb code. Materialize the immediate @@ -312,12 +349,15 @@ static unsigned convertToNonSPOpcode(unsigned Opcode) {    return Opcode;  } -bool Thumb1RegisterInfo:: -rewriteFrameIndex(MachineBasicBlock::iterator II, unsigned FrameRegIdx, -                  unsigned FrameReg, int &Offset, -                  const ARMBaseInstrInfo &TII) const { +bool ThumbRegisterInfo::rewriteFrameIndex(MachineBasicBlock::iterator II, +                                          unsigned FrameRegIdx, +                                          unsigned FrameReg, int &Offset, +                                          const ARMBaseInstrInfo &TII) const {    MachineInstr &MI = *II;    MachineBasicBlock &MBB = *MI.getParent(); +  const MachineFunction &MF = *MBB.getParent(); +  assert(MF.getSubtarget<ARMSubtarget>().isThumb1Only() && +         "This isn't needed for thumb2!");    DebugLoc dl = MI.getDebugLoc();    MachineInstrBuilder MIB(*MBB.getParent(), &MI);    unsigned Opcode = MI.getOpcode(); @@ -381,10 +421,13 @@ rewriteFrameIndex(MachineBasicBlock::iterator II, unsigned FrameRegIdx,    return Offset == 0;  } -void Thumb1RegisterInfo::resolveFrameIndex(MachineInstr &MI, unsigned BaseReg, +void ThumbRegisterInfo::resolveFrameIndex(MachineInstr &MI, unsigned BaseReg,                                             int64_t Offset) const {    const MachineFunction &MF = *MI.getParent()->getParent();    const ARMSubtarget &STI = MF.getSubtarget<ARMSubtarget>(); +  if (!STI.isThumb1Only()) +    return ARMBaseRegisterInfo::resolveFrameIndex(MI, BaseReg, Offset); +    const ARMBaseInstrInfo &TII = *STI.getInstrInfo();    int Off = Offset; // ARM doesn't need the general 64-bit offsets    unsigned i = 0; @@ -400,18 +443,20 @@ void Thumb1RegisterInfo::resolveFrameIndex(MachineInstr &MI, unsigned BaseReg,  /// saveScavengerRegister - Spill the register so it can be used by the  /// register scavenger. Return true. -bool -Thumb1RegisterInfo::saveScavengerRegister(MachineBasicBlock &MBB, -                                          MachineBasicBlock::iterator I, -                                          MachineBasicBlock::iterator &UseMI, -                                          const TargetRegisterClass *RC, -                                          unsigned Reg) const { +bool ThumbRegisterInfo::saveScavengerRegister( +    MachineBasicBlock &MBB, MachineBasicBlock::iterator I, +    MachineBasicBlock::iterator &UseMI, const TargetRegisterClass *RC, +    unsigned Reg) const { + +  const ARMSubtarget &STI = MBB.getParent()->getSubtarget<ARMSubtarget>(); +  if (!STI.isThumb1Only()) +    return ARMBaseRegisterInfo::saveScavengerRegister(MBB, I, UseMI, RC, Reg); +    // Thumb1 can't use the emergency spill slot on the stack because    // ldr/str immediate offsets must be positive, and if we're referencing    // off the frame pointer (if, for example, there are alloca() calls in    // the function, the offset will be negative. Use R12 instead since that's    // a call clobbered register that we know won't be used in Thumb1 mode. -  const ARMSubtarget &STI = MBB.getParent()->getSubtarget<ARMSubtarget>();    const TargetInstrInfo &TII = *STI.getInstrInfo();    DebugLoc DL;    AddDefaultPred(BuildMI(MBB, I, DL, TII.get(ARM::tMOVr)) @@ -450,15 +495,18 @@ Thumb1RegisterInfo::saveScavengerRegister(MachineBasicBlock &MBB,    return true;  } -void -Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, -                                        int SPAdj, unsigned FIOperandNum, -                                        RegScavenger *RS) const { -  unsigned VReg = 0; +void ThumbRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, +                                            int SPAdj, unsigned FIOperandNum, +                                            RegScavenger *RS) const {    MachineInstr &MI = *II;    MachineBasicBlock &MBB = *MI.getParent();    MachineFunction &MF = *MBB.getParent();    const ARMSubtarget &STI = MF.getSubtarget<ARMSubtarget>(); +  if (!STI.isThumb1Only()) +    return ARMBaseRegisterInfo::eliminateFrameIndex(II, SPAdj, FIOperandNum, +                                                    RS); + +  unsigned VReg = 0;    const ARMBaseInstrInfo &TII = *STI.getInstrInfo();    ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();    DebugLoc dl = MI.getDebugLoc(); diff --git a/llvm/lib/Target/ARM/Thumb1RegisterInfo.h b/llvm/lib/Target/ARM/ThumbRegisterInfo.h index 3f99e24f2e6..23aaff37f40 100644 --- a/llvm/lib/Target/ARM/Thumb1RegisterInfo.h +++ b/llvm/lib/Target/ARM/ThumbRegisterInfo.h @@ -1,4 +1,4 @@ -//===- Thumb1RegisterInfo.h - Thumb-1 Register Information Impl -*- C++ -*-===// +//===- ThumbRegisterInfo.h - Thumb Register Information Impl -*- C++ -*-===//  //  //                     The LLVM Compiler Infrastructure  // @@ -7,8 +7,9 @@  //  //===----------------------------------------------------------------------===//  // -// This file contains the Thumb-1 implementation of the TargetRegisterInfo -// class. +// This file contains the Thumb implementation of the TargetRegisterInfo +// class. With the exception of emitLoadConstPool Thumb2 tracks +// ARMBaseRegisterInfo, Thumb1 overloads the functions below.  //  //===----------------------------------------------------------------------===// @@ -22,9 +23,9 @@ namespace llvm {    class ARMSubtarget;    class ARMBaseInstrInfo; -struct Thumb1RegisterInfo : public ARMBaseRegisterInfo { +struct ThumbRegisterInfo : public ARMBaseRegisterInfo {  public: -  Thumb1RegisterInfo(); +  ThumbRegisterInfo();    const TargetRegisterClass *    getLargestLegalSuperClass(const TargetRegisterClass *RC, | 

