14
14
#define LLVM_IR_PREDITERATORCACHE_H
15
15
16
16
#include " llvm/ADT/ArrayRef.h"
17
- #include " llvm/ADT/DenseMap .h"
17
+ #include " llvm/ADT/BitVector .h"
18
18
#include " llvm/ADT/SmallVector.h"
19
19
#include " llvm/IR/CFG.h"
20
20
#include " llvm/Support/Allocator.h"
@@ -27,6 +27,8 @@ namespace llvm {
27
27
class PredIteratorCache {
28
28
// / Storage, indexed by block number.
29
29
SmallVector<ArrayRef<BasicBlock *>> Storage;
30
+ // / Whether storage is valid, indexed by block number.
31
+ BitVector StorageValid;
30
32
// / Block number epoch to guard against renumberings.
31
33
unsigned BlockNumberEpoch;
32
34
@@ -38,29 +40,33 @@ class PredIteratorCache {
38
40
ArrayRef<BasicBlock *> get (BasicBlock *BB) {
39
41
#ifndef NDEBUG
40
42
// In debug builds, verify that no renumbering has occured.
41
- if (Storage .empty ())
43
+ if (StorageValid .empty ())
42
44
BlockNumberEpoch = BB->getParent ()->getBlockNumberEpoch ();
43
45
else
44
46
assert (BlockNumberEpoch == BB->getParent ()->getBlockNumberEpoch () &&
45
47
" Blocks renumbered during lifetime of PredIteratorCache" );
46
48
#endif
47
49
48
- if (LLVM_LIKELY (BB->getNumber () < Storage .size ()))
49
- if (auto Res = Storage [BB->getNumber ()]; Res. data () )
50
- return Res ;
50
+ if (LLVM_LIKELY (BB->getNumber () < StorageValid .size ()))
51
+ if (StorageValid [BB->getNumber ()])
52
+ return Storage[BB-> getNumber ()] ;
51
53
52
- if (BB->getNumber () >= Storage.size ())
53
- Storage.resize (BB->getParent ()->getMaxBlockNumber ());
54
+ if (BB->getNumber () >= StorageValid.size ()) {
55
+ StorageValid.resize (BB->getParent ()->getMaxBlockNumber ());
56
+ // Don't initialize memory for performance
57
+ Storage.resize_for_overwrite (BB->getParent ()->getMaxBlockNumber ());
58
+ }
54
59
55
60
SmallVector<BasicBlock *, 32 > PredCache (predecessors (BB));
56
61
BasicBlock **Data = Memory.Allocate <BasicBlock *>(PredCache.size ());
57
62
std::copy (PredCache.begin (), PredCache.end (), Data);
63
+ StorageValid[BB->getNumber ()] = true ;
58
64
return Storage[BB->getNumber ()] = ArrayRef (Data, PredCache.size ());
59
65
}
60
66
61
67
// / clear - Remove all information.
62
68
void clear () {
63
- Storage .clear ();
69
+ StorageValid .clear ();
64
70
Memory.Reset ();
65
71
}
66
72
};
0 commit comments