mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
Add an RAII helper to make cleanup of the RecursionSet more fool-proof.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@112628 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
869a144f4e
commit
9ba353627a
@ -79,6 +79,20 @@ namespace {
|
|||||||
SmallSet<AssertingVH<BasicBlock>, 16> LoopHeaders;
|
SmallSet<AssertingVH<BasicBlock>, 16> LoopHeaders;
|
||||||
#endif
|
#endif
|
||||||
DenseSet<std::pair<Value*, BasicBlock*> > RecursionSet;
|
DenseSet<std::pair<Value*, BasicBlock*> > RecursionSet;
|
||||||
|
|
||||||
|
// RAII helper for updating the recursion stack.
|
||||||
|
struct RecursionSetRemover {
|
||||||
|
DenseSet<std::pair<Value*, BasicBlock*> > &TheSet;
|
||||||
|
std::pair<Value*, BasicBlock*> ThePair;
|
||||||
|
|
||||||
|
RecursionSetRemover(DenseSet<std::pair<Value*, BasicBlock*> > &S,
|
||||||
|
std::pair<Value*, BasicBlock*> P)
|
||||||
|
: TheSet(S), ThePair(P) { }
|
||||||
|
|
||||||
|
~RecursionSetRemover() {
|
||||||
|
TheSet.erase(ThePair);
|
||||||
|
}
|
||||||
|
};
|
||||||
public:
|
public:
|
||||||
static char ID; // Pass identification
|
static char ID; // Pass identification
|
||||||
JumpThreading() : FunctionPass(ID) {}
|
JumpThreading() : FunctionPass(ID) {}
|
||||||
@ -271,9 +285,17 @@ void JumpThreading::FindLoopHeaders(Function &F) {
|
|||||||
///
|
///
|
||||||
bool JumpThreading::
|
bool JumpThreading::
|
||||||
ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){
|
ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){
|
||||||
|
// This method walks up use-def chains recursively. Because of this, we could
|
||||||
|
// get into an infinite loop going around loops in the use-def chain. To
|
||||||
|
// prevent this, keep track of what (value, block) pairs we've already visited
|
||||||
|
// and terminate the search if we loop back to them
|
||||||
if (!RecursionSet.insert(std::make_pair(V, BB)).second)
|
if (!RecursionSet.insert(std::make_pair(V, BB)).second)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// An RAII help to remove this pair from the recursion set once the recursion
|
||||||
|
// stack pops back out again.
|
||||||
|
RecursionSetRemover remover(RecursionSet, std::make_pair(V, BB));
|
||||||
|
|
||||||
// If V is a constantint, then it is known in all predecessors.
|
// If V is a constantint, then it is known in all predecessors.
|
||||||
if (isa<ConstantInt>(V) || isa<UndefValue>(V)) {
|
if (isa<ConstantInt>(V) || isa<UndefValue>(V)) {
|
||||||
ConstantInt *CI = dyn_cast<ConstantInt>(V);
|
ConstantInt *CI = dyn_cast<ConstantInt>(V);
|
||||||
@ -281,7 +303,6 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){
|
|||||||
for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI)
|
for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI)
|
||||||
Result.push_back(std::make_pair(CI, *PI));
|
Result.push_back(std::make_pair(CI, *PI));
|
||||||
|
|
||||||
RecursionSet.erase(std::make_pair(V, BB));
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -316,11 +337,9 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){
|
|||||||
Result.push_back(std::make_pair(dyn_cast<ConstantInt>(PredCst), P));
|
Result.push_back(std::make_pair(dyn_cast<ConstantInt>(PredCst), P));
|
||||||
}
|
}
|
||||||
|
|
||||||
RecursionSet.erase(std::make_pair(V, BB));
|
|
||||||
return !Result.empty();
|
return !Result.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
RecursionSet.erase(std::make_pair(V, BB));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -344,7 +363,6 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RecursionSet.erase(std::make_pair(V, BB));
|
|
||||||
return !Result.empty();
|
return !Result.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -359,10 +377,8 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){
|
|||||||
ComputeValueKnownInPredecessors(I->getOperand(0), BB, LHSVals);
|
ComputeValueKnownInPredecessors(I->getOperand(0), BB, LHSVals);
|
||||||
ComputeValueKnownInPredecessors(I->getOperand(1), BB, RHSVals);
|
ComputeValueKnownInPredecessors(I->getOperand(1), BB, RHSVals);
|
||||||
|
|
||||||
if (LHSVals.empty() && RHSVals.empty()) {
|
if (LHSVals.empty() && RHSVals.empty())
|
||||||
RecursionSet.erase(std::make_pair(V, BB));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
ConstantInt *InterestingVal;
|
ConstantInt *InterestingVal;
|
||||||
if (I->getOpcode() == Instruction::Or)
|
if (I->getOpcode() == Instruction::Or)
|
||||||
@ -390,7 +406,6 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RecursionSet.erase(std::make_pair(V, BB));
|
|
||||||
return !Result.empty();
|
return !Result.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -399,10 +414,8 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){
|
|||||||
isa<ConstantInt>(I->getOperand(1)) &&
|
isa<ConstantInt>(I->getOperand(1)) &&
|
||||||
cast<ConstantInt>(I->getOperand(1))->isOne()) {
|
cast<ConstantInt>(I->getOperand(1))->isOne()) {
|
||||||
ComputeValueKnownInPredecessors(I->getOperand(0), BB, Result);
|
ComputeValueKnownInPredecessors(I->getOperand(0), BB, Result);
|
||||||
if (Result.empty()) {
|
if (Result.empty())
|
||||||
RecursionSet.erase(std::make_pair(V, BB));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
// Invert the known values.
|
// Invert the known values.
|
||||||
for (unsigned i = 0, e = Result.size(); i != e; ++i)
|
for (unsigned i = 0, e = Result.size(); i != e; ++i)
|
||||||
@ -410,7 +423,6 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){
|
|||||||
Result[i].first =
|
Result[i].first =
|
||||||
cast<ConstantInt>(ConstantExpr::getNot(Result[i].first));
|
cast<ConstantInt>(ConstantExpr::getNot(Result[i].first));
|
||||||
|
|
||||||
RecursionSet.erase(std::make_pair(V, BB));
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -439,7 +451,6 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RecursionSet.erase(std::make_pair(V, BB));
|
|
||||||
return !Result.empty();
|
return !Result.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -473,7 +484,6 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){
|
|||||||
Result.push_back(std::make_pair(CI, PredBB));
|
Result.push_back(std::make_pair(CI, PredBB));
|
||||||
}
|
}
|
||||||
|
|
||||||
RecursionSet.erase(std::make_pair(V, BB));
|
|
||||||
return !Result.empty();
|
return !Result.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -500,7 +510,6 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){
|
|||||||
Result.push_back(std::make_pair(cast<ConstantInt>(ResC), P));
|
Result.push_back(std::make_pair(cast<ConstantInt>(ResC), P));
|
||||||
}
|
}
|
||||||
|
|
||||||
RecursionSet.erase(std::make_pair(V, BB));
|
|
||||||
return !Result.empty();
|
return !Result.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -525,7 +534,6 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){
|
|||||||
Result.push_back(std::make_pair((ConstantInt*)0,LHSVals[i].second));
|
Result.push_back(std::make_pair((ConstantInt*)0,LHSVals[i].second));
|
||||||
}
|
}
|
||||||
|
|
||||||
RecursionSet.erase(std::make_pair(V, BB));
|
|
||||||
return !Result.empty();
|
return !Result.empty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -540,11 +548,9 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){
|
|||||||
Result.push_back(std::make_pair(CInt, *PI));
|
Result.push_back(std::make_pair(CInt, *PI));
|
||||||
}
|
}
|
||||||
|
|
||||||
RecursionSet.erase(std::make_pair(V, BB));
|
|
||||||
return !Result.empty();
|
return !Result.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
RecursionSet.erase(std::make_pair(V, BB));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user