@@ -167,5 +167,46 @@ fn dataflow(criterion: &mut Criterion) {
167167 } ) ;
168168}
169169
170- criterion_group ! ( benches, dataflow) ;
170+ /// Emulates a data flow problem of the form:
171+ /// ```py
172+ /// self.x0 = self.x1 + self.x2 + self.x3 + self.x4
173+ /// self.x1 = self.x0 + self.x2 + self.x3 + self.x4
174+ /// self.x2 = self.x0 + self.x1 + self.x3 + self.x4
175+ /// self.x3 = self.x0 + self.x1 + self.x2 + self.x4
176+ /// self.x4 = 0
177+ /// ```
178+ fn nested ( criterion : & mut Criterion ) {
179+ criterion. bench_function ( "converge_diverge_nested" , |b| {
180+ b. iter_batched_ref (
181+ || {
182+ let mut db = salsa:: DatabaseImpl :: new ( ) ;
183+
184+ let def_x0 = Definition :: new ( & db, None , 0 ) ;
185+ let def_x1 = Definition :: new ( & db, None , 0 ) ;
186+ let def_x2 = Definition :: new ( & db, None , 0 ) ;
187+ let def_x3 = Definition :: new ( & db, None , 0 ) ;
188+ let def_x4 = Definition :: new ( & db, None , 0 ) ;
189+
190+ let use_x0 = Use :: new ( & db, vec ! [ def_x1, def_x2, def_x3, def_x4] ) ;
191+ let use_x1 = Use :: new ( & db, vec ! [ def_x0, def_x2, def_x3, def_x4] ) ;
192+ let use_x2 = Use :: new ( & db, vec ! [ def_x0, def_x1, def_x3, def_x4] ) ;
193+ let use_x3 = Use :: new ( & db, vec ! [ def_x0, def_x1, def_x3, def_x4] ) ;
194+
195+ def_x0. set_base ( & mut db) . to ( Some ( use_x0) ) ;
196+ def_x1. set_base ( & mut db) . to ( Some ( use_x1) ) ;
197+ def_x2. set_base ( & mut db) . to ( Some ( use_x2) ) ;
198+ def_x3. set_base ( & mut db) . to ( Some ( use_x3) ) ;
199+
200+ ( db, def_x0)
201+ } ,
202+ |( db, def_x0) | {
203+ // All symbols converge on 0.
204+ assert_eq ! ( infer_definition( db, * def_x0) , Type :: Values ( Box :: from( [ 0 ] ) ) ) ;
205+ } ,
206+ BatchSize :: LargeInput ,
207+ ) ;
208+ } ) ;
209+ }
210+
211+ criterion_group ! ( benches, dataflow, nested) ;
171212criterion_main ! ( benches) ;
0 commit comments