From 5560499b802a90e06d99b7c2a39eb5871da91fe2 Mon Sep 17 00:00:00 2001 From: Chris Fallin Date: Thu, 3 Jun 2021 18:17:28 -0700 Subject: [PATCH] Adaptive commitment-map scanning: re-probe from root if we skip too many entries in linear BTree scan --- src/ion/mod.rs | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/ion/mod.rs b/src/ion/mod.rs index 05280d4..97ea63d 100644 --- a/src/ion/mod.rs +++ b/src/ion/mod.rs @@ -46,12 +46,6 @@ first preferred one), reload into it, spill out of it, and then pop old val - - Play more with commitment-map probing: linear scan through btree - (good for dense bundles, i.e., close ranges) vs. independent - lookup per range in bundle. Adapt based on distance? Do a fresh - range lookup if we skip N btree entries without advancing into - current bundle range? - - Profile allocations */ @@ -2532,6 +2526,7 @@ impl<'a, F: Function> Env<'a, F> { log::debug!(" -> range LR {:?}: {:?}", entry.index, entry.range); let key = LiveRangeKey::from_range(&entry.range); + let mut skips = 0; 'alloc: loop { log::debug!(" -> PReg range {:?}", preg_range_iter.peek()); @@ -2545,8 +2540,23 @@ impl<'a, F: Function> Env<'a, F> { preg_range_iter.peek().unwrap().0 ); preg_range_iter.next(); + skips += 1; + if skips >= 16 { + let from_pos = entry.range.from; + let from_key = LiveRangeKey::from_range(&CodeRange { + from: from_pos, + to: from_pos, + }); + preg_range_iter = self.pregs[reg.index()] + .allocations + .btree + .range(from_key..) + .peekable(); + skips = 0; + } continue 'alloc; } + skips = 0; // If there are no more PReg allocations, we're done! if preg_range_iter.peek().is_none() {