diff options
author | George Burgess IV <george.burgess.iv@gmail.com> | 2018-05-30 22:24:08 +0000 |
---|---|---|
committer | George Burgess IV <george.burgess.iv@gmail.com> | 2018-05-30 22:24:08 +0000 |
commit | 485762ccbab2dea3677dda50f16d790e24da0314 (patch) | |
tree | 23e2f03bd370c68e333ebdf66dba15abd7ef37e7 /llvm/lib/Transforms | |
parent | e2a20b1b29158b8a91a2a4c303cd3d1c87eef356 (diff) | |
download | bcm5719-llvm-485762ccbab2dea3677dda50f16d790e24da0314.tar.gz bcm5719-llvm-485762ccbab2dea3677dda50f16d790e24da0314.zip |
[NewGVN] Fix set comparison; reflow comment
Looks like we intended to compare this->Members with Other->Members
here, but ended up comparing this->Members with this->Members. Oops. :)
Since CongruenceClass::Members is a SmallPtrSet anyway, we can probably
skip building std::sets if we're willing to write a bit more code.
This appears to be no functional change (for sufficiently lax values of
"no"): this equality check was only being called inside of an assert.
So, worst case, we'll catch more bugs in the form of assertion failures.
Thanks to d0k for noting this!
llvm-svn: 333601
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Scalar/NewGVN.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/Scalar/NewGVN.cpp b/llvm/lib/Transforms/Scalar/NewGVN.cpp index 94973c986e9..4ae16eda269 100644 --- a/llvm/lib/Transforms/Scalar/NewGVN.cpp +++ b/llvm/lib/Transforms/Scalar/NewGVN.cpp @@ -366,9 +366,8 @@ public: // True if this class has no memory members. bool definesNoMemory() const { return StoreCount == 0 && memory_empty(); } - // Return true if two congruence classes are equivalent to each other. This - // means - // that every field but the ID number and the dead field are equivalent. + // Return true if two congruence classes are equivalent to each other. This + // means that every field but the ID number and the dead field are equivalent. bool isEquivalentTo(const CongruenceClass *Other) const { if (!Other) return false; @@ -383,10 +382,12 @@ public: if (!DefiningExpr || !Other->DefiningExpr || *DefiningExpr != *Other->DefiningExpr) return false; - // We need some ordered set - std::set<Value *> AMembers(Members.begin(), Members.end()); - std::set<Value *> BMembers(Members.begin(), Members.end()); - return AMembers == BMembers; + + if (Members.size() != Other->Members.size()) + return false; + + return all_of(Members, + [&](const Value *V) { return Other->Members.count(V); }); } private: |