mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-28 22:20:37 +00:00
Avoid analyzing instructions in blocks not reachable from the entry block.
They are lots of trouble, and they don't matter. This fixes PR6559. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98103 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0d9d70f013
commit
4ecbca558f
@ -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);
|
||||||
|
13
test/Analysis/ScalarEvolution/unreachable-code.ll
Normal file
13
test/Analysis/ScalarEvolution/unreachable-code.ll
Normal 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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user