diff options
Diffstat (limited to 'lib/CodeGen/MachineCSE.cpp')
| -rw-r--r-- | lib/CodeGen/MachineCSE.cpp | 67 | 
1 files changed, 39 insertions, 28 deletions
diff --git a/lib/CodeGen/MachineCSE.cpp b/lib/CodeGen/MachineCSE.cpp index d228286d9db8..7da439caded4 100644 --- a/lib/CodeGen/MachineCSE.cpp +++ b/lib/CodeGen/MachineCSE.cpp @@ -13,7 +13,6 @@  //  //===----------------------------------------------------------------------===// -#define DEBUG_TYPE "machine-cse"  #include "llvm/CodeGen/Passes.h"  #include "llvm/ADT/DenseMap.h"  #include "llvm/ADT/ScopedHashTable.h" @@ -28,6 +27,8 @@  #include "llvm/Target/TargetInstrInfo.h"  using namespace llvm; +#define DEBUG_TYPE "machine-cse" +  STATISTIC(NumCoalesces, "Number of copies coalesced");  STATISTIC(NumCSEs,      "Number of common subexpression eliminated");  STATISTIC(NumPhysCSEs, @@ -49,9 +50,9 @@ namespace {        initializeMachineCSEPass(*PassRegistry::getPassRegistry());      } -    virtual bool runOnMachineFunction(MachineFunction &MF); +    bool runOnMachineFunction(MachineFunction &MF) override; -    virtual void getAnalysisUsage(AnalysisUsage &AU) const { +    void getAnalysisUsage(AnalysisUsage &AU) const override {        AU.setPreservesCFG();        MachineFunctionPass::getAnalysisUsage(AU);        AU.addRequired<AliasAnalysis>(); @@ -60,7 +61,7 @@ namespace {        AU.addPreserved<MachineDominatorTree>();      } -    virtual void releaseMemory() { +    void releaseMemory() override {        ScopeMap.clear();        Exps.clear();      } @@ -131,9 +132,24 @@ bool MachineCSE::PerformTrivialCoalescing(MachineInstr *MI,      unsigned SrcReg = DefMI->getOperand(1).getReg();      if (!TargetRegisterInfo::isVirtualRegister(SrcReg))        continue; -    if (DefMI->getOperand(0).getSubReg() || DefMI->getOperand(1).getSubReg()) +    if (DefMI->getOperand(0).getSubReg()) +      continue; +    // FIXME: We should trivially coalesce subregister copies to expose CSE +    // opportunities on instructions with truncated operands (see +    // cse-add-with-overflow.ll). This can be done here as follows: +    // if (SrcSubReg) +    //  RC = TRI->getMatchingSuperRegClass(MRI->getRegClass(SrcReg), RC, +    //                                     SrcSubReg); +    // MO.substVirtReg(SrcReg, SrcSubReg, *TRI); +    // +    // The 2-addr pass has been updated to handle coalesced subregs. However, +    // some machine-specific code still can't handle it. +    // To handle it properly we also need a way find a constrained subregister +    // class given a super-reg class and subreg index. +    if (DefMI->getOperand(1).getSubReg())        continue; -    if (!MRI->constrainRegClass(SrcReg, MRI->getRegClass(Reg))) +    const TargetRegisterClass *RC = MRI->getRegClass(Reg); +    if (!MRI->constrainRegClass(SrcReg, RC))        continue;      DEBUG(dbgs() << "Coalescing: " << *DefMI);      DEBUG(dbgs() << "***     to: " << *MI); @@ -214,7 +230,7 @@ bool MachineCSE::hasLivePhysRegDefUses(const MachineInstr *MI,    // Next, collect all defs into PhysDefs.  If any is already in PhysRefs    // (which currently contains only uses), set the PhysUseDef flag.    PhysUseDef = false; -  MachineBasicBlock::const_iterator I = MI; I = llvm::next(I); +  MachineBasicBlock::const_iterator I = MI; I = std::next(I);    for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {      const MachineOperand &MO = MI->getOperand(i);      if (!MO.isReg() || !MO.isDef()) @@ -265,7 +281,7 @@ bool MachineCSE::PhysRegDefsReach(MachineInstr *CSMI, MachineInstr *MI,      }      CrossMBB = true;    } -  MachineBasicBlock::const_iterator I = CSMI; I = llvm::next(I); +  MachineBasicBlock::const_iterator I = CSMI; I = std::next(I);    MachineBasicBlock::const_iterator E = MI;    MachineBasicBlock::const_iterator EE = CSMBB->end();    unsigned LookAheadLeft = LookAheadLimit; @@ -310,8 +326,8 @@ bool MachineCSE::PhysRegDefsReach(MachineInstr *CSMI, MachineInstr *MI,  }  bool MachineCSE::isCSECandidate(MachineInstr *MI) { -  if (MI->isLabel() || MI->isPHI() || MI->isImplicitDef() || -      MI->isKill() || MI->isInlineAsm() || MI->isDebugValue()) +  if (MI->isPosition() || MI->isPHI() || MI->isImplicitDef() || MI->isKill() || +      MI->isInlineAsm() || MI->isDebugValue())      return false;    // Ignore copies. @@ -349,15 +365,11 @@ bool MachineCSE::isProfitableToCSE(unsigned CSReg, unsigned Reg,        TargetRegisterInfo::isVirtualRegister(Reg)) {      MayIncreasePressure = false;      SmallPtrSet<MachineInstr*, 8> CSUses; -    for (MachineRegisterInfo::use_nodbg_iterator I =MRI->use_nodbg_begin(CSReg), -         E = MRI->use_nodbg_end(); I != E; ++I) { -      MachineInstr *Use = &*I; -      CSUses.insert(Use); +    for (MachineInstr &MI : MRI->use_nodbg_instructions(CSReg)) { +      CSUses.insert(&MI);      } -    for (MachineRegisterInfo::use_nodbg_iterator I = MRI->use_nodbg_begin(Reg), -         E = MRI->use_nodbg_end(); I != E; ++I) { -      MachineInstr *Use = &*I; -      if (!CSUses.count(Use)) { +    for (MachineInstr &MI : MRI->use_nodbg_instructions(Reg)) { +      if (!CSUses.count(&MI)) {          MayIncreasePressure = true;          break;        } @@ -388,11 +400,9 @@ bool MachineCSE::isProfitableToCSE(unsigned CSReg, unsigned Reg,    }    if (!HasVRegUse) {      bool HasNonCopyUse = false; -    for (MachineRegisterInfo::use_nodbg_iterator I =  MRI->use_nodbg_begin(Reg), -           E = MRI->use_nodbg_end(); I != E; ++I) { -      MachineInstr *Use = &*I; +    for (MachineInstr &MI : MRI->use_nodbg_instructions(Reg)) {        // Ignore copies. -      if (!Use->isCopyLike()) { +      if (!MI.isCopyLike()) {          HasNonCopyUse = true;          break;        } @@ -405,11 +415,9 @@ bool MachineCSE::isProfitableToCSE(unsigned CSReg, unsigned Reg,    // it unless the defined value is already used in the BB of the new use.    bool HasPHI = false;    SmallPtrSet<MachineBasicBlock*, 4> CSBBs; -  for (MachineRegisterInfo::use_nodbg_iterator I =  MRI->use_nodbg_begin(CSReg), -       E = MRI->use_nodbg_end(); I != E; ++I) { -    MachineInstr *Use = &*I; -    HasPHI |= Use->isPHI(); -    CSBBs.insert(Use->getParent()); +  for (MachineInstr &MI : MRI->use_nodbg_instructions(CSReg)) { +    HasPHI |= MI.isPHI(); +    CSBBs.insert(MI.getParent());    }    if (!HasPHI) @@ -513,7 +521,7 @@ bool MachineCSE::ProcessBlock(MachineBasicBlock *MBB) {      bool DoCSE = true;      unsigned NumDefs = MI->getDesc().getNumDefs() +                         MI->getDesc().getNumImplicitDefs(); -     +      for (unsigned i = 0, e = MI->getNumOperands(); NumDefs && i != e; ++i) {        MachineOperand &MO = MI->getOperand(i);        if (!MO.isReg() || !MO.isDef()) @@ -652,6 +660,9 @@ bool MachineCSE::PerformCSE(MachineDomTreeNode *Node) {  }  bool MachineCSE::runOnMachineFunction(MachineFunction &MF) { +  if (skipOptnoneFunction(*MF.getFunction())) +    return false; +    TII = MF.getTarget().getInstrInfo();    TRI = MF.getTarget().getRegisterInfo();    MRI = &MF.getRegInfo();  | 
