Fix PR5023: The instruction form of DominatorTree::dominates did not

take into consideration that the result of an invoke is only valid in
the normal dest, not the unwind dest.  This caused 'PHINode::hasConstantValue'
to return true in an invalid situation, causing mem2reg to delete a phi that
was actually needed.  This caused a crash building 483.xalancbmk.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82491 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-09-21 22:39:35 +00:00
parent 75c7c995b7
commit 850c9178dc
2 changed files with 31 additions and 1 deletions

View File

@ -52,10 +52,16 @@ void DominatorTree::print(raw_ostream &OS, const Module *) const {
DT->print(OS);
}
// dominates - Return true if A dominates B. This performs the
// dominates - Return true if A dominates a use in B. This performs the
// special checks necessary if A and B are in the same basic block.
bool DominatorTree::dominates(const Instruction *A, const Instruction *B) const{
const BasicBlock *BBA = A->getParent(), *BBB = B->getParent();
// If A is an invoke instruction, its value is only available in this normal
// successor block.
if (const InvokeInst *II = dyn_cast<InvokeInst>(A))
BBA = II->getNormalDest();
if (BBA != BBB) return dominates(BBA, BBB);
// It is not possible to determine dominance between two PHI nodes

View File

@ -0,0 +1,24 @@
; RUN: opt < %s -mem2reg -S
; PR5023
declare i32 @bar()
define i32 @foo() {
entry:
%whichFlag = alloca i32
%A = invoke i32 @bar()
to label %invcont2 unwind label %lpad86
invcont2:
store i32 %A, i32* %whichFlag
br label %bb15
bb15:
%B = load i32* %whichFlag
ret i32 %B
lpad86:
br label %bb15
}