diff options
author | Evan Cheng <evan.cheng@apple.com> | 2007-03-30 20:18:35 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2007-03-30 20:18:35 +0000 |
commit | 2f524575396b740b8bdae076b5711e602e82f834 (patch) | |
tree | 495426b7a45ef01a5b31e0d2614fc9ae915aaa4a /lib/CodeGen | |
parent | f2c28f863b82e33333ee4cec07e6a4f1f11d0a55 (diff) | |
download | external_llvm-2f524575396b740b8bdae076b5711e602e82f834.zip external_llvm-2f524575396b740b8bdae076b5711e602e82f834.tar.gz external_llvm-2f524575396b740b8bdae076b5711e602e82f834.tar.bz2 |
Bug fix for PR1279. When isDead is propagate by copy coalescing, we keep length
of dead def live interval at 1 to avoid multiple def's targeting the same
register. The previous patch missed a case where the source operand is live-in.
In that case, remove the whole interval.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35512 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/LiveIntervalAnalysis.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp index ff7b555..bc4f601 100644 --- a/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -915,6 +915,7 @@ bool LiveIntervals::JoinCopy(MachineInstr *CopyMI, // Check if it is necessary to propagate "isDead" property before intervals // are joined. + MachineBasicBlock *CopyBB = CopyMI->getParent(); MachineOperand *mopd = CopyMI->findRegisterDefOperand(DstReg); bool isDead = mopd->isDead(); bool isShorten = false; @@ -941,9 +942,15 @@ bool LiveIntervals::JoinCopy(MachineInstr *CopyMI, isShorten = true; RemoveStart = getDefIndex(getInstructionIndex(LastUse)); RemoveEnd = SrcEnd; - } else if (RemoveStart > 0) - // A dead def should have a single cycle interval. - ++RemoveStart; + } else { + MachineInstr *SrcMI = getInstructionFromIndex(SrcStart); + if (SrcMI) { + MachineOperand *mops = SrcMI->findRegisterDefOperand(SrcReg); + if (mops) + // A dead def should have a single cycle interval. + ++RemoveStart; + } + } } } @@ -959,7 +966,6 @@ bool LiveIntervals::JoinCopy(MachineInstr *CopyMI, LiveVariables::VarInfo& dvi = lv_->getVarInfo(repDstReg); // Is the value used in the current BB or any immediate successroe BB? - MachineBasicBlock *CopyBB = CopyMI->getParent(); if (dvi.UsedBlocks[CopyBB->getNumber()]) goto TryJoin; for (MachineBasicBlock::succ_iterator SI = CopyBB->succ_begin(), @@ -1018,7 +1024,6 @@ TryJoin: if (SrcMI) { MachineOperand *mops = SrcMI->findRegisterDefOperand(SrcReg); if (mops) - // FIXME: mops == NULL means SrcMI defines a subregister? mops->setIsDead(); } } |