@@ -29,11 +29,12 @@ use std::num::NonZero;
2929use std:: ops:: Range ;
3030use std:: path:: PathBuf ;
3131use std:: str:: FromStr ;
32- use std:: sync:: atomic:: { AtomicI32 , Ordering } ;
3332use std:: sync:: Once ;
33+ use std:: sync:: atomic:: { AtomicI32 , AtomicU32 , Ordering } ;
3434
3535use miri:: {
36- BacktraceStyle , BorrowTrackerMethod , MiriConfig , MiriEntryFnType , ProvenanceMode , RetagFields , ValidationMode ,
36+ BacktraceStyle , BorrowTrackerMethod , MiriConfig , MiriEntryFnType , ProvenanceMode , RetagFields ,
37+ ValidationMode ,
3738} ;
3839use rustc_abi:: ExternAbi ;
3940use rustc_data_structures:: sync;
@@ -182,7 +183,8 @@ impl rustc_driver::Callbacks for MiriCompilerCalls {
182183 if let Some ( many_seeds) = self . many_seeds . take ( ) {
183184 assert ! ( config. seed. is_none( ) ) ;
184185 let exit_code = sync:: IntoDynSyncSend ( AtomicI32 :: new ( rustc_driver:: EXIT_SUCCESS ) ) ;
185- sync:: par_for_each_in ( many_seeds. seeds , |seed| {
186+ let num_failed = sync:: IntoDynSyncSend ( AtomicU32 :: new ( 0 ) ) ;
187+ sync:: par_for_each_in ( many_seeds. seeds . clone ( ) , |seed| {
186188 let mut config = config. clone ( ) ;
187189 config. seed = Some ( seed. into ( ) ) ;
188190 eprintln ! ( "Trying seed: {seed}" ) ;
@@ -196,8 +198,13 @@ impl rustc_driver::Callbacks for MiriCompilerCalls {
196198 std:: process:: exit ( return_code) ;
197199 }
198200 exit_code. store ( return_code, Ordering :: Relaxed ) ;
201+ num_failed. fetch_add ( 1 , Ordering :: Relaxed ) ;
199202 }
200203 } ) ;
204+ let num_failed = num_failed. 0 . into_inner ( ) ;
205+ if num_failed > 0 {
206+ eprintln ! ( "{num_failed}/{total} SEEDS FAILED" , total = many_seeds. seeds. count( ) ) ;
207+ }
201208 std:: process:: exit ( exit_code. 0 . into_inner ( ) ) ;
202209 } else {
203210 let return_code = miri:: eval_entry ( tcx, entry_def_id, entry_type, config)
@@ -716,10 +723,9 @@ fn main() {
716723
717724 // Ensure we have parallelism for many-seeds mode.
718725 if many_seeds. is_some ( ) && !rustc_args. iter ( ) . any ( |arg| arg. starts_with ( "-Zthreads=" ) ) {
719- rustc_args. push ( format ! (
720- "-Zthreads={}" ,
721- std:: thread:: available_parallelism( ) . map_or( 1 , |n| n. get( ) )
722- ) ) ;
726+ // Clamp to 8 threads; things get a lot less efficient beyond that due to lock contention.
727+ let threads = std:: thread:: available_parallelism ( ) . map_or ( 1 , |n| n. get ( ) ) . min ( 8 ) ;
728+ rustc_args. push ( format ! ( "-Zthreads={threads}" ) ) ;
723729 }
724730 let many_seeds =
725731 many_seeds. map ( |seeds| ManySeedsConfig { seeds, keep_going : many_seeds_keep_going } ) ;
0 commit comments