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:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user