@@ -29,11 +29,12 @@ use std::num::NonZero;
29
29
use std:: ops:: Range ;
30
30
use std:: path:: PathBuf ;
31
31
use std:: str:: FromStr ;
32
- use std:: sync:: atomic:: { AtomicI32 , Ordering } ;
33
32
use std:: sync:: Once ;
33
+ use std:: sync:: atomic:: { AtomicI32 , AtomicU32 , Ordering } ;
34
34
35
35
use miri:: {
36
- BacktraceStyle , BorrowTrackerMethod , MiriConfig , MiriEntryFnType , ProvenanceMode , RetagFields , ValidationMode ,
36
+ BacktraceStyle , BorrowTrackerMethod , MiriConfig , MiriEntryFnType , ProvenanceMode , RetagFields ,
37
+ ValidationMode ,
37
38
} ;
38
39
use rustc_abi:: ExternAbi ;
39
40
use rustc_data_structures:: sync;
@@ -182,7 +183,8 @@ impl rustc_driver::Callbacks for MiriCompilerCalls {
182
183
if let Some ( many_seeds) = self . many_seeds . take ( ) {
183
184
assert ! ( config. seed. is_none( ) ) ;
184
185
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| {
186
188
let mut config = config. clone ( ) ;
187
189
config. seed = Some ( seed. into ( ) ) ;
188
190
eprintln ! ( "Trying seed: {seed}" ) ;
@@ -196,8 +198,13 @@ impl rustc_driver::Callbacks for MiriCompilerCalls {
196
198
std:: process:: exit ( return_code) ;
197
199
}
198
200
exit_code. store ( return_code, Ordering :: Relaxed ) ;
201
+ num_failed. fetch_add ( 1 , Ordering :: Relaxed ) ;
199
202
}
200
203
} ) ;
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
+ }
201
208
std:: process:: exit ( exit_code. 0 . into_inner ( ) ) ;
202
209
} else {
203
210
let return_code = miri:: eval_entry ( tcx, entry_def_id, entry_type, config)
@@ -716,10 +723,9 @@ fn main() {
716
723
717
724
// Ensure we have parallelism for many-seeds mode.
718
725
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}" ) ) ;
723
729
}
724
730
let many_seeds =
725
731
many_seeds. map ( |seeds| ManySeedsConfig { seeds, keep_going : many_seeds_keep_going } ) ;
0 commit comments