about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2020-04-21 04:35:17 +0000
committerbors <bors@rust-lang.org>2020-04-21 04:35:17 +0000
commit25f070d1edf3d54d8933e00eeac95ce55ca8eabb (patch)
tree8d7fb315368670bf2c53910b7c4e6f3a4e06eb69 /src
parent073744f554cf170942aa43893f292199ad44e3d4 (diff)
parent19e5a654dcef599bd2cb82eb90a9dfbc8b42d300 (diff)
downloadrust-25f070d1edf3d54d8933e00eeac95ce55ca8eabb.tar.gz
rust-25f070d1edf3d54d8933e00eeac95ce55ca8eabb.zip
Auto merge of #71267 - pnkfelix:issue-71248-dont-need-exports-all-green, r=nagisa
attempt to recover perf by removing `exports_all_green`

attempt to recover perf by removing `exports_all_green` flag.

cc #71248

(My hypothesis is that my use of this flag was an overly conservative generalization of PR #67020.)
Diffstat (limited to 'src')
-rw-r--r--src/librustc_codegen_llvm/back/lto.rs32
1 files changed, 22 insertions, 10 deletions
diff --git a/src/librustc_codegen_llvm/back/lto.rs b/src/librustc_codegen_llvm/back/lto.rs
index e21cdee961d..7292492a0c0 100644
--- a/src/librustc_codegen_llvm/back/lto.rs
+++ b/src/librustc_codegen_llvm/back/lto.rs
@@ -500,15 +500,32 @@ fn thin_lto(
             let module_name = module_name_to_str(module_name);
 
             // If (1.) the module hasn't changed, and (2.) none of the modules
-            // it imports from nor exports to have changed, *and* (3.) the
-            // import and export sets themselves have not changed from the
-            // previous compile when it was last ThinLTO'ed, then we can re-use
-            // the post-ThinLTO version of the module. Otherwise, freshly
-            // perform LTO optimization.
+            // it imports from have changed, *and* (3.) the import and export
+            // sets themselves have not changed from the previous compile when
+            // it was last ThinLTO'ed, then we can re-use the post-ThinLTO
+            // version of the module. Otherwise, freshly perform LTO
+            // optimization.
             //
             // (Note that globally, the export set is just the inverse of the
             // import set.)
             //
+            // For further justification of why the above is necessary and sufficient,
+            // see the LLVM blog post on ThinLTO:
+            //
+            // http://blog.llvm.org/2016/06/thinlto-scalable-and-incremental-lto.html
+            //
+            // which states the following:
+            //
+            // ```quote
+            // any particular ThinLTO backend must be redone iff:
+            //
+            // 1. The corresponding (primary) module’s bitcode changed
+            // 2. The list of imports into or exports from the module changed
+            // 3. The bitcode for any module being imported from has changed
+            // 4. Any global analysis result affecting either the primary module
+            //    or anything it imports has changed.
+            // ```
+            //
             // This strategy means we can always save the computed imports as
             // canon: when we reuse the post-ThinLTO version, condition (3.)
             // ensures that the current import set is the same as the previous
@@ -531,13 +548,8 @@ fn thin_lto(
                 let imports_all_green = curr_imports
                     .iter()
                     .all(|imported_module| green_modules.contains_key(imported_module));
-                let exports_all_green = curr_exports
-                    .iter()
-                    .all(|exported_module| green_modules.contains_key(exported_module));
-
                 if imports_all_green
                     && equivalent_as_sets(prev_imports, curr_imports)
-                    && exports_all_green
                     && equivalent_as_sets(prev_exports, curr_exports)
                 {
                     let work_product = green_modules[module_name].clone();