@@ -500,15 +500,32 @@ fn thin_lto(
500500 let module_name = module_name_to_str ( module_name) ;
501501
502502 // If (1.) the module hasn't changed, and (2.) none of the modules
503- // it imports from nor exports to have changed, *and* (3.) the
504- // import and export sets themselves have not changed from the
505- // previous compile when it was last ThinLTO'ed, then we can re-use
506- // the post-ThinLTO version of the module. Otherwise, freshly
507- // perform LTO optimization.
503+ // it imports from have changed, *and* (3.) the import and export
504+ // sets themselves have not changed from the previous compile when
505+ // it was last ThinLTO'ed, then we can re-use the post-ThinLTO
506+ // version of the module. Otherwise, freshly perform LTO
507+ // optimization.
508508 //
509509 // (Note that globally, the export set is just the inverse of the
510510 // import set.)
511511 //
512+ // For further justification of why the above is necessary and sufficient,
513+ // see the LLVM blog post on ThinLTO:
514+ //
515+ // http://blog.llvm.org/2016/06/thinlto-scalable-and-incremental-lto.html
516+ //
517+ // which states the following:
518+ //
519+ // ```quote
520+ // any particular ThinLTO backend must be redone iff:
521+ //
522+ // 1. The corresponding (primary) module’s bitcode changed
523+ // 2. The list of imports into or exports from the module changed
524+ // 3. The bitcode for any module being imported from has changed
525+ // 4. Any global analysis result affecting either the primary module
526+ // or anything it imports has changed.
527+ // ```
528+ //
512529 // This strategy means we can always save the computed imports as
513530 // canon: when we reuse the post-ThinLTO version, condition (3.)
514531 // ensures that the current import set is the same as the previous
@@ -531,13 +548,8 @@ fn thin_lto(
531548 let imports_all_green = curr_imports
532549 . iter ( )
533550 . all ( |imported_module| green_modules. contains_key ( imported_module) ) ;
534- let exports_all_green = curr_exports
535- . iter ( )
536- . all ( |exported_module| green_modules. contains_key ( exported_module) ) ;
537-
538551 if imports_all_green
539552 && equivalent_as_sets ( prev_imports, curr_imports)
540- && exports_all_green
541553 && equivalent_as_sets ( prev_exports, curr_exports)
542554 {
543555 let work_product = green_modules[ module_name] . clone ( ) ;
0 commit comments