diff options
| author | bors <bors@rust-lang.org> | 2020-04-21 04:35:17 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-04-21 04:35:17 +0000 |
| commit | 25f070d1edf3d54d8933e00eeac95ce55ca8eabb (patch) | |
| tree | 8d7fb315368670bf2c53910b7c4e6f3a4e06eb69 /src | |
| parent | 073744f554cf170942aa43893f292199ad44e3d4 (diff) | |
| parent | 19e5a654dcef599bd2cb82eb90a9dfbc8b42d300 (diff) | |
| download | rust-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.rs | 32 |
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(); |
