Skip to content

Commit fa0e551

Browse files
ahrzbclaude
andcommitted
test(specializer): SPECIALIZER_FUZZ_SEEDS knob for deep fuzz runs
The three generated-program fuzzes (backend contract, determinism, IR round-trip) had their seed counts hardcoded, so a deep audit meant editing source and remembering to restore it. Mirrors the regexp fuzzer's existing REGEXP_FUZZ_N knob; gate depths are unchanged as the defaults. Verified at depth on master's code, all green, no divergences: backend contract 100,000 seeds (default 500) 37s determinism 50,000 seeds (default 150) 0.9s IR round-trip 50,000 seeds (default 300) 2.5s Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent d8b4d7e commit fa0e551

3 files changed

Lines changed: 15 additions & 3 deletions

File tree

src/specializer/exec/tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -878,7 +878,7 @@ fn gen_input(rng: &mut gen::Rng, p: &Program) -> Batch {
878878
/// meeting iadd, ftoi on inf, ...).
879879
#[test]
880880
fn fuzz_generated_programs_execute_deterministically() {
881-
for seed in 0..150u64 {
881+
for seed in 0..gen::fuzz_seeds(150) {
882882
let p = gen::gen_program(seed);
883883
let mut rng = gen::Rng::new(seed ^ 0x9E37_79B9_7F4A_7C15);
884884
let statics = gen_statics(&mut rng, &p);
@@ -931,7 +931,7 @@ fn casemap_tables_sorted_and_marquee_pins() {
931931
fn fuzz_cranelift_agrees_with_interpreter() {
932932
use super::cranelift;
933933
// More seeds than the determinism fuzz: this is the backend contract.
934-
for seed in 0..500u64 {
934+
for seed in 0..gen::fuzz_seeds(500) {
935935
let p = gen::gen_program(seed);
936936
let mut rng = gen::Rng::new(seed ^ 0x9E37_79B9_7F4A_7C15);
937937
let statics_i = gen_statics(&mut rng, &p);

src/specializer/ir/gen.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,18 @@ use super::{
1313
StaticTy, StrOp1, StrOp2, StrOp2i, StrOp3, Term, TrimSide, Ty, Value,
1414
};
1515

16+
/// Seed count for a fuzz loop: `default` in the gate, overridden by
17+
/// `SPECIALIZER_FUZZ_SEEDS` for exploratory deep runs. Mirrors the regexp
18+
/// fuzzer's `REGEXP_FUZZ_N` knob so a deep audit never needs a source edit.
19+
/// Each seed keys a distinct xorshift stream, so raising this raises coverage
20+
/// rather than repeating programs.
21+
pub fn fuzz_seeds(default: u64) -> u64 {
22+
match std::env::var("SPECIALIZER_FUZZ_SEEDS") {
23+
Ok(s) => s.trim().parse().unwrap_or(default),
24+
Err(_) => default,
25+
}
26+
}
27+
1628
pub struct Rng(u64);
1729

1830
impl Rng {

src/specializer/ir/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -869,7 +869,7 @@ entry:
869869

870870
#[test]
871871
fn fuzz_round_trip() {
872-
for seed in 0..300u64 {
872+
for seed in 0..gen::fuzz_seeds(300) {
873873
let p = gen::gen_program(seed);
874874
if let Err(errs) = verify(&p) {
875875
let msgs: Vec<String> = errs.iter().map(|e| e.to_string()).collect();

0 commit comments

Comments
 (0)