expose edge information and switch j-t to use it.
authorChris Lattner <sabre@nondot.org>
Thu, 12 Nov 2009 01:29:10 +0000 (01:29 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 12 Nov 2009 01:29:10 +0000 (01:29 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86920 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/LazyValueInfo.h
lib/Analysis/LazyValueInfo.cpp
lib/Transforms/Scalar/JumpThreading.cpp

index 0553e9e56800c934a250530b9496a96fd5b491d0..d346696433643bd6be0cba24832a23e5f019935d 100644 (file)
@@ -47,6 +47,10 @@ public:
   /// getConstant - Determine whether the specified value is known to be a
   /// constant at the end of the specified block.  Return null if not.
   Constant *getConstant(Value *V, BasicBlock *BB);
+
+  /// getConstantOnEdge - Determine whether the specified value is known to be a
+  /// constant on the specified edge.  Return null if not.
+  Constant *getConstantOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB);
   
   
   // Implementation boilerplate.
index c17b72745947af5b64315741e983d4ee1dd35c30..6c306bd40b01a57c840f44a6edd670920728d2ff 100644 (file)
@@ -270,6 +270,27 @@ Constant *LazyValueInfo::getConstant(Value *V, BasicBlock *BB) {
   return 0;
 }
 
+/// getConstantOnEdge - Determine whether the specified value is known to be a
+/// constant on the specified edge.  Return null if not.
+Constant *LazyValueInfo::getConstantOnEdge(Value *V, BasicBlock *FromBB,
+                                           BasicBlock *ToBB) {
+  // If already a constant, return it.
+  if (Constant *VC = dyn_cast<Constant>(V))
+    return VC;
+  
+  DenseMap<BasicBlock*, LVILatticeVal> BlockValues;
+  
+  DEBUG(errs() << "Getting value " << *V << " on edge from '"
+               << FromBB->getName() << "' to '" << ToBB->getName() << "'\n");
+  LVILatticeVal Result = GetValueOnEdge(V, FromBB, ToBB, BlockValues);
+  
+  DEBUG(errs() << "  Result = " << Result << "\n");
+  
+  if (Result.isConstant())
+    return Result.getConstant();
+  return 0;
+}
+
 /// isEqual - Determine whether the specified value is known to be equal or
 /// not-equal to the specified constant at the end of the specified block.
 LazyValueInfo::Tristate
index e93e9cb4d3732e2a69b71bfa871fb00d5c4a4ce1..a380857235b6bee059f5559095d509f5541e429e 100644 (file)
@@ -278,7 +278,7 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){
       for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
         // If the value is known by LazyValueInfo to be a constant in a
         // predecessor, use that information to try to thread this block.
-        Constant *PredCst = LVI->getConstant(V, *PI);
+        Constant *PredCst = LVI->getConstantOnEdge(V, *PI, BB);
         if (PredCst == 0 ||
             (!isa<ConstantInt>(PredCst) && !isa<UndefValue>(PredCst)))
           continue;
@@ -384,7 +384,7 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){
       for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
         // If the value is known by LazyValueInfo to be a constant in a
         // predecessor, use that information to try to thread this block.
-        Constant *PredCst = LVI->getConstant(Cmp->getOperand(0), *PI);
+        Constant *PredCst = LVI->getConstantOnEdge(Cmp->getOperand(0), *PI, BB);
         if (PredCst == 0)
           continue;