diff options
| -rw-r--r-- | llvm/include/llvm/Target/TargetInstrInfo.h | 7 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/PreAllocSplitting.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/TargetInstrInfoImpl.cpp | 11 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/TwoAddressInstructionPass.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/VirtRegRewriter.cpp | 4 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp | 9 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMBaseInstrInfo.h | 3 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrInfo.cpp | 6 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrInfo.h | 3 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.cpp | 5 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.h | 3 | ||||
| -rw-r--r-- | llvm/test/CodeGen/ARM/2009-11-07-SubRegAsmPrinting.ll | 3 | 
13 files changed, 40 insertions, 20 deletions
diff --git a/llvm/include/llvm/Target/TargetInstrInfo.h b/llvm/include/llvm/Target/TargetInstrInfo.h index 194baaf0759..40b7780dfd2 100644 --- a/llvm/include/llvm/Target/TargetInstrInfo.h +++ b/llvm/include/llvm/Target/TargetInstrInfo.h @@ -21,6 +21,7 @@ namespace llvm {  class MCAsmInfo;  class TargetRegisterClass; +class TargetRegisterInfo;  class LiveVariables;  class CalleeSavedInfo;  class SDNode; @@ -224,7 +225,8 @@ public:    virtual void reMaterialize(MachineBasicBlock &MBB,                               MachineBasicBlock::iterator MI,                               unsigned DestReg, unsigned SubIdx, -                             const MachineInstr *Orig) const = 0; +                             const MachineInstr *Orig, +                             const TargetRegisterInfo *TRI) const = 0;    /// convertToThreeAddress - This method must be implemented by targets that    /// set the M_CONVERTIBLE_TO_3_ADDR flag.  When this flag is set, the target @@ -554,7 +556,8 @@ public:    virtual void reMaterialize(MachineBasicBlock &MBB,                               MachineBasicBlock::iterator MI,                               unsigned DestReg, unsigned SubReg, -                             const MachineInstr *Orig) const; +                             const MachineInstr *Orig, +                             const TargetRegisterInfo *TRI) const;    virtual bool isIdentical(const MachineInstr *MI,                             const MachineInstr *Other,                             const MachineRegisterInfo *MRI) const; diff --git a/llvm/lib/CodeGen/PreAllocSplitting.cpp b/llvm/lib/CodeGen/PreAllocSplitting.cpp index f7c2e80c715..8f623452e27 100644 --- a/llvm/lib/CodeGen/PreAllocSplitting.cpp +++ b/llvm/lib/CodeGen/PreAllocSplitting.cpp @@ -881,7 +881,7 @@ bool PreAllocSplitting::Rematerialize(unsigned VReg, VNInfo* ValNo,    if (KillPt == DefMI->getParent()->end())      return false; -  TII->reMaterialize(MBB, RestorePt, VReg, 0, DefMI); +  TII->reMaterialize(MBB, RestorePt, VReg, 0, DefMI, TRI);    SlotIndex RematIdx = LIs->InsertMachineInstrInMaps(prior(RestorePt));    ReconstructLiveInterval(CurrLI); diff --git a/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp b/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp index b5d6b471f47..3909c56bdbb 100644 --- a/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp +++ b/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp @@ -709,7 +709,7 @@ bool SimpleRegisterCoalescing::ReMaterializeTrivialDef(LiveInterval &SrcInt,      }    MachineBasicBlock::iterator MII = next(MachineBasicBlock::iterator(CopyMI)); -  tii_->reMaterialize(*MBB, MII, DstReg, DstSubIdx, DefMI); +  tii_->reMaterialize(*MBB, MII, DstReg, DstSubIdx, DefMI, tri_);    MachineInstr *NewMI = prior(MII);    if (checkForDeadDef) { diff --git a/llvm/lib/CodeGen/TargetInstrInfoImpl.cpp b/llvm/lib/CodeGen/TargetInstrInfoImpl.cpp index 50587f1af80..349d43c7244 100644 --- a/llvm/lib/CodeGen/TargetInstrInfoImpl.cpp +++ b/llvm/lib/CodeGen/TargetInstrInfoImpl.cpp @@ -135,11 +135,16 @@ void TargetInstrInfoImpl::reMaterialize(MachineBasicBlock &MBB,                                          MachineBasicBlock::iterator I,                                          unsigned DestReg,                                          unsigned SubIdx, -                                        const MachineInstr *Orig) const { +                                        const MachineInstr *Orig, +                                        const TargetRegisterInfo *TRI) const {    MachineInstr *MI = MBB.getParent()->CloneMachineInstr(Orig);    MachineOperand &MO = MI->getOperand(0); -  MO.setReg(DestReg); -  MO.setSubReg(SubIdx); +  if (TargetRegisterInfo::isVirtualRegister(DestReg)) { +    MO.setReg(DestReg); +    MO.setSubReg(SubIdx); +  } else { +    MO.setReg(TRI->getSubReg(DestReg, SubIdx)); +  }    MBB.insert(I, MI);  } diff --git a/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp b/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp index 0a6a0d74549..84467ed36d5 100644 --- a/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp +++ b/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp @@ -1033,7 +1033,7 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &MF) {                isProfitableToReMat(regB, rc, mi, DefMI, mbbi, Dist)){              DEBUG(errs() << "2addr: REMATTING : " << *DefMI << "\n");              unsigned regASubIdx = mi->getOperand(DstIdx).getSubReg(); -            TII->reMaterialize(*mbbi, mi, regA, regASubIdx, DefMI); +            TII->reMaterialize(*mbbi, mi, regA, regASubIdx, DefMI, TRI);              ReMatRegs.set(regB);              ++NumReMats;            } else { diff --git a/llvm/lib/CodeGen/VirtRegRewriter.cpp b/llvm/lib/CodeGen/VirtRegRewriter.cpp index 91aaa8c063b..a70cdaf09e4 100644 --- a/llvm/lib/CodeGen/VirtRegRewriter.cpp +++ b/llvm/lib/CodeGen/VirtRegRewriter.cpp @@ -594,7 +594,7 @@ static void UpdateKills(MachineInstr &MI, const TargetRegisterInfo* TRI,    for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {      const MachineOperand &MO = MI.getOperand(i); -    if (!MO.isReg() || !MO.isDef()) +    if (!MO.isReg() || !MO.getReg() || !MO.isDef())        continue;      unsigned Reg = MO.getReg();      RegKills.reset(Reg); @@ -626,7 +626,7 @@ static void ReMaterialize(MachineBasicBlock &MBB,           "Don't know how to remat instructions that define > 1 values!");  #endif    TII->reMaterialize(MBB, MII, DestReg, -                     ReMatDefMI->getOperand(0).getSubReg(), ReMatDefMI); +                     ReMatDefMI->getOperand(0).getSubReg(), ReMatDefMI, TRI);    MachineInstr *NewMI = prior(MII);    for (unsigned i = 0, e = NewMI->getNumOperands(); i != e; ++i) {      MachineOperand &MO = NewMI->getOperand(i); diff --git a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp index 868d31dbe0e..7925101d5a9 100644 --- a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp +++ b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -921,8 +921,15 @@ void ARMBaseInstrInfo::  reMaterialize(MachineBasicBlock &MBB,                MachineBasicBlock::iterator I,                unsigned DestReg, unsigned SubIdx, -              const MachineInstr *Orig) const { +              const MachineInstr *Orig, +              const TargetRegisterInfo *TRI) const {    DebugLoc dl = Orig->getDebugLoc(); + +  if (SubIdx && TargetRegisterInfo::isPhysicalRegister(DestReg)) { +    DestReg = TRI->getSubReg(DestReg, SubIdx); +    SubIdx = 0; +  } +    unsigned Opcode = Orig->getOpcode();    switch (Opcode) {    default: { diff --git a/llvm/lib/Target/ARM/ARMBaseInstrInfo.h b/llvm/lib/Target/ARM/ARMBaseInstrInfo.h index 682db0506e1..29855e2c616 100644 --- a/llvm/lib/Target/ARM/ARMBaseInstrInfo.h +++ b/llvm/lib/Target/ARM/ARMBaseInstrInfo.h @@ -267,7 +267,8 @@ public:    virtual void reMaterialize(MachineBasicBlock &MBB,                               MachineBasicBlock::iterator MI,                               unsigned DestReg, unsigned SubIdx, -                             const MachineInstr *Orig) const; +                             const MachineInstr *Orig, +                             const TargetRegisterInfo *TRI) const;    virtual bool isIdentical(const MachineInstr *MI, const MachineInstr *Other,                             const MachineRegisterInfo *MRI) const; diff --git a/llvm/lib/Target/ARM/ARMInstrInfo.cpp b/llvm/lib/Target/ARM/ARMInstrInfo.cpp index 5e5b718dd72..87bb12b5115 100644 --- a/llvm/lib/Target/ARM/ARMInstrInfo.cpp +++ b/llvm/lib/Target/ARM/ARMInstrInfo.cpp @@ -81,8 +81,8 @@ bool ARMInstrInfo::BlockHasNoFallThrough(const MachineBasicBlock &MBB) const {  void ARMInstrInfo::  reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, -              unsigned DestReg, unsigned SubIdx, -              const MachineInstr *Orig) const { +              unsigned DestReg, unsigned SubIdx, const MachineInstr *Orig, +              const TargetRegisterInfo *TRI) const {    DebugLoc dl = Orig->getDebugLoc();    unsigned Opcode = Orig->getOpcode();    switch (Opcode) { @@ -100,6 +100,6 @@ reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,    }    } -  return ARMBaseInstrInfo::reMaterialize(MBB, I, DestReg, SubIdx, Orig); +  return ARMBaseInstrInfo::reMaterialize(MBB, I, DestReg, SubIdx, Orig, TRI);  } diff --git a/llvm/lib/Target/ARM/ARMInstrInfo.h b/llvm/lib/Target/ARM/ARMInstrInfo.h index 9b9c0c7ce0f..431957787db 100644 --- a/llvm/lib/Target/ARM/ARMInstrInfo.h +++ b/llvm/lib/Target/ARM/ARMInstrInfo.h @@ -37,7 +37,8 @@ public:    void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,                       unsigned DestReg, unsigned SubIdx, -                     const MachineInstr *Orig) const; +                     const MachineInstr *Orig, +                     const TargetRegisterInfo *TRI) const;    /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info.  As    /// such, whenever a client has an instance of instruction info, it should diff --git a/llvm/lib/Target/X86/X86InstrInfo.cpp b/llvm/lib/Target/X86/X86InstrInfo.cpp index ac5e7dae4e7..e585ca1434c 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.cpp +++ b/llvm/lib/Target/X86/X86InstrInfo.cpp @@ -991,12 +991,13 @@ static bool isSafeToClobberEFLAGS(MachineBasicBlock &MBB,  void X86InstrInfo::reMaterialize(MachineBasicBlock &MBB,                                   MachineBasicBlock::iterator I,                                   unsigned DestReg, unsigned SubIdx, -                                 const MachineInstr *Orig) const { +                                 const MachineInstr *Orig, +                                 const TargetRegisterInfo *TRI) const {    DebugLoc DL = DebugLoc::getUnknownLoc();    if (I != MBB.end()) DL = I->getDebugLoc();    if (SubIdx && TargetRegisterInfo::isPhysicalRegister(DestReg)) { -    DestReg = RI.getSubReg(DestReg, SubIdx); +    DestReg = TRI->getSubReg(DestReg, SubIdx);      SubIdx = 0;    } diff --git a/llvm/lib/Target/X86/X86InstrInfo.h b/llvm/lib/Target/X86/X86InstrInfo.h index a9a50abe42f..c6daa251430 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.h +++ b/llvm/lib/Target/X86/X86InstrInfo.h @@ -482,7 +482,8 @@ public:                                           AliasAnalysis *AA) const;    void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,                       unsigned DestReg, unsigned SubIdx, -                     const MachineInstr *Orig) const; +                     const MachineInstr *Orig, +                     const TargetRegisterInfo *TRI) const;    /// convertToThreeAddress - This method must be implemented by targets that    /// set the M_CONVERTIBLE_TO_3_ADDR flag.  When this flag is set, the target diff --git a/llvm/test/CodeGen/ARM/2009-11-07-SubRegAsmPrinting.ll b/llvm/test/CodeGen/ARM/2009-11-07-SubRegAsmPrinting.ll index fe177c3ea46..dd2845fe6aa 100644 --- a/llvm/test/CodeGen/ARM/2009-11-07-SubRegAsmPrinting.ll +++ b/llvm/test/CodeGen/ARM/2009-11-07-SubRegAsmPrinting.ll @@ -1,5 +1,6 @@  ; RUN: llc -mcpu=cortex-a8 < %s | FileCheck %s -; XFAIL: * +; PR5423 +  target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64"  target triple = "armv7-eabi"  | 

