Use hot-code map to augment spill weights of each use
This commit is contained in:
@@ -561,10 +561,11 @@ impl LiveRangeSet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[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 {
|
match policy {
|
||||||
OperandPolicy::Any => 1000,
|
OperandPolicy::Any => 1000 + bonus,
|
||||||
OperandPolicy::Reg | OperandPolicy::FixedReg(_) => 2000,
|
OperandPolicy::Reg | OperandPolicy::FixedReg(_) => 2000 + bonus,
|
||||||
_ => 0,
|
_ => 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1049,14 +1050,24 @@ impl<'a, F: Function> Env<'a, F> {
|
|||||||
debug_assert!(u.is_valid());
|
debug_assert!(u.is_valid());
|
||||||
let usedata = &self.uses[u.index()];
|
let usedata = &self.uses[u.index()];
|
||||||
let lrdata = &mut self.ranges[from.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!(
|
log::debug!(
|
||||||
" -> subtract {} from uses_spill_weight {}; now {}",
|
" -> subtract {} from uses_spill_weight {}; now {}",
|
||||||
spill_weight_from_policy(usedata.operand.policy()),
|
weight,
|
||||||
lrdata.uses_spill_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 {
|
if usedata.operand.kind() != OperandKind::Use {
|
||||||
lrdata.uses_spill_weight_and_flags -= 2000;
|
lrdata.uses_spill_weight_and_flags -= 2000;
|
||||||
}
|
}
|
||||||
@@ -1099,13 +1110,22 @@ impl<'a, F: Function> Env<'a, F> {
|
|||||||
|
|
||||||
// Update stats.
|
// Update stats.
|
||||||
let policy = self.uses[u.index()].operand.policy();
|
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!(
|
log::debug!(
|
||||||
"insert use {:?} into lr {:?} with weight {}",
|
"insert use {:?} into lr {:?} with weight {}",
|
||||||
u,
|
u,
|
||||||
into,
|
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 {
|
if self.uses[u.index()].operand.kind() != OperandKind::Use {
|
||||||
self.ranges[into.index()].uses_spill_weight_and_flags += 2000;
|
self.ranges[into.index()].uses_spill_weight_and_flags += 2000;
|
||||||
}
|
}
|
||||||
@@ -2991,7 +3011,16 @@ impl<'a, F: Function> Env<'a, F> {
|
|||||||
use_iter,
|
use_iter,
|
||||||
policy
|
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);
|
log::debug!(" -> use {:?} remains in orig", use_iter);
|
||||||
use_iter = self.uses[use_iter.index()].next_use();
|
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> {
|
pub(crate) fn init(&mut self) -> Result<(), RegAllocError> {
|
||||||
self.create_pregs_and_vregs();
|
self.create_pregs_and_vregs();
|
||||||
self.compute_liveness();
|
|
||||||
self.compute_hot_code();
|
self.compute_hot_code();
|
||||||
|
self.compute_liveness();
|
||||||
self.merge_vreg_bundles();
|
self.merge_vreg_bundles();
|
||||||
self.queue_bundles();
|
self.queue_bundles();
|
||||||
if log::log_enabled!(log::Level::Debug) {
|
if log::log_enabled!(log::Level::Debug) {
|
||||||
|
|||||||
Reference in New Issue
Block a user