diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2011-02-20 08:11:03 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2011-02-20 08:11:03 +0000 |
commit | eafe863b6dc35f9ba5360685f300d16d0a5e0c3c (patch) | |
tree | 800903723ddb44bba733646978f54a54fc1f3253 | |
parent | 893a882d0944ac0b7dc22aecf8c649fb4dd7d316 (diff) | |
download | external_llvm-eafe863b6dc35f9ba5360685f300d16d0a5e0c3c.zip external_llvm-eafe863b6dc35f9ba5360685f300d16d0a5e0c3c.tar.gz external_llvm-eafe863b6dc35f9ba5360685f300d16d0a5e0c3c.tar.bz2 |
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
-rw-r--r-- | lib/Transforms/IPO/MergeFunctions.cpp | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/lib/Transforms/IPO/MergeFunctions.cpp b/lib/Transforms/IPO/MergeFunctions.cpp index 4aee6e7..cccffca 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. |