Skip to content

Commit 3960015

Browse files
Merge pull request #885 from saulshanabrook/codex/split-scheduler-stale-match-cleanup
Fix scheduler fresh matches after subsumption
2 parents 7e926c6 + f295052 commit 3960015

2 files changed

Lines changed: 33 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## [Unreleased] - ReleaseDate
44

55
- Add typed `EGraph` extension state that clones with `EGraph` and is restored by `push`/`pop`.
6+
- Fix custom scheduler queries so subsumed rows are not offered as fresh matches.
67
- Report full source file paths in egglog span and error messages.
78
- Fix seminaive matching after nested containers rebuild in place by propagating dirty container ids through parent containers.
89
- Render nullary AST calls without a trailing space, e.g. (foo) instead of (foo ).

src/scheduler.rs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ impl SchedulerRuleInfo {
351351
&egraph.type_info,
352352
false, // seminaive query: Pure/Write contexts
353353
);
354-
qrule_builder.query(&rule.body, true);
354+
qrule_builder.query(&rule.body, false);
355355
let entries = free_vars
356356
.iter()
357357
.map(|fv| qrule_builder.entry(&GenericAtomTerm::Var(span!(), fv.clone())))
@@ -478,6 +478,37 @@ mod test {
478478
assert_eq!(iter, 12);
479479
}
480480

481+
#[test]
482+
fn test_scheduler_does_not_apply_fresh_subsumed_matches() {
483+
let mut egraph = EGraph::default();
484+
let scheduler_id = egraph.add_scheduler(Box::new(FirstNScheduler { n: 10 }));
485+
let input = r#"
486+
(ruleset analysis)
487+
(ruleset test)
488+
(datatype Math
489+
(Add Math Math)
490+
(Mul Math Math)
491+
(Num i64))
492+
(relation Hit (i64))
493+
(let expr (Add (Mul (Num 0) (Num 1)) (Num 2)))
494+
(rewrite (Mul (Num 0) x) (Num 0) :subsume :ruleset analysis)
495+
(rewrite (Add (Num 0) x) x :subsume :ruleset analysis)
496+
(rule ((= e (Add (Mul (Num a) x) (Num b)))) ((Hit a)) :ruleset test :name "hit-subsumed-affine")
497+
(run-schedule (saturate (run analysis)))
498+
"#;
499+
egraph.parse_and_run_program(None, input).unwrap();
500+
501+
let report = egraph
502+
.step_rules_with_scheduler(scheduler_id, "test")
503+
.unwrap();
504+
505+
assert_eq!(egraph.get_size("Hit"), 0);
506+
assert!(
507+
!report.updated,
508+
"subsumed rows should not be collected as fresh scheduler matches"
509+
);
510+
}
511+
481512
#[derive(Clone, Default)]
482513
struct DelayStopScheduler {
483514
can_stop_calls: usize,

0 commit comments

Comments
 (0)