mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
[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
This commit is contained in:
parent
4d1c91fc4d
commit
d1b806509e
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user