diff options
| author | Evan Cheng <evan.cheng@apple.com> | 2009-04-27 20:42:46 +0000 | 
|---|---|---|
| committer | Evan Cheng <evan.cheng@apple.com> | 2009-04-27 20:42:46 +0000 | 
| commit | 093e4c578d88e8f608ca3a1143b8b0e616c35679 (patch) | |
| tree | 80c2ed52031a0bf642e477d25b6d5b29e2ae5ffb /llvm/lib | |
| parent | e99f98262c5c766ec832b756aa303a3cdcc01bd7 (diff) | |
| download | bcm5719-llvm-093e4c578d88e8f608ca3a1143b8b0e616c35679.tar.gz bcm5719-llvm-093e4c578d88e8f608ca3a1143b8b0e616c35679.zip | |
Fix PR4076. Correctly create live interval of physical register with two-address update.
llvm-svn: 70245
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/LiveIntervalAnalysis.cpp | 30 | 
1 files changed, 20 insertions, 10 deletions
| diff --git a/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp b/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp index 7ef6abc4b45..d2927ed4801 100644 --- a/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -612,14 +612,24 @@ void LiveIntervals::handlePhysicalRegisterDef(MachineBasicBlock *MBB,        DOUT << " killed";        end = getUseIndex(baseIndex) + 1;        goto exit; -    } else if (mi->modifiesRegister(interval.reg, tri_)) { -      // Another instruction redefines the register before it is ever read. -      // Then the register is essentially dead at the instruction that defines -      // it. Hence its interval is: -      // [defSlot(def), defSlot(def)+1) -      DOUT << " dead"; -      end = start + 1; -      goto exit; +    } else { +      int DefIdx = mi->findRegisterDefOperandIdx(interval.reg, false, tri_); +      if (DefIdx != -1) { +        if (mi->isRegTiedToUseOperand(DefIdx)) { +          // Two-address instruction. +          end = getDefIndex(baseIndex); +          if (mi->getOperand(DefIdx).isEarlyClobber()) +            end = getUseIndex(baseIndex); +        } else { +          // Another instruction redefines the register before it is ever read. +          // Then the register is essentially dead at the instruction that defines +          // it. Hence its interval is: +          // [defSlot(def), defSlot(def)+1) +          DOUT << " dead"; +          end = start + 1; +        } +        goto exit; +      }      }      baseIndex += InstrSlots::NUM; @@ -663,14 +673,14 @@ void LiveIntervals::handleRegisterDef(MachineBasicBlock *MBB,          MI->getOpcode() == TargetInstrInfo::SUBREG_TO_REG ||          tii_->isMoveInstr(*MI, SrcReg, DstReg, SrcSubReg, DstSubReg))        CopyMI = MI; -    handlePhysicalRegisterDef(MBB, MI, MIIdx, MO,  +    handlePhysicalRegisterDef(MBB, MI, MIIdx, MO,                                getOrCreateInterval(MO.getReg()), CopyMI);      // Def of a register also defines its sub-registers.      for (const unsigned* AS = tri_->getSubRegisters(MO.getReg()); *AS; ++AS)        // If MI also modifies the sub-register explicitly, avoid processing it        // more than once. Do not pass in TRI here so it checks for exact match.        if (!MI->modifiesRegister(*AS)) -        handlePhysicalRegisterDef(MBB, MI, MIIdx, MO,  +        handlePhysicalRegisterDef(MBB, MI, MIIdx, MO,                                    getOrCreateInterval(*AS), 0);    }  } | 

