mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-16 00:33:10 +00:00
Fix liveintervals handling of dbg_value instructions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98686 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bb6c77e6b9
commit
4507f089d4
@ -141,7 +141,7 @@ void LiveIntervals::printInstrs(raw_ostream &OS) const {
|
|||||||
for (MachineBasicBlock::iterator mii = mbbi->begin(),
|
for (MachineBasicBlock::iterator mii = mbbi->begin(),
|
||||||
mie = mbbi->end(); mii != mie; ++mii) {
|
mie = mbbi->end(); mii != mie; ++mii) {
|
||||||
if (mii->isDebugValue())
|
if (mii->isDebugValue())
|
||||||
OS << SlotIndex::getEmptyKey() << '\t' << *mii;
|
OS << " \t" << *mii;
|
||||||
else
|
else
|
||||||
OS << getInstructionIndex(mii) << '\t' << *mii;
|
OS << getInstructionIndex(mii) << '\t' << *mii;
|
||||||
}
|
}
|
||||||
@ -583,6 +583,16 @@ void LiveIntervals::handleLiveInRegister(MachineBasicBlock *MBB,
|
|||||||
// Look for kills, if it reaches a def before it's killed, then it shouldn't
|
// Look for kills, if it reaches a def before it's killed, then it shouldn't
|
||||||
// be considered a livein.
|
// be considered a livein.
|
||||||
MachineBasicBlock::iterator mi = MBB->begin();
|
MachineBasicBlock::iterator mi = MBB->begin();
|
||||||
|
MachineBasicBlock::iterator E = MBB->end();
|
||||||
|
// Skip over DBG_VALUE at the start of the MBB.
|
||||||
|
if (mi != E && mi->isDebugValue()) {
|
||||||
|
while (++mi != E && mi->isDebugValue())
|
||||||
|
;
|
||||||
|
if (mi == E)
|
||||||
|
// MBB is empty except for DBG_VALUE's.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
SlotIndex baseIndex = MIIdx;
|
SlotIndex baseIndex = MIIdx;
|
||||||
SlotIndex start = baseIndex;
|
SlotIndex start = baseIndex;
|
||||||
if (getInstructionFromIndex(baseIndex) == 0)
|
if (getInstructionFromIndex(baseIndex) == 0)
|
||||||
@ -591,12 +601,7 @@ void LiveIntervals::handleLiveInRegister(MachineBasicBlock *MBB,
|
|||||||
SlotIndex end = baseIndex;
|
SlotIndex end = baseIndex;
|
||||||
bool SeenDefUse = false;
|
bool SeenDefUse = false;
|
||||||
|
|
||||||
MachineBasicBlock::iterator E = MBB->end();
|
|
||||||
while (mi != E) {
|
while (mi != E) {
|
||||||
while (mi != E && mi->isDebugValue())
|
|
||||||
++mi;
|
|
||||||
if (mi == E)
|
|
||||||
break;
|
|
||||||
if (mi->killsRegister(interval.reg, tri_)) {
|
if (mi->killsRegister(interval.reg, tri_)) {
|
||||||
DEBUG(dbgs() << " killed");
|
DEBUG(dbgs() << " killed");
|
||||||
end = baseIndex.getDefIndex();
|
end = baseIndex.getDefIndex();
|
||||||
@ -613,10 +618,11 @@ void LiveIntervals::handleLiveInRegister(MachineBasicBlock *MBB,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
++mi;
|
while (++mi != E && mi->isDebugValue())
|
||||||
if (mi != E && !mi->isDebugValue()) {
|
// Skip over DBG_VALUE.
|
||||||
|
;
|
||||||
|
if (mi != E)
|
||||||
baseIndex = indexes_->getNextNonNullIndex(baseIndex);
|
baseIndex = indexes_->getNextNonNullIndex(baseIndex);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Live-in register might not be used at all.
|
// Live-in register might not be used at all.
|
||||||
|
13
test/CodeGen/Generic/dbg_value.ll
Normal file
13
test/CodeGen/Generic/dbg_value.ll
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
; RUN: llc < %s
|
||||||
|
; rdar://7759395
|
||||||
|
|
||||||
|
%0 = type { i32, i32 }
|
||||||
|
|
||||||
|
define void @t(%0*, i32, i32, i32, i32) nounwind {
|
||||||
|
tail call void @llvm.dbg.value(metadata !{%0* %0}, i64 0, metadata !0)
|
||||||
|
unreachable
|
||||||
|
}
|
||||||
|
|
||||||
|
declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone
|
||||||
|
|
||||||
|
!0 = metadata !{i32 0} ;
|
Loading…
x
Reference in New Issue
Block a user