mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-12-20 03:17:48 +00:00
Revamp PredIteratorCache interface to be cleaner.
Summary: This lets us use range based for loops. Reviewers: chandlerc Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D9169 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235416 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/Analysis/AliasAnalysis.h"
|
||||
#include "llvm/IR/BasicBlock.h"
|
||||
#include "llvm/IR/PredIteratorCache.h"
|
||||
#include "llvm/IR/ValueHandle.h"
|
||||
#include "llvm/Pass.h"
|
||||
|
||||
@@ -325,7 +326,7 @@ namespace llvm {
|
||||
AliasAnalysis *AA;
|
||||
DominatorTree *DT;
|
||||
AssumptionCache *AC;
|
||||
std::unique_ptr<PredIteratorCache> PredCache;
|
||||
PredIteratorCache PredCache;
|
||||
|
||||
public:
|
||||
MemoryDependenceAnalysis();
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#ifndef LLVM_IR_PREDITERATORCACHE_H
|
||||
#define LLVM_IR_PREDITERATORCACHE_H
|
||||
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/IR/CFG.h"
|
||||
@@ -21,50 +22,58 @@
|
||||
|
||||
namespace llvm {
|
||||
|
||||
/// PredIteratorCache - This class is an extremely trivial cache for
|
||||
/// predecessor iterator queries. This is useful for code that repeatedly
|
||||
/// wants the predecessor list for the same blocks.
|
||||
class PredIteratorCache {
|
||||
/// BlockToPredsMap - Pointer to null-terminated list.
|
||||
DenseMap<BasicBlock*, BasicBlock**> BlockToPredsMap;
|
||||
DenseMap<BasicBlock*, unsigned> BlockToPredCountMap;
|
||||
/// PredIteratorCache - This class is an extremely trivial cache for
|
||||
/// predecessor iterator queries. This is useful for code that repeatedly
|
||||
/// wants the predecessor list for the same blocks.
|
||||
class PredIteratorCache {
|
||||
/// BlockToPredsMap - Pointer to null-terminated list.
|
||||
DenseMap<BasicBlock *, BasicBlock **> BlockToPredsMap;
|
||||
DenseMap<BasicBlock *, unsigned> BlockToPredCountMap;
|
||||
|
||||
/// Memory - This is the space that holds cached preds.
|
||||
BumpPtrAllocator Memory;
|
||||
public:
|
||||
/// Memory - This is the space that holds cached preds.
|
||||
BumpPtrAllocator Memory;
|
||||
|
||||
/// GetPreds - Get a cached list for the null-terminated predecessor list of
|
||||
/// the specified block. This can be used in a loop like this:
|
||||
/// for (BasicBlock **PI = PredCache->GetPreds(BB); *PI; ++PI)
|
||||
/// use(*PI);
|
||||
/// instead of:
|
||||
/// for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI)
|
||||
BasicBlock **GetPreds(BasicBlock *BB) {
|
||||
BasicBlock **&Entry = BlockToPredsMap[BB];
|
||||
if (Entry) return Entry;
|
||||
|
||||
SmallVector<BasicBlock*, 32> PredCache(pred_begin(BB), pred_end(BB));
|
||||
PredCache.push_back(nullptr); // null terminator.
|
||||
|
||||
BlockToPredCountMap[BB] = PredCache.size()-1;
|
||||
|
||||
Entry = Memory.Allocate<BasicBlock*>(PredCache.size());
|
||||
std::copy(PredCache.begin(), PredCache.end(), Entry);
|
||||
private:
|
||||
/// GetPreds - Get a cached list for the null-terminated predecessor list of
|
||||
/// the specified block. This can be used in a loop like this:
|
||||
/// for (BasicBlock **PI = PredCache->GetPreds(BB); *PI; ++PI)
|
||||
/// use(*PI);
|
||||
/// instead of:
|
||||
/// for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI)
|
||||
BasicBlock **GetPreds(BasicBlock *BB) {
|
||||
BasicBlock **&Entry = BlockToPredsMap[BB];
|
||||
if (Entry)
|
||||
return Entry;
|
||||
}
|
||||
|
||||
unsigned GetNumPreds(BasicBlock *BB) {
|
||||
GetPreds(BB);
|
||||
return BlockToPredCountMap[BB];
|
||||
}
|
||||
|
||||
/// clear - Remove all information.
|
||||
void clear() {
|
||||
BlockToPredsMap.clear();
|
||||
BlockToPredCountMap.clear();
|
||||
Memory.Reset();
|
||||
}
|
||||
};
|
||||
SmallVector<BasicBlock *, 32> PredCache(pred_begin(BB), pred_end(BB));
|
||||
PredCache.push_back(nullptr); // null terminator.
|
||||
|
||||
BlockToPredCountMap[BB] = PredCache.size() - 1;
|
||||
|
||||
Entry = Memory.Allocate<BasicBlock *>(PredCache.size());
|
||||
std::copy(PredCache.begin(), PredCache.end(), Entry);
|
||||
return Entry;
|
||||
}
|
||||
|
||||
unsigned GetNumPreds(BasicBlock *BB) {
|
||||
GetPreds(BB);
|
||||
return BlockToPredCountMap[BB];
|
||||
}
|
||||
|
||||
public:
|
||||
size_t size(BasicBlock *BB) { return GetNumPreds(BB); }
|
||||
ArrayRef<BasicBlock *> get(BasicBlock *BB) {
|
||||
return makeArrayRef(GetPreds(BB), GetNumPreds(BB));
|
||||
}
|
||||
|
||||
/// clear - Remove all information.
|
||||
void clear() {
|
||||
BlockToPredsMap.clear();
|
||||
BlockToPredCountMap.clear();
|
||||
Memory.Reset();
|
||||
}
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user