File tree Expand file tree Collapse file tree 1 file changed +14
-3
lines changed
compiler/rustc_middle/src/mir Expand file tree Collapse file tree 1 file changed +14
-3
lines changed Original file line number Diff line number Diff line change @@ -566,10 +566,21 @@ impl<'tcx> CodegenUnit<'tcx> {
566
566
567
567
let mut items: Vec < _ > = self . items ( ) . iter ( ) . map ( |( & i, & data) | ( i, data) ) . collect ( ) ;
568
568
if !tcx. sess . opts . unstable_opts . codegen_source_order {
569
- // It's already deterministic, so we can just use it.
570
- return items;
569
+ // In this case, we do not need to keep the items in any specific order, as the input
570
+ // is already deterministic.
571
+ // However, it seems that actually moving related things (such as different
572
+ // monomorphizations of the same function) close to one another is actually beneficial
573
+ // for LLVM performance.
574
+ // LLVM will codegen the items in the order we pass them to it, and when it handles
575
+ // similar things in succession, it seems that it leads to better cache utilization,
576
+ // less branch mispredictions and in general to better performance.
577
+ // See https://github.com/rust-lang/rust/pull/145358 for more details.
578
+ //
579
+ // Sorting by symbol name should not incur any new non-determinism.
580
+ items. sort_by_cached_key ( |& ( i, _) | i. symbol_name ( tcx) ) ;
581
+ } else {
582
+ items. sort_by_cached_key ( |& ( i, _) | item_sort_key ( tcx, i) ) ;
571
583
}
572
- items. sort_by_cached_key ( |& ( i, _) | item_sort_key ( tcx, i) ) ;
573
584
items
574
585
}
575
586
You can’t perform that action at this time.
0 commit comments