Use hot-code map to augment spill weights of each use

This commit is contained in:
Chris Fallin
2021-05-11 17:59:10 -07:00
parent e1a37cf0e0
commit b069ae099d

View File

@@ -561,10 +561,11 @@ impl LiveRangeSet {
}
#[inline(always)]
fn spill_weight_from_policy(policy: OperandPolicy) -> u32 {
fn spill_weight_from_policy(policy: OperandPolicy, is_hot: bool) -> u32 {
let bonus = if is_hot { 10000 } else { 0 };
match policy {
OperandPolicy::Any => 1000,
OperandPolicy::Reg | OperandPolicy::FixedReg(_) => 2000,
OperandPolicy::Any => 1000 + bonus,
OperandPolicy::Reg | OperandPolicy::FixedReg(_) => 2000 + bonus,
_ => 0,
}
}
@@ -1049,14 +1050,24 @@ impl<'a, F: Function> Env<'a, F> {
debug_assert!(u.is_valid());
let usedata = &self.uses[u.index()];
let lrdata = &mut self.ranges[from.index()];
let pos = usedata.pos;
let is_hot = self
.hot_code
.btree
.contains_key(&LiveRangeKey::from_range(&CodeRange {
from: pos,
to: pos.next(),
}));
let policy = usedata.operand.policy();
let weight = spill_weight_from_policy(policy, is_hot);
log::debug!(
" -> subtract {} from uses_spill_weight {}; now {}",
spill_weight_from_policy(usedata.operand.policy()),
weight,
lrdata.uses_spill_weight(),
lrdata.uses_spill_weight() - spill_weight_from_policy(usedata.operand.policy()),
lrdata.uses_spill_weight() - weight,
);
lrdata.uses_spill_weight_and_flags -= spill_weight_from_policy(usedata.operand.policy());
lrdata.uses_spill_weight_and_flags -= weight;
if usedata.operand.kind() != OperandKind::Use {
lrdata.uses_spill_weight_and_flags -= 2000;
}
@@ -1099,13 +1110,22 @@ impl<'a, F: Function> Env<'a, F> {
// Update stats.
let policy = self.uses[u.index()].operand.policy();
let is_hot = self
.hot_code
.btree
.contains_key(&LiveRangeKey::from_range(&CodeRange {
from: insert_pos,
to: insert_pos.next(),
}));
let weight = spill_weight_from_policy(policy, is_hot);
log::debug!(
"insert use {:?} into lr {:?} with weight {}",
u,
into,
spill_weight_from_policy(policy)
weight,
);
self.ranges[into.index()].uses_spill_weight_and_flags += spill_weight_from_policy(policy);
self.ranges[into.index()].uses_spill_weight_and_flags += weight;
if self.uses[u.index()].operand.kind() != OperandKind::Use {
self.ranges[into.index()].uses_spill_weight_and_flags += 2000;
}
@@ -2991,7 +3011,16 @@ impl<'a, F: Function> Env<'a, F> {
use_iter,
policy
);
uses_spill_weight += spill_weight_from_policy(policy);
let pos = self.uses[use_iter.index()].pos;
let is_hot =
self.hot_code
.btree
.contains_key(&LiveRangeKey::from_range(&CodeRange {
from: pos,
to: pos.next(),
}));
let weight = spill_weight_from_policy(policy, is_hot);
uses_spill_weight += weight;
log::debug!(" -> use {:?} remains in orig", use_iter);
use_iter = self.uses[use_iter.index()].next_use();
}
@@ -4434,8 +4463,8 @@ impl<'a, F: Function> Env<'a, F> {
pub(crate) fn init(&mut self) -> Result<(), RegAllocError> {
self.create_pregs_and_vregs();
self.compute_liveness();
self.compute_hot_code();
self.compute_liveness();
self.merge_vreg_bundles();
self.queue_bundles();
if log::log_enabled!(log::Level::Debug) {