llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Haojian Wu (hokein) <details> <summary>Changes</summary> Avoid reading the `LocalSLocEntryTable` twice per loop iteration. NFC. https://llvm-compile-time-tracker.com/compare.php?from=0b6ddb02efdcbdac9426e8d857499ea0580303cd&to=1aa335ccfb07ba96177b89b1933aa6b980fa14f6&stat=instructions:u --- Full diff: https://github.com/llvm/llvm-project/pull/146510.diff 1 Files Affected: - (modified) clang/lib/Basic/SourceManager.cpp (+16-25) ``````````diff diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp index a05d6c16caa32..0080d180a3776 100644 --- a/clang/lib/Basic/SourceManager.cpp +++ b/clang/lib/Basic/SourceManager.cpp @@ -812,6 +812,8 @@ FileID SourceManager::getFileIDSlow(SourceLocation::UIntTy SLocOffset) const { /// loaded one. FileID SourceManager::getFileIDLocal(SourceLocation::UIntTy SLocOffset) const { assert(SLocOffset < NextLocalOffset && "Bad function choice"); + assert(SLocOffset >= LocalSLocEntryTable[0].getOffset() && + "Invalid SLocOffset"); // After the first and second level caches, I see two common sorts of // behavior: 1) a lot of searched FileID's are "near" the cached file @@ -855,35 +857,24 @@ FileID SourceManager::getFileIDLocal(SourceLocation::UIntTy SLocOffset) const { break; } - NumProbes = 0; - while (true) { - unsigned MiddleIndex = (GreaterIndex-LessIndex)/2+LessIndex; - SourceLocation::UIntTy MidOffset = - getLocalSLocEntry(MiddleIndex).getOffset(); - - ++NumProbes; - - // If the offset of the midpoint is too large, chop the high side of the - // range to the midpoint. - if (MidOffset > SLocOffset) { - GreaterIndex = MiddleIndex; - continue; - } + while (LessIndex < GreaterIndex) { + ++NumBinaryProbes; - // If the middle index contains the value, succeed and return. - if (MiddleIndex + 1 == LocalSLocEntryTable.size() || - SLocOffset < getLocalSLocEntry(MiddleIndex + 1).getOffset()) { - FileID Res = FileID::get(MiddleIndex); + unsigned MiddleIndex = LessIndex + (GreaterIndex - LessIndex) / 2; - // Remember it. We have good locality across FileID lookups. - LastFileIDLookup = Res; - NumBinaryProbes += NumProbes; - return Res; - } + SourceLocation::UIntTy MidOffset = + LocalSLocEntryTable[MiddleIndex].getOffset(); - // Otherwise, move the low-side up to the middle index. - LessIndex = MiddleIndex; + if (MidOffset <= SLocOffset) + LessIndex = MiddleIndex + 1; + else + GreaterIndex = MiddleIndex; } + + // At this point, LessIndex is the index of the *first element greater than* + // SLocOffset. The element we are actually looking for is the one immediately + // before it. + return LastFileIDLookup = FileID::get(LessIndex - 1); } /// Return the FileID for a SourceLocation with a high offset. `````````` </details> https://github.com/llvm/llvm-project/pull/146510 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits