small fix: preserve starts-at-def flag when setting liverange weight

This commit is contained in:
Chris Fallin
2021-05-24 22:45:25 -07:00
parent 3382f9a2e8
commit 8887077b59

View File

@@ -2675,14 +2675,20 @@ impl<'a, F: Function> Env<'a, F> {
} }
fn recompute_range_properties(&mut self, range: LiveRangeIndex) { fn recompute_range_properties(&mut self, range: LiveRangeIndex) {
let mut rangedata = &mut self.ranges[range.index()]; let rangedata = &mut self.ranges[range.index()];
let mut w = 0; let mut w = 0;
for u in &rangedata.uses { for u in &rangedata.uses {
w += u.weight as u32; w += u.weight as u32;
log::debug!("range{}: use {:?}", range.index(), u); log::debug!("range{}: use {:?}", range.index(), u);
} }
rangedata.uses_spill_weight_and_flags = w; rangedata.set_uses_spill_weight(w);
if rangedata.uses.len() > 0 && rangedata.uses[0].operand.kind() == OperandKind::Def { if rangedata.uses.len() > 0 && rangedata.uses[0].operand.kind() == OperandKind::Def {
// Note that we *set* the flag here, but we never *clear*
// it: it may be set by a progmove as well (which does not
// create an explicit use or def), and we want to preserve
// that. We will never split or trim ranges in a way that
// removes a def at the front and requires the flag to be
// cleared.
rangedata.set_flag(LiveRangeFlag::StartsAtDef); rangedata.set_flag(LiveRangeFlag::StartsAtDef);
} }
} }