use the new isFreeCall API and ArgOperand accessors
[oota-llvm.git] / lib / Analysis / LazyValueInfo.cpp
index 3148acaac4e67e85f71213cb637698a614d2c804..ff9026bede97e9404f2018fc424bae2d5a6c136e 100644 (file)
@@ -270,7 +270,7 @@ namespace {
     /// This is all of the cached information about this value.
     ValueCacheEntryTy &Cache;
     
-    ///  NewBlocks - This is a mpping of the new BasicBlocks which have been
+    ///  NewBlocks - This is a mapping of the new BasicBlocks which have been
     /// added to cache but that are not in sorted order.
     DenseMap<BasicBlock*, LVILatticeVal> NewBlockInfo;
   public:
@@ -342,7 +342,7 @@ LVILatticeVal LVIQuery::getBlockValue(BasicBlock *BB) {
   
   // If we've already computed this block's value, return it.
   if (!BBLV.isUndefined()) {
-    DEBUG(errs() << "  reuse BB '" << BB->getName() << "' val=" << BBLV <<'\n');
+    DEBUG(dbgs() << "  reuse BB '" << BB->getName() << "' val=" << BBLV <<'\n');
     return BBLV;
   }
 
@@ -365,7 +365,7 @@ LVILatticeVal LVIQuery::getBlockValue(BasicBlock *BB) {
       // If we hit overdefined, exit early.  The BlockVals entry is already set
       // to overdefined.
       if (Result.isOverdefined()) {
-        DEBUG(errs() << " compute BB '" << BB->getName()
+        DEBUG(dbgs() << " compute BB '" << BB->getName()
                      << "' - overdefined because of pred.\n");
         return Result;
       }
@@ -394,7 +394,7 @@ LVILatticeVal LVIQuery::getBlockValue(BasicBlock *BB) {
     
   }
   
-  DEBUG(errs() << " compute BB '" << BB->getName()
+  DEBUG(dbgs() << " compute BB '" << BB->getName()
                << "' - overdefined because inst def found.\n");
 
   LVILatticeVal Result;
@@ -403,8 +403,10 @@ LVILatticeVal LVIQuery::getBlockValue(BasicBlock *BB) {
 }
 
 
-/// getEdgeValue - This method 
+/// getEdgeValue - This method attempts to infer more complex 
 LVILatticeVal LVIQuery::getEdgeValue(BasicBlock *BBFrom, BasicBlock *BBTo) {
+  // TODO: Handle more complex conditionals.  If (v == 0 || v2 < 1) is false, we
+  // know that v != 0.
   if (BranchInst *BI = dyn_cast<BranchInst>(BBFrom->getTerminator())) {
     // If this is a conditional branch and only one successor goes to BBTo, then
     // we maybe able to infer something from the condition. 
@@ -433,11 +435,27 @@ LVILatticeVal LVIQuery::getEdgeValue(BasicBlock *BBFrom, BasicBlock *BBTo) {
         }
     }
   }
-  
-  // TODO: Info from switch.
-  
-  // TODO: Handle more complex conditionals.  If (v == 0 || v2 < 1) is false, we
-  // know that v != 0.
+
+  // 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) {
+      // We only know something if there is exactly one value that goes from
+      // BBFrom to BBTo.
+      unsigned NumEdges = 0;
+      ConstantInt *EdgeVal = 0;
+      for (unsigned i = 1, e = SI->getNumSuccessors(); i != e; ++i) {
+        if (SI->getSuccessor(i) != BBTo) continue;
+        if (NumEdges++) break;
+        EdgeVal = SI->getCaseValue(i);
+      }
+      assert(EdgeVal && "Missing successor?");
+      if (NumEdges == 1)
+        return LVILatticeVal::get(EdgeVal);
+    }
+  }
   
   // Otherwise see if the value is known in the block.
   return getBlockValue(BBFrom);
@@ -453,12 +471,12 @@ LVILatticeVal LazyValueInfoCache::getValueInBlock(Value *V, BasicBlock *BB) {
   if (Constant *VC = dyn_cast<Constant>(V))
     return LVILatticeVal::get(VC);
   
-  DEBUG(errs() << "LVI Getting block end value " << *V << " at '"
+  DEBUG(dbgs() << "LVI Getting block end value " << *V << " at '"
         << BB->getName() << "'\n");
   
   LVILatticeVal Result = LVIQuery(V, ValueCache[V]).getBlockValue(BB);
   
-  DEBUG(errs() << "  Result = " << Result << "\n");
+  DEBUG(dbgs() << "  Result = " << Result << "\n");
   return Result;
 }
 
@@ -468,12 +486,12 @@ getValueOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB) {
   if (Constant *VC = dyn_cast<Constant>(V))
     return LVILatticeVal::get(VC);
   
-  DEBUG(errs() << "LVI Getting edge value " << *V << " from '"
+  DEBUG(dbgs() << "LVI Getting edge value " << *V << " from '"
         << FromBB->getName() << "' to '" << ToBB->getName() << "'\n");
   LVILatticeVal Result =
     LVIQuery(V, ValueCache[V]).getEdgeValue(FromBB, ToBB);
   
-  DEBUG(errs() << "  Result = " << Result << "\n");
+  DEBUG(dbgs() << "  Result = " << Result << "\n");
   
   return Result;
 }