[lld/mac] Inline a check
authorNico Weber <thakis@chromium.org>
Mon, 17 May 2021 22:17:18 +0000 (18:17 -0400)
committerNico Weber <thakis@chromium.org>
Tue, 18 May 2021 00:04:45 +0000 (20:04 -0400)
`match()` can only return for non-empty vectors, but at least in
non-LTO builds that isn't clear to the compiler. Help it out.
This is a minor but measurable speedup on my machine (but less
than what we might've lost in https://reviews.llvm.org/D100818#2764272 --
bot note higher N on this measurement here, so higher confidence here):

    % ministat at_main at_branch
    x at_main
    + at_branch
        N           Min           Max        Median           Avg        Stddev
    x  30     3.9243979     4.0395119      3.987375     3.9826236   0.027567796
    +  30     3.8495831     4.0009291      3.931325     3.9347135   0.037832878
    Difference at 95.0% confidence
            -0.0479101 +/- 0.0171102
            -1.20298% +/- 0.429622%
            (Student's t, pooled s = 0.0331007)

No behavior change.

Eventually we should apply these lists at symbol parse time instead of
every time shouldExportSymbol() though :)

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

lld/MachO/SyntheticSections.cpp

index 7301452..f1afbc7 100644 (file)
@@ -587,9 +587,11 @@ static bool shouldExportSymbol(const Defined *defined) {
   // Measurements show that symbol ordering (which again looks up
   // every symbol in a hashmap) is the biggest bottleneck when linking
   // chromium_framework, so this will likely be worth optimizing.
-  return config->exportedSymbols.empty()
-             ? !config->unexportedSymbols.match(defined->getName())
-             : config->exportedSymbols.match(defined->getName());
+  if (!config->exportedSymbols.empty())
+    return config->exportedSymbols.match(defined->getName());
+  if (!config->unexportedSymbols.empty())
+    return !config->unexportedSymbols.match(defined->getName());
+  return true;
 }
 
 void ExportSection::finalizeContents() {