From 45d9961a6a86d184248ef84f6a07125b0c224f97 Mon Sep 17 00:00:00 2001 From: Ellie Hermaszewska Date: Wed, 16 Aug 2023 08:57:47 +0800 Subject: Use ankerl/unordered_dense as a hashmap implementation (#3036) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Correct namespace for getClockFrequency * missing const * Add missing assignment operator * Remove unused variables * Return correct modified variable * Use stable hash code for file system identity * terse static_assert * Structured binding for map iteration * Make (==) and getHashCode const on many structs * Add ConstIterator for LinkedList * Replace uses of ItemProxy::getValue with Dictionary::at * Extract list of loads from gradientsMap before updating it * Const correctness in type layout * Add unordered_dense hashmap submodule * Use wyhash or getHashCode in slang-hash.h * refactor slang-hash.h * Use ankerl/unordered_dense as a hashmap implementation Notable changes: - The subscript operator returns a reference directly to the value, rather than a lazy ItemProxy (pair of dict pointer and key) slang-profile time (95% over 10 runs): - Before: 6.3913906 (±0.0746) - After: 5.9276123 (±0.0964) * 64 bit hash for strings So they have the same hash as char buffers with the same contents * Narrowing warnings for gcc to match msvc * revert back to c++17 * Correct c++ version for msvc * Use path to unordered_dense which keeps tests happy * Do not assign to and read from map in same expression * Remove redundant map operations in primal-hoist * Split out stable hash functions into slang-stable-hash.h * 64 bit hash by default * regenerate vs projects * Correct return type from HashSetBase::getCount() * correct width for call to Dictionary::reserve * Use stable hash for obfuscated module ids * Signed int for reserve * clearer variable naming * Parameterize Dictionary on hash and equality functors * Allow heterogenous lookup for Dictionary * missing const * Use set over operator[] in some places * Remove unused function * s/at/getValue --- source/slang/slang-compiler.cpp | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) (limited to 'source/slang/slang-compiler.cpp') diff --git a/source/slang/slang-compiler.cpp b/source/slang/slang-compiler.cpp index f786512d1..eecb86242 100644 --- a/source/slang/slang-compiler.cpp +++ b/source/slang/slang-compiler.cpp @@ -1063,14 +1063,10 @@ namespace Slang sourceTarget = CodeGenTarget(TypeConvertUtil::getCompileTargetFromSourceLanguage((SlangSourceLanguage)sourceLanguage)); // If it's pass through we accumulate the preprocessor definitions. - for (auto& define : translationUnit->compileRequest->preprocessorDefinitions) - { - preprocessorDefinitions.add(define.key, define.value); - } - for (auto& define : translationUnit->preprocessorDefinitions) - { - preprocessorDefinitions.add(define.key, define.value); - } + for (const auto& define : translationUnit->compileRequest->preprocessorDefinitions) + preprocessorDefinitions.add(define); + for (const auto& define : translationUnit->preprocessorDefinitions) + preprocessorDefinitions.add(define); { /* TODO(JS): Not totally clear what options should be set here. If we are using the pass through - then using say the defines/includes @@ -1148,10 +1144,8 @@ namespace Slang // of downstream compilation. auto linkage = getLinkage(); - for (auto& define : linkage->preprocessorDefinitions) - { - preprocessorDefinitions.add(define.key, define.value); - } + for (const auto& define : linkage->preprocessorDefinitions) + preprocessorDefinitions.add(define); } @@ -1398,12 +1392,12 @@ namespace Slang Index i = 0; - for(auto& def : preprocessorDefinitions) + for(const auto& [defKey, defValue] : preprocessorDefinitions) { auto& define = dst[i]; - define.nameWithSig = allocator.allocate(def.key); - define.value = allocator.allocate(def.value); + define.nameWithSig = allocator.allocate(defKey); + define.value = allocator.allocate(defValue); ++i; } -- cgit v1.2.3