This revision was automatically updated to reflect the committed changes. hokein marked 2 inline comments as done. Closed by commit rGdf61bb271af9: [SourceManager] Improve getFileIDLoaded. (authored by hokein).
Changed prior to commit: https://reviews.llvm.org/D135258?vs=465345&id=465678#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D135258/new/ https://reviews.llvm.org/D135258 Files: clang/lib/Basic/SourceManager.cpp Index: clang/lib/Basic/SourceManager.cpp =================================================================== --- clang/lib/Basic/SourceManager.cpp +++ clang/lib/Basic/SourceManager.cpp @@ -869,36 +869,38 @@ } // Essentially the same as the local case, but the loaded array is sorted - // in the other direction. + // in the other direction (decreasing order). + // GreaterIndex is the one where the offset is greater, which is actually a + // lower index! + unsigned GreaterIndex = 0; + unsigned LessIndex = LoadedSLocEntryTable.size(); + if (LastFileIDLookup.ID < 0) { + // Prune the search space. + int LastID = LastFileIDLookup.ID; + if (getLoadedSLocEntryByID(LastID).getOffset() > SLocOffset) + GreaterIndex = + (-LastID - 2) + 1; // Exclude LastID, else we would have hit the cache + else + LessIndex = -LastID - 2; + } // First do a linear scan from the last lookup position, if possible. - unsigned I; - int LastID = LastFileIDLookup.ID; - if (LastID >= 0 || getLoadedSLocEntryByID(LastID).getOffset() < SLocOffset) - I = 0; - else - I = (-LastID - 2) + 1; - unsigned NumProbes; bool Invalid = false; - for (NumProbes = 0; NumProbes < 8; ++NumProbes, ++I) { + for (NumProbes = 0; NumProbes < 8; ++NumProbes, ++GreaterIndex) { // Make sure the entry is loaded! - const SrcMgr::SLocEntry &E = getLoadedSLocEntry(I, &Invalid); + const SrcMgr::SLocEntry &E = getLoadedSLocEntry(GreaterIndex, &Invalid); if (Invalid) return FileID(); // invalid entry. if (E.getOffset() <= SLocOffset) { - FileID Res = FileID::get(-int(I) - 2); + FileID Res = FileID::get(-int(GreaterIndex) - 2); LastFileIDLookup = Res; NumLinearScans += NumProbes + 1; return Res; } } - // Linear scan failed. Do the binary search. Note the reverse sorting of the - // table: GreaterIndex is the one where the offset is greater, which is - // actually a lower index! - unsigned GreaterIndex = I; - unsigned LessIndex = LoadedSLocEntryTable.size(); + // Linear scan failed. Do the binary search. NumProbes = 0; while (true) { ++NumProbes;
Index: clang/lib/Basic/SourceManager.cpp =================================================================== --- clang/lib/Basic/SourceManager.cpp +++ clang/lib/Basic/SourceManager.cpp @@ -869,36 +869,38 @@ } // Essentially the same as the local case, but the loaded array is sorted - // in the other direction. + // in the other direction (decreasing order). + // GreaterIndex is the one where the offset is greater, which is actually a + // lower index! + unsigned GreaterIndex = 0; + unsigned LessIndex = LoadedSLocEntryTable.size(); + if (LastFileIDLookup.ID < 0) { + // Prune the search space. + int LastID = LastFileIDLookup.ID; + if (getLoadedSLocEntryByID(LastID).getOffset() > SLocOffset) + GreaterIndex = + (-LastID - 2) + 1; // Exclude LastID, else we would have hit the cache + else + LessIndex = -LastID - 2; + } // First do a linear scan from the last lookup position, if possible. - unsigned I; - int LastID = LastFileIDLookup.ID; - if (LastID >= 0 || getLoadedSLocEntryByID(LastID).getOffset() < SLocOffset) - I = 0; - else - I = (-LastID - 2) + 1; - unsigned NumProbes; bool Invalid = false; - for (NumProbes = 0; NumProbes < 8; ++NumProbes, ++I) { + for (NumProbes = 0; NumProbes < 8; ++NumProbes, ++GreaterIndex) { // Make sure the entry is loaded! - const SrcMgr::SLocEntry &E = getLoadedSLocEntry(I, &Invalid); + const SrcMgr::SLocEntry &E = getLoadedSLocEntry(GreaterIndex, &Invalid); if (Invalid) return FileID(); // invalid entry. if (E.getOffset() <= SLocOffset) { - FileID Res = FileID::get(-int(I) - 2); + FileID Res = FileID::get(-int(GreaterIndex) - 2); LastFileIDLookup = Res; NumLinearScans += NumProbes + 1; return Res; } } - // Linear scan failed. Do the binary search. Note the reverse sorting of the - // table: GreaterIndex is the one where the offset is greater, which is - // actually a lower index! - unsigned GreaterIndex = I; - unsigned LessIndex = LoadedSLocEntryTable.size(); + // Linear scan failed. Do the binary search. NumProbes = 0; while (true) { ++NumProbes;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits