summaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2011-02-20 08:11:03 +0000
committerNick Lewycky <nicholas@mxc.ca>2011-02-20 08:11:03 +0000
commiteafe863b6dc35f9ba5360685f300d16d0a5e0c3c (patch)
tree800903723ddb44bba733646978f54a54fc1f3253 /lib/Transforms
parent893a882d0944ac0b7dc22aecf8c649fb4dd7d316 (diff)
downloadllvm-eafe863b6dc35f9ba5360685f300d16d0a5e0c3c.tar.gz
llvm-eafe863b6dc35f9ba5360685f300d16d0a5e0c3c.tar.bz2
llvm-eafe863b6dc35f9ba5360685f300d16d0a5e0c3c.tar.xz
Instead of keeping two Value*->id# mappings, keep one Value->Value mapping and
one Value set. This is faster because we only need to use the set when there isn't already an entry in the map. No functionality change! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126076 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/IPO/MergeFunctions.cpp26
1 files changed, 14 insertions, 12 deletions
diff --git a/lib/Transforms/IPO/MergeFunctions.cpp b/lib/Transforms/IPO/MergeFunctions.cpp
index 4aee6e76b2..cccffca6e3 100644
--- a/lib/Transforms/IPO/MergeFunctions.cpp
+++ b/lib/Transforms/IPO/MergeFunctions.cpp
@@ -156,7 +156,7 @@ class FunctionComparator {
public:
FunctionComparator(const TargetData *TD, const Function *F1,
const Function *F2)
- : F1(F1), F2(F2), TD(TD), IDMap1Count(0), IDMap2Count(0) {}
+ : F1(F1), F2(F2), TD(TD) {}
/// Test whether the two functions have equivalent behaviour.
bool compare();
@@ -191,9 +191,8 @@ private:
const TargetData *TD;
- typedef DenseMap<const Value *, unsigned long> IDMap;
- IDMap Map1, Map2;
- unsigned long IDMap1Count, IDMap2Count;
+ DenseMap<const Value *, const Value *> id_map;
+ DenseSet<const Value *> seen_values;
};
}
@@ -397,15 +396,18 @@ bool FunctionComparator::enumerate(const Value *V1, const Value *V2) {
if (isa<InlineAsm>(V1) || isa<InlineAsm>(V2))
return V1 == V2;
- unsigned long &ID1 = Map1[V1];
- if (!ID1)
- ID1 = ++IDMap1Count;
+ // Check that V1 maps to V2. If we find a value that V1 maps to then we simply
+ // check whether it's equal to V2. When there is no mapping then we need to
+ // ensure that V2 isn't already equivalent to something else. For this
+ // purpose, we track the V2 values in a set.
- unsigned long &ID2 = Map2[V2];
- if (!ID2)
- ID2 = ++IDMap2Count;
-
- return ID1 == ID2;
+ const Value *&map_elem = id_map[V1];
+ if (map_elem)
+ return map_elem == V2;
+ if (!seen_values.insert(V2).second)
+ return false;
+ map_elem = V2;
+ return true;
}
// Test whether two basic blocks have equivalent behaviour.