diff options
author | Ivan Krasin <krasin@chromium.org> | 2016-01-20 08:41:22 +0000 |
---|---|---|
committer | Ivan Krasin <krasin@chromium.org> | 2016-01-20 08:41:22 +0000 |
commit | 3b1c260d22dd6ebc569cf5ba39bc19f1f50abf68 (patch) | |
tree | 272f8d91fb0817d0c47f9d1ec35c1303e4243c43 /llvm/lib | |
parent | edf98c56822a87d93ee601be9f475328c209fecc (diff) | |
download | bcm5719-llvm-3b1c260d22dd6ebc569cf5ba39bc19f1f50abf68.tar.gz bcm5719-llvm-3b1c260d22dd6ebc569cf5ba39bc19f1f50abf68.zip |
[Verifier] Fix performance regression for LTO builds
Summary:
Fix a significant performance regression by introducing GlobalValueVisited field and reusing the map.
This is a follow up to r257823 that slowed down linking Chrome with LTO by 2.5x.
If you revert this commit, please, also revert r257823.
BUG=https://llvm.org/bugs/show_bug.cgi?id=26214
Reviewers: pcc, loladiro, joker.eph
Subscribers: krasin1, joker.eph, loladiro, pcc
Differential Revision: http://reviews.llvm.org/D16338
llvm-svn: 258297
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/IR/Verifier.cpp | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 8db7fec0a16..40184608752 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -217,6 +217,12 @@ class Verifier : public InstVisitor<Verifier>, VerifierSupport { /// Cache of constants visited in search of ConstantExprs. SmallPtrSet<const Constant *, 32> ConstantExprVisited; + // Verify that this GlobalValue is only used in this module. + // This map is used to avoid visiting uses twice. We can arrive at a user + // twice, if they have multiple operands. In particular for very large + // constant expressions, we can arrive at a particular user many times. + SmallPtrSet<const Value *, 32> GlobalValueVisited; + void checkAtomicMemAccessSize(const Module *M, Type *Ty, const Instruction *I); public: @@ -494,12 +500,7 @@ void Verifier::visitGlobalValue(const GlobalValue &GV) { if (GV.isDeclarationForLinker()) Assert(!GV.hasComdat(), "Declaration may not be in a Comdat!", &GV); - // Verify that this GlobalValue is only used in this module. - // This map is used to avoid visiting uses twice. We can arrive at a user - // twice, if they have multiple operands. In particular for very large - // constant expressions, we can arrive at a particular user many times. - SmallPtrSet<const Value *, 32> Visited; - forEachUser(&GV, Visited, [&](const Value *V) -> bool { + forEachUser(&GV, GlobalValueVisited, [&](const Value *V) -> bool { if (const Instruction *I = dyn_cast<Instruction>(V)) { if (!I->getParent() || !I->getParent()->getParent()) CheckFailed("Global is referenced by parentless instruction!", &GV, |