Simple speedup in bundle merge: set bundle while everything is in cache (same pass), and only check non-overlap with debug assertions enabled. Alloc time on clang.wasm: 9.1s old backtracking RA vs. 7.2s with this regalloc2 RA.

This commit is contained in:
Chris Fallin
2021-05-22 16:36:44 -07:00
parent a6c89b1c01
commit 107c09181f

View File

@@ -2051,6 +2051,7 @@ impl<'a, F: Function> Env<'a, F> {
while idx_from < ranges_from.len() || idx_to < ranges_to.len() { while idx_from < ranges_from.len() || idx_to < ranges_to.len() {
if idx_from < ranges_from.len() && idx_to < ranges_to.len() { if idx_from < ranges_from.len() && idx_to < ranges_to.len() {
if ranges_from[idx_from].range.from <= ranges_to[idx_to].range.from { if ranges_from[idx_from].range.from <= ranges_to[idx_to].range.from {
self.ranges[ranges_from[idx_from].index.index()].bundle = to;
merged.push(ranges_from[idx_from]); merged.push(ranges_from[idx_from]);
idx_from += 1; idx_from += 1;
} else { } else {
@@ -2058,6 +2059,9 @@ impl<'a, F: Function> Env<'a, F> {
idx_to += 1; idx_to += 1;
} }
} else if idx_from < ranges_from.len() { } else if idx_from < ranges_from.len() {
for entry in &ranges_from[idx_from..] {
self.ranges[entry.index.index()].bundle = to;
}
merged.extend_from_slice(&ranges_from[idx_from..]); merged.extend_from_slice(&ranges_from[idx_from..]);
break; break;
} else { } else {
@@ -2066,35 +2070,38 @@ impl<'a, F: Function> Env<'a, F> {
break; break;
} }
} }
log::debug!("merging: merged = {:?}", merged);
let mut last_range = None;
for entry in &merged {
if last_range.is_some() {
assert!(last_range.unwrap() < entry.range);
}
last_range = Some(entry.range);
if self.ranges[entry.index.index()].bundle == from { #[cfg(debug_assertions)]
if self.annotations_enabled && log::log_enabled!(log::Level::Debug) { {
self.annotate( log::debug!("merging: merged = {:?}", merged);
entry.range.from, let mut last_range = None;
format!( for entry in &merged {
" MERGE range{} v{} from bundle{} to bundle{}", if last_range.is_some() {
entry.index.index(), assert!(last_range.unwrap() < entry.range);
self.ranges[entry.index.index()].vreg.index(),
from.index(),
to.index(),
),
);
} }
} last_range = Some(entry.range);
log::debug!( if self.ranges[entry.index.index()].bundle == from {
" -> merged result for bundle{}: range{}", if self.annotations_enabled && log::log_enabled!(log::Level::Debug) {
to.index(), self.annotate(
entry.index.index(), entry.range.from,
); format!(
self.ranges[entry.index.index()].bundle = to; " MERGE range{} v{} from bundle{} to bundle{}",
entry.index.index(),
self.ranges[entry.index.index()].vreg.index(),
from.index(),
to.index(),
),
);
}
}
log::debug!(
" -> merged result for bundle{}: range{}",
to.index(),
entry.index.index(),
);
}
} }
self.bundles[to.index()].ranges = merged; self.bundles[to.index()].ranges = merged;