@@ -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