[lld-macho] Don't create entries in isecPriorities during sorting (NFC)
authorDaniel Bertalan <dani@danielbertalan.dev>
Wed, 28 Sep 2022 14:23:18 +0000 (16:23 +0200)
committerDaniel Bertalan <dani@danielbertalan.dev>
Wed, 28 Sep 2022 14:50:18 +0000 (16:50 +0200)
If a value for a given key is not present, `DenseMap::operator[]`
default-constructs one, which is wasteful when we don't do anything with
it afterwards. Fix it by calling `lookup()` instead which only returns
the default value, but does not modify the map.

This speeds up linking a fair bit when only a small portion of all
sections are specified in the order file, like in the case of Chromium
Framework:

      N           Min           Max        Median           Avg        Stddev
  x  25      3.727684     3.8808699      3.753552     3.7702461     0.0397282
  +  25     3.6469049     3.7523289     3.6764321     3.6841622   0.025525047
  Difference at 95.0% confidence
   -0.0860839 +/- 0.0189924
   -2.28324% +/- 0.503745%
   (Student's t, pooled s = 0.0333906)

Differential Revision: https://reviews.llvm.org/D134811

lld/MachO/Writer.cpp

index 014e543..b9e6775 100644 (file)
@@ -902,10 +902,10 @@ static void sortSegmentsAndSections() {
 
       if (!isecPriorities.empty()) {
         if (auto *merged = dyn_cast<ConcatOutputSection>(osec)) {
-          llvm::stable_sort(merged->inputs,
-                            [&](InputSection *a, InputSection *b) {
-                              return isecPriorities[a] > isecPriorities[b];
-                            });
+          llvm::stable_sort(
+              merged->inputs, [&](InputSection *a, InputSection *b) {
+                return isecPriorities.lookup(a) > isecPriorities.lookup(b);
+              });
         }
       }
     }