Split heuristic: split before entering deeper loop nest

This commit is contained in:
Chris Fallin
2021-05-24 23:09:05 -07:00
parent 8887077b59
commit 7cdcb2031e

View File

@@ -22,13 +22,6 @@
/*
Performance and code-quality ideas:
- Split heuristics:
- Loop depth at split point? Split before entering more nested loop
- In general, consider 'weight' of split point as if it were
another use.
- Add weight to bundles according to progmoves
- Reduced spilling when spillslot is still "clean":
- When we allocate spillsets, use the whole bundle of a given
spillset to check for fit. Add all bundles to spillset as we
@@ -3086,6 +3079,24 @@ impl<'a, F: Function> Env<'a, F> {
split_at_point = std::cmp::max(first_conflict_point, bundle_start);
requeue_with_reg = first_conflict_reg;
// Adjust `split_at_point` if it is within a deeper loop
// than the bundle start -- hoist it to just before the
// first loop header it encounters.
let bundle_start_depth = self.cfginfo.approx_loop_depth
[self.cfginfo.insn_block[bundle_start.inst().index()].index()];
let split_at_depth = self.cfginfo.approx_loop_depth
[self.cfginfo.insn_block[split_at_point.inst().index()].index()];
if split_at_depth > bundle_start_depth {
for block in (self.cfginfo.insn_block[bundle_start.inst().index()].index() + 1)
..=self.cfginfo.insn_block[split_at_point.inst().index()].index()
{
if self.cfginfo.approx_loop_depth[block] > bundle_start_depth {
split_at_point = self.cfginfo.block_entry[block];
break;
}
}
}
// If the maximum spill weight in the conflicting-bundles set is >= this bundle's spill
// weight, then don't evict.
let max_spill_weight = self.maximum_spill_weight_in_bundle_set(&conflicting_bundles);