Minor bug in SCCP found by inspection. (I don't think it's possible to hit this with a normal pass pipeline, but fixing for completeness.)

llvm-svn: 137755
This commit is contained in:
Eli Friedman 2011-08-16 21:12:35 +00:00
parent 192f298228
commit e0095e4339
2 changed files with 20 additions and 0 deletions

View File

@ -582,6 +582,10 @@ void SCCPSolver::getFeasibleSuccessors(TerminatorInst &TI,
}
if (SwitchInst *SI = dyn_cast<SwitchInst>(&TI)) {
if (TI.getNumSuccessors() < 2) {
Succs[0] = true;
return;
}
LatticeVal SCValue = getValueState(SI->getCondition());
ConstantInt *CI = SCValue.getConstantInt();
@ -642,6 +646,9 @@ bool SCCPSolver::isEdgeFeasible(BasicBlock *From, BasicBlock *To) {
return true;
if (SwitchInst *SI = dyn_cast<SwitchInst>(TI)) {
if (SI->getNumSuccessors() < 2)
return true;
LatticeVal SCValue = getValueState(SI->getCondition());
ConstantInt *CI = SCValue.getConstantInt();

View File

@ -0,0 +1,13 @@
; RUN: opt -S -sccp < %s | FileCheck %s
; Make sure we always consider the default edge executable for a switch
; with no cases.
declare void @foo()
define void @test1() {
; CHECK: define void @test1
; CHECK: call void @foo()
switch i32 undef, label %d []
d:
call void @foo()
ret void
}