summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2010-08-24 21:59:42 +0000
committerOwen Anderson <resistor@mac.com>2010-08-24 21:59:42 +0000
commitb695c83de9e07fe030f423ea92656ae126ec8bb1 (patch)
treecdfad5edc52456589e82feae2623c2a04e8d2c32 /llvm/lib
parentb44eb0b900a0c35024c7691f00d1a8cce6b865b4 (diff)
downloadbcm5719-llvm-b695c83de9e07fe030f423ea92656ae126ec8bb1.tar.gz
bcm5719-llvm-b695c83de9e07fe030f423ea92656ae126ec8bb1.zip
Add support for inferring values for the default cases of switches.
llvm-svn: 111971
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Analysis/LazyValueInfo.cpp25
1 files changed, 22 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp
index 3ecaeed9192..88fa15a88f9 100644
--- a/llvm/lib/Analysis/LazyValueInfo.cpp
+++ b/llvm/lib/Analysis/LazyValueInfo.cpp
@@ -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;
OpenPOWER on IntegriCloud