forked from OSchip/llvm-project
expose edge information and switch j-t to use it.
llvm-svn: 86920
This commit is contained in:
parent
bff25cb044
commit
d5e25436a1
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue