diff options
author | Cameron Zwarich <zwarich@apple.com> | 2010-12-20 01:22:37 +0000 |
---|---|---|
committer | Cameron Zwarich <zwarich@apple.com> | 2010-12-20 01:22:37 +0000 |
commit | 636f15ff04c9188ea3bf91477fda1cc29f2c4a61 (patch) | |
tree | a71be67751609a0c311cc043cc9d72e93f39a4e4 /lib/CodeGen/MachineVerifier.cpp | |
parent | 39ffcb7b62a75d186a7f14b38aacb1615593fdbd (diff) |
Don't assume that an instruction ending a register's live range always reads
the register; it may be a dead def instead. Fixes PR8820.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122218 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/MachineVerifier.cpp')
-rw-r--r-- | lib/CodeGen/MachineVerifier.cpp | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/lib/CodeGen/MachineVerifier.cpp b/lib/CodeGen/MachineVerifier.cpp index 4025e296ce..d0f251ed63 100644 --- a/lib/CodeGen/MachineVerifier.cpp +++ b/lib/CodeGen/MachineVerifier.cpp @@ -1072,10 +1072,24 @@ void MachineVerifier::verifyLiveIntervals() { << MBBStartIdx << '\n'; } else if (TargetRegisterInfo::isVirtualRegister(LI.reg) && !MI->readsVirtualRegister(LI.reg)) { - // FIXME: Should we require a kill flag? - report("Instruction killing live segment doesn't read register", MI); - I->print(*OS); - *OS << " in " << LI << '\n'; + // A live range can end with either a redefinition, a kill flag on a + // use, or a dead flag on a def. + // FIXME: Should we check for each of these? + bool hasDeadDef = false; + for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(), + MOE = MI->operands_end(); MOI != MOE; ++MOI) { + if (MOI->isReg() && MOI->isDef() && MOI->isDead()) { + hasDeadDef = true; + break; + } + } + + if (!hasDeadDef) { + report("Instruction killing live segment neither defines nor reads " + "register", MI); + I->print(*OS); + *OS << " in " << LI << '\n'; + } } } |