Skip to content

Commit 350c92c

Browse files
committed
Add benchmark for a fixpoint iteration with nested cycles
1 parent adf0556 commit 350c92c

File tree

1 file changed

+41
-1
lines changed

1 file changed

+41
-1
lines changed

benches/dataflow.rs

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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);
171211
criterion_main!(benches);

0 commit comments

Comments
 (0)