summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2010-11-19 22:48:40 +0000
committerOwen Anderson <resistor@mac.com>2010-11-19 22:48:40 +0000
commitea326db47be0fa39e84985de118553ecdae9ad54 (patch)
treee38a221a2e7ae75cad2c4ee6e8c33fed6a11af0f /llvm/lib/Transforms
parent785952e5ac6ebf0c374027edd7bd5a1d64ccfd47 (diff)
downloadbcm5719-llvm-ea326db47be0fa39e84985de118553ecdae9ad54.tar.gz
bcm5719-llvm-ea326db47be0fa39e84985de118553ecdae9ad54.zip
Document the new GVN number table structure.
llvm-svn: 119865
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/GVN.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/GVN.cpp b/llvm/lib/Transforms/Scalar/GVN.cpp
index 2a7985bf957..6d35db4d6f7 100644
--- a/llvm/lib/Transforms/Scalar/GVN.cpp
+++ b/llvm/lib/Transforms/Scalar/GVN.cpp
@@ -677,8 +677,13 @@ namespace {
ValueTable VN;
+ /// NumberTable - A mapping from value numers to lists of Value*'s that
+ /// have that value number. Use lookupNumber to query it.
DenseMap<uint32_t, std::pair<Value*, void*> > NumberTable;
BumpPtrAllocator TableAllocator;
+
+ /// insert_table - Push a new Value to the NumberTable onto the list for
+ /// its value number.
void insert_table(uint32_t N, Value *V) {
std::pair<Value*, void*>& Curr = NumberTable[N];
if (!Curr.first) {
@@ -693,6 +698,8 @@ namespace {
Curr.second = Node;
}
+ /// erase_table - Scan the list of values corresponding to a given value
+ /// number, and remove the given value if encountered.
void erase_table(uint32_t N, Value *V) {
std::pair<Value*, void*>* Prev = 0;
std::pair<Value*, void*>* Curr = &NumberTable[N];
@@ -1886,6 +1893,11 @@ bool GVN::processLoad(LoadInst *L, SmallVectorImpl<Instruction*> &toErase) {
return false;
}
+// lookupNumber - In order to find a leader for a given value number at a
+// specific basic block, we first obtain the list of all Values for that number,
+// and then scan the list to find one whose block dominates the block in
+// question. This is fast because dominator tree queries consist of only
+// a few comparisons of DFS numbers.
Value *GVN::lookupNumber(BasicBlock *BB, uint32_t num) {
std::pair<Value*, void*> Vals = NumberTable[num];
if (!Vals.first) return 0;
OpenPOWER on IntegriCloud