summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2011-03-18 03:06:02 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2011-03-18 03:06:02 +0000
commitc099dde91856135f1af65dc46b0c938acfe734d5 (patch)
tree82763c94983a13a2cae7794ea97935da3af6ebbb
parentfca6fd4aedb32e173565af204866dee62dcfd054 (diff)
downloadbcm5719-llvm-c099dde91856135f1af65dc46b0c938acfe734d5.tar.gz
bcm5719-llvm-c099dde91856135f1af65dc46b0c938acfe734d5.zip
Be more accurate about the slot index reading a register when dealing with defs
and early clobbers. Assert when trying to find an undefined value. llvm-svn: 127856
-rw-r--r--llvm/lib/CodeGen/SplitKit.cpp24
1 files changed, 20 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/SplitKit.cpp b/llvm/lib/CodeGen/SplitKit.cpp
index ff00bd8f38c..c0f4adf0779 100644
--- a/llvm/lib/CodeGen/SplitKit.cpp
+++ b/llvm/lib/CodeGen/SplitKit.cpp
@@ -348,6 +348,7 @@ void SplitEditor::extendRange(unsigned RegIdx, SlotIndex Idx) {
// Using LiveOutCache as a visited set, perform a BFS for all reaching defs.
for (unsigned i = 0; i != LiveIn.size(); ++i) {
MachineBasicBlock *MBB = LiveIn[i]->getBlock();
+ assert(!MBB->pred_empty() && "Value live-in to entry block?");
for (MachineBasicBlock::pred_iterator PI = MBB->pred_begin(),
PE = MBB->pred_end(); PI != PE; ++PI) {
MachineBasicBlock *Pred = *PI;
@@ -757,7 +758,8 @@ void SplitEditor::rewriteAssigned(bool ExtendRanges) {
}
SlotIndex Idx = LIS.getInstructionIndex(MI);
- Idx = MO.isUse() ? Idx.getUseIndex() : Idx.getDefIndex();
+ if (MO.isDef())
+ Idx = MO.isEarlyClobber() ? Idx.getUseIndex() : Idx.getDefIndex();
// Rewrite to the mapped register at Idx.
unsigned RegIdx = RegAssign.lookup(Idx);
@@ -765,9 +767,23 @@ void SplitEditor::rewriteAssigned(bool ExtendRanges) {
DEBUG(dbgs() << " rewr BB#" << MI->getParent()->getNumber() << '\t'
<< Idx << ':' << RegIdx << '\t' << *MI);
- // Extend liveness to Idx.
- if (ExtendRanges)
- extendRange(RegIdx, Idx);
+ // Extend liveness to Idx if the instruction reads reg.
+ if (!ExtendRanges)
+ continue;
+
+ // Skip instructions that don't read Reg.
+ if (MO.isDef()) {
+ if (!MO.getSubReg() && !MO.isEarlyClobber())
+ continue;
+ // We may wan't to extend a live range for a partial redef, or for a use
+ // tied to an early clobber.
+ Idx = Idx.getPrevSlot();
+ if (!Edit->getParent().liveAt(Idx))
+ continue;
+ } else
+ Idx = Idx.getUseIndex();
+
+ extendRange(RegIdx, Idx);
}
}
OpenPOWER on IntegriCloud