diff options
-rw-r--r-- | llvm/include/llvm/IR/PredIteratorCache.h | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/llvm/include/llvm/IR/PredIteratorCache.h b/llvm/include/llvm/IR/PredIteratorCache.h index 118310aed1d..81f53531143 100644 --- a/llvm/include/llvm/IR/PredIteratorCache.h +++ b/llvm/include/llvm/IR/PredIteratorCache.h @@ -27,8 +27,8 @@ namespace llvm { /// wants the predecessor list for the same blocks. class PredIteratorCache { /// BlockToPredsMap - Pointer to null-terminated list. - DenseMap<BasicBlock *, BasicBlock **> BlockToPredsMap; - DenseMap<BasicBlock *, unsigned> BlockToPredCountMap; + mutable DenseMap<BasicBlock *, BasicBlock **> BlockToPredsMap; + mutable DenseMap<BasicBlock *, unsigned> BlockToPredCountMap; /// Memory - This is the space that holds cached preds. BumpPtrAllocator Memory; @@ -55,13 +55,15 @@ private: return Entry; } - unsigned GetNumPreds(BasicBlock *BB) { - GetPreds(BB); - return BlockToPredCountMap[BB]; + unsigned GetNumPreds(BasicBlock *BB) const { + auto Result = BlockToPredCountMap.find(BB); + if (Result != BlockToPredCountMap.end()) + return Result->second; + return BlockToPredCountMap[BB] = std::distance(pred_begin(BB), pred_end(BB)); } public: - size_t size(BasicBlock *BB) { return GetNumPreds(BB); } + size_t size(BasicBlock *BB) const { return GetNumPreds(BB); } ArrayRef<BasicBlock *> get(BasicBlock *BB) { return makeArrayRef(GetPreds(BB), GetNumPreds(BB)); } |