Avoid analyzing instructions in blocks not reachable from the entry block.

They are lots of trouble, and they don't matter. This fixes PR6559.

llvm-svn: 98103
This commit is contained in:
Dan Gohman 2010-03-09 23:46:50 +00:00
parent 3d72a678de
commit 69451a0950
2 changed files with 22 additions and 2 deletions

View File

@ -3101,9 +3101,16 @@ const SCEV *ScalarEvolution::createSCEV(Value *V) {
return getUnknown(V); return getUnknown(V);
unsigned Opcode = Instruction::UserOp1; unsigned Opcode = Instruction::UserOp1;
if (Instruction *I = dyn_cast<Instruction>(V)) if (Instruction *I = dyn_cast<Instruction>(V)) {
Opcode = I->getOpcode(); Opcode = I->getOpcode();
else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V))
// Don't attempt to analyze instructions in blocks that aren't
// reachable. Such instructions don't matter, and they aren't required
// to obey basic rules for definitions dominating uses which this
// analysis depends on.
if (!DT->isReachableFromEntry(I->getParent()))
return getUnknown(V);
} else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V))
Opcode = CE->getOpcode(); Opcode = CE->getOpcode();
else if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) else if (ConstantInt *CI = dyn_cast<ConstantInt>(V))
return getConstant(CI); return getConstant(CI);

View File

@ -0,0 +1,13 @@
; RUN: opt < %s -analyze -scalar-evolution | FileCheck %s
; CHECK: %t = add i64 %t, 1
; CHECK: --> %t
define void @foo() {
entry:
ret void
dead:
%t = add i64 %t, 1
ret void
}