1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00

Add support for inferring values for the default cases of switches.

llvm-svn: 111971
This commit is contained in:
Owen Anderson 2010-08-24 21:59:42 +00:00
parent 1b102f0b63
commit 5acb4e1218

View File

@ -671,9 +671,28 @@ LVILatticeVal LVIQuery::getEdgeValue(BasicBlock *BBFrom, BasicBlock *BBTo) {
// If the edge was formed by a switch on the value, then we may know exactly
// what it is.
if (SwitchInst *SI = dyn_cast<SwitchInst>(BBFrom->getTerminator())) {
// If BBTo is the default destination of the switch, we don't know anything.
// Given a more powerful range analysis we could know stuff.
if (SI->getCondition() == Val && SI->getDefaultDest() != BBTo) {
// If BBTo is the default destination of the switch, we know that it
// doesn't have the same value as any of the cases.
if (SI->getCondition() == Val) {
if (SI->getDefaultDest() == BBTo) {
const IntegerType *IT = cast<IntegerType>(Val->getType());
ConstantRange CR(IT->getBitWidth());
for (unsigned i = 1, e = SI->getNumSuccessors(); i != e; ++i) {
const APInt CaseVal = SI->getCaseValue(i)->getValue();
ConstantRange CaseRange(CaseVal, CaseVal+1);
CaseRange = CaseRange.inverse();
CR = CR.intersectWith(CaseRange);
}
LVILatticeVal Result;
if (CR.isFullSet() || CR.isEmptySet())
Result.markOverdefined();
else
Result.markConstantRange(CR);
return Result;
}
// We only know something if there is exactly one value that goes from
// BBFrom to BBTo.
unsigned NumEdges = 0;