summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-11-12 01:29:10 +0000
committerChris Lattner <sabre@nondot.org>2009-11-12 01:29:10 +0000
commitd5e25436a19eae5f2fc9e48b15ad461b31c67fa0 (patch)
tree217bba6bb809ef69a64a7d9cc23d06bc89887f7e /llvm
parentbff25cb044d9a16e46ac38fefe078d2dd3eb6edb (diff)
downloadbcm5719-llvm-d5e25436a19eae5f2fc9e48b15ad461b31c67fa0.tar.gz
bcm5719-llvm-d5e25436a19eae5f2fc9e48b15ad461b31c67fa0.zip
expose edge information and switch j-t to use it.
llvm-svn: 86920
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/Analysis/LazyValueInfo.h4
-rw-r--r--llvm/lib/Analysis/LazyValueInfo.cpp21
-rw-r--r--llvm/lib/Transforms/Scalar/JumpThreading.cpp4
3 files changed, 27 insertions, 2 deletions
diff --git a/llvm/include/llvm/Analysis/LazyValueInfo.h b/llvm/include/llvm/Analysis/LazyValueInfo.h
index 0553e9e5680..d3466964336 100644
--- a/llvm/include/llvm/Analysis/LazyValueInfo.h
+++ b/llvm/include/llvm/Analysis/LazyValueInfo.h
@@ -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.
diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp
index c17b7274594..6c306bd40b0 100644
--- a/llvm/lib/Analysis/LazyValueInfo.cpp
+++ b/llvm/lib/Analysis/LazyValueInfo.cpp
@@ -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
diff --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
index e93e9cb4d37..a380857235b 100644
--- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp
+++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
@@ -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;
OpenPOWER on IntegriCloud