@@ -25,52 +25,29 @@ namespace llvm {
25
25
// / predecessor iterator queries. This is useful for code that repeatedly
26
26
// / wants the predecessor list for the same blocks.
27
27
class PredIteratorCache {
28
- // / BlockToPredsMap - Pointer to null-terminated list.
29
- mutable DenseMap<BasicBlock *, BasicBlock **> BlockToPredsMap;
30
- mutable DenseMap<BasicBlock *, unsigned > BlockToPredCountMap;
28
+ // / Cached list of predecessors, allocated in Memory.
29
+ DenseMap<BasicBlock *, ArrayRef<BasicBlock *>> BlockToPredsMap;
31
30
32
31
// / Memory - This is the space that holds cached preds.
33
32
BumpPtrAllocator Memory;
34
33
35
- private:
36
- // / GetPreds - Get a cached list for the null-terminated predecessor list of
37
- // / the specified block. This can be used in a loop like this:
38
- // / for (BasicBlock **PI = PredCache->GetPreds(BB); *PI; ++PI)
39
- // / use(*PI);
40
- // / instead of:
41
- // / for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI)
42
- BasicBlock **GetPreds (BasicBlock *BB) {
43
- BasicBlock **&Entry = BlockToPredsMap[BB];
44
- if (Entry)
34
+ public:
35
+ size_t size (BasicBlock *BB) { return get (BB).size (); }
36
+ ArrayRef<BasicBlock *> get (BasicBlock *BB) {
37
+ ArrayRef<BasicBlock *> &Entry = BlockToPredsMap[BB];
38
+ if (Entry.data ())
45
39
return Entry;
46
40
47
41
SmallVector<BasicBlock *, 32 > PredCache (predecessors (BB));
48
- PredCache.push_back (nullptr ); // null terminator.
49
-
50
- BlockToPredCountMap[BB] = PredCache.size () - 1 ;
51
-
52
- Entry = Memory.Allocate <BasicBlock *>(PredCache.size ());
53
- std::copy (PredCache.begin (), PredCache.end (), Entry);
42
+ BasicBlock **Data = Memory.Allocate <BasicBlock *>(PredCache.size ());
43
+ std::copy (PredCache.begin (), PredCache.end (), Data);
44
+ Entry = ArrayRef (Data, PredCache.size ());
54
45
return Entry;
55
46
}
56
47
57
- unsigned GetNumPreds (BasicBlock *BB) const {
58
- auto Result = BlockToPredCountMap.find (BB);
59
- if (Result != BlockToPredCountMap.end ())
60
- return Result->second ;
61
- return BlockToPredCountMap[BB] = pred_size (BB);
62
- }
63
-
64
- public:
65
- size_t size (BasicBlock *BB) const { return GetNumPreds (BB); }
66
- ArrayRef<BasicBlock *> get (BasicBlock *BB) {
67
- return ArrayRef (GetPreds (BB), GetNumPreds (BB));
68
- }
69
-
70
48
// / clear - Remove all information.
71
49
void clear () {
72
50
BlockToPredsMap.clear ();
73
- BlockToPredCountMap.clear ();
74
51
Memory.Reset ();
75
52
}
76
53
};
0 commit comments