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