diff options
Diffstat (limited to 'lib/CodeGen/ProcessImplicitDefs.cpp')
| -rw-r--r-- | lib/CodeGen/ProcessImplicitDefs.cpp | 9 | 
1 files changed, 9 insertions, 0 deletions
| diff --git a/lib/CodeGen/ProcessImplicitDefs.cpp b/lib/CodeGen/ProcessImplicitDefs.cpp index 48567a0fc7f6..455964b5c5ad 100644 --- a/lib/CodeGen/ProcessImplicitDefs.cpp +++ b/lib/CodeGen/ProcessImplicitDefs.cpp @@ -77,6 +77,7 @@ bool ProcessImplicitDefs::runOnMachineFunction(MachineFunction &fn) {    SmallVector<MachineInstr*, 8> ImpDefMIs;    MachineBasicBlock *Entry = fn.begin();    SmallPtrSet<MachineBasicBlock*,16> Visited; +  SmallPtrSet<MachineInstr*, 8> ModInsts;    for (df_ext_iterator<MachineBasicBlock*, SmallPtrSet<MachineBasicBlock*,16> >           DFI = df_ext_begin(Entry, Visited), E = df_ext_end(Entry, Visited); @@ -201,6 +202,8 @@ bool ProcessImplicitDefs::runOnMachineFunction(MachineFunction &fn) {          MachineOperand &RMO = UI.getOperand();          MachineInstr *RMI = &*UI;          ++UI; +        if (ModInsts.count(RMI)) +          continue;          MachineBasicBlock *RMBB = RMI->getParent();          if (RMBB == MBB)            continue; @@ -209,9 +212,14 @@ bool ProcessImplicitDefs::runOnMachineFunction(MachineFunction &fn) {          unsigned SrcReg, DstReg, SrcSubReg, DstSubReg;          if (tii_->isMoveInstr(*RMI, SrcReg, DstReg, SrcSubReg, DstSubReg) &&              Reg == SrcReg) { +          if (RMO.isKill()) { +            LiveVariables::VarInfo& vi = lv_->getVarInfo(Reg); +            vi.removeKill(RMI); +          }            RMI->setDesc(tii_->get(TargetInstrInfo::IMPLICIT_DEF));            for (int j = RMI->getNumOperands() - 1, ee = 0; j > ee; --j)              RMI->RemoveOperand(j); +          ModInsts.insert(RMI);            continue;          } @@ -222,6 +230,7 @@ bool ProcessImplicitDefs::runOnMachineFunction(MachineFunction &fn) {          RMO.setIsKill();        }      } +    ModInsts.clear();      ImpDefRegs.clear();      ImpDefMIs.clear();    } | 
