mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-01 03:33:42 +00:00
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:
parent
75c7c995b7
commit
850c9178dc
@ -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
|
||||
|
24
test/Transforms/Mem2Reg/crash.ll
Normal file
24
test/Transforms/Mem2Reg/crash.ll
Normal 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
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user