Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(92)

Side by Side Diff: src/IceGlobalContext.cpp

Issue 1768173002: Subzero: Count lookups of each constant value in the constant pool. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Code review changes Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/IceGlobalContext.h ('k') | src/IceOperand.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- subzero/src/IceGlobalContext.cpp - Global context defs -------------===// 1 //===- subzero/src/IceGlobalContext.cpp - Global context defs -------------===//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 /// 9 ///
10 /// \file 10 /// \file
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 // TypePool maps constants of type KeyType (e.g. float) to pointers to 136 // TypePool maps constants of type KeyType (e.g. float) to pointers to
137 // type ValueType (e.g. ConstantFloat). 137 // type ValueType (e.g. ConstantFloat).
138 template <Type Ty, typename KeyType, typename ValueType> class TypePool { 138 template <Type Ty, typename KeyType, typename ValueType> class TypePool {
139 TypePool(const TypePool &) = delete; 139 TypePool(const TypePool &) = delete;
140 TypePool &operator=(const TypePool &) = delete; 140 TypePool &operator=(const TypePool &) = delete;
141 141
142 public: 142 public:
143 TypePool() = default; 143 TypePool() = default;
144 ValueType *getOrAdd(GlobalContext *Ctx, KeyType Key) { 144 ValueType *getOrAdd(GlobalContext *Ctx, KeyType Key) {
145 auto Iter = Pool.find(Key); 145 auto Iter = Pool.find(Key);
146 if (Iter != Pool.end()) 146 if (Iter != Pool.end()) {
147 Iter->second->updateLookupCount();
147 return Iter->second; 148 return Iter->second;
149 }
148 auto *Result = ValueType::create(Ctx, Ty, Key); 150 auto *Result = ValueType::create(Ctx, Ty, Key);
149 Pool[Key] = Result; 151 Pool[Key] = Result;
152 Result->updateLookupCount();
150 return Result; 153 return Result;
151 } 154 }
152 ConstantList getConstantPool() const { 155 ConstantList getConstantPool() const {
153 ConstantList Constants; 156 ConstantList Constants;
154 Constants.reserve(Pool.size()); 157 Constants.reserve(Pool.size());
155 for (auto &I : Pool) 158 for (auto &I : Pool)
156 Constants.push_back(I.second); 159 Constants.push_back(I.second);
157 // The sort (and its KeyCompareLess machinery) is not strictly necessary, 160 // The sort (and its KeyCompareLess machinery) is not strictly necessary,
158 // but is desirable for producing output that is deterministic across 161 // but is desirable for producing output that is deterministic across
159 // unordered_map::iterator implementations. 162 // unordered_map::iterator implementations.
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 ProfileBlockInfo->addInitializer( 406 ProfileBlockInfo->addInitializer(
404 VariableDeclaration::RelocInitializer::create( 407 VariableDeclaration::RelocInitializer::create(
405 Global, 408 Global,
406 {RelocOffset::create(this, BlockExecutionCounterOffset)})); 409 {RelocOffset::create(this, BlockExecutionCounterOffset)}));
407 } 410 }
408 } 411 }
409 } 412 }
410 413
411 void GlobalContext::lowerGlobals(const IceString &SectionSuffix) { 414 void GlobalContext::lowerGlobals(const IceString &SectionSuffix) {
412 TimerMarker T(TimerStack::TT_emitGlobalInitializers, this); 415 TimerMarker T(TimerStack::TT_emitGlobalInitializers, this);
413 const bool DumpGlobalVariables = 416 const bool DumpGlobalVariables = BuildDefs::dump() &&
414 BuildDefs::dump() && 417 (Flags.getVerbose() & IceV_GlobalInit) &&
415 (Flags.getVerbose() & IceV_GlobalInit & Cfg::defaultVerboseMask()) && 418 Flags.getVerboseFocusOn().empty();
416 Flags.getVerboseFocusOn().empty();
417 if (DumpGlobalVariables) { 419 if (DumpGlobalVariables) {
418 OstreamLocker L(this); 420 OstreamLocker L(this);
419 Ostream &Stream = getStrDump(); 421 Ostream &Stream = getStrDump();
420 for (const Ice::VariableDeclaration *Global : Globals) { 422 for (const Ice::VariableDeclaration *Global : Globals) {
421 Global->dump(this, Stream); 423 Global->dump(this, Stream);
422 } 424 }
423 } 425 }
424 if (Flags.getDisableTranslation()) 426 if (Flags.getDisableTranslation())
425 return; 427 return;
426 428
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 } 753 }
752 754
753 GlobalContext::~GlobalContext() { 755 GlobalContext::~GlobalContext() {
754 llvm::DeleteContainerPointers(AllThreadContexts); 756 llvm::DeleteContainerPointers(AllThreadContexts);
755 LockedPtr<DestructorArray> Dtors = getDestructors(); 757 LockedPtr<DestructorArray> Dtors = getDestructors();
756 // Destructors are invoked in the opposite object construction order. 758 // Destructors are invoked in the opposite object construction order.
757 for (const auto &Dtor : reverse_range(*Dtors)) 759 for (const auto &Dtor : reverse_range(*Dtors))
758 Dtor(); 760 Dtor();
759 } 761 }
760 762
763 void GlobalContext::dumpConstantLookupCounts() {
764 if (!BuildDefs::dump())
765 return;
766 const bool DumpCounts = (Flags.getVerbose() & IceV_ConstPoolStats) &&
767 Flags.getVerboseFocusOn().empty();
768 if (!DumpCounts)
769 return;
770
771 OstreamLocker _(this);
772 Ostream &Str = getStrDump();
773 Str << "Constant pool use stats: count+value+type\n";
774 #define X(WhichPool) \
775 for (auto *C : getConstPool()->WhichPool.getConstantPool()) { \
776 Str << C->getLookupCount() << " "; \
777 C->dump(Str); \
778 Str << " " << C->getType() << "\n"; \
779 }
780 X(Integers1);
781 X(Integers8);
782 X(Integers16);
783 X(Integers32);
784 X(Integers64);
785 X(Floats);
786 X(Doubles);
787 X(Relocatables);
788 X(ExternRelocatables);
789 #undef X
790 }
791
761 // TODO(stichnot): Consider adding thread-local caches of constant pool entries 792 // TODO(stichnot): Consider adding thread-local caches of constant pool entries
762 // to reduce contention. 793 // to reduce contention.
763 794
764 // All locking is done by the getConstantInt[0-9]+() target function. 795 // All locking is done by the getConstantInt[0-9]+() target function.
765 Constant *GlobalContext::getConstantInt(Type Ty, int64_t Value) { 796 Constant *GlobalContext::getConstantInt(Type Ty, int64_t Value) {
766 switch (Ty) { 797 switch (Ty) {
767 case IceType_i1: 798 case IceType_i1:
768 return getConstantInt1(Value); 799 return getConstantInt1(Value);
769 case IceType_i8: 800 case IceType_i8:
770 return getConstantInt8(Value); 801 return getConstantInt8(Value);
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
1049 Ctx = Func->getContext(); 1080 Ctx = Func->getContext();
1050 Active = 1081 Active =
1051 Func->getFocusedTiming() || Ctx->getFlags().getSubzeroTimingEnabled(); 1082 Func->getFocusedTiming() || Ctx->getFlags().getSubzeroTimingEnabled();
1052 if (Active) 1083 if (Active)
1053 Ctx->pushTimer(ID, StackID); 1084 Ctx->pushTimer(ID, StackID);
1054 } 1085 }
1055 1086
1056 ICE_TLS_DEFINE_FIELD(GlobalContext::ThreadContext *, GlobalContext, TLS); 1087 ICE_TLS_DEFINE_FIELD(GlobalContext::ThreadContext *, GlobalContext, TLS);
1057 1088
1058 } // end of namespace Ice 1089 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/IceGlobalContext.h ('k') | src/IceOperand.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698