Remove pinned VRegs. (#108)

This commit is contained in:
Chris Fallin
2023-01-24 17:31:41 -08:00
committed by GitHub
parent e41c6140de
commit e09f6519a6
6 changed files with 222 additions and 576 deletions

View File

@@ -13,8 +13,7 @@
//! Bundle merging.
use super::{
Env, LiveBundleIndex, LiveRangeIndex, LiveRangeKey, SpillSet, SpillSetIndex, SpillSlotIndex,
VRegIndex,
Env, LiveBundleIndex, LiveRangeIndex, SpillSet, SpillSetIndex, SpillSlotIndex, VRegIndex,
};
use crate::{
ion::data_structures::BlockparamOut, Function, Inst, OperandConstraint, OperandKind, PReg,
@@ -245,19 +244,6 @@ impl<'a, F: Function> Env<'a, F> {
continue;
}
// If this is a pinned vreg, go ahead and add it to the
// commitment map, and avoid creating a bundle entirely.
if let Some(preg) = self.func.is_pinned_vreg(self.vreg(vreg)) {
for entry in &self.vregs[vreg.index()].ranges {
let key = LiveRangeKey::from_range(&entry.range);
self.pregs[preg.index()]
.allocations
.btree
.insert(key, LiveRangeIndex::invalid());
}
continue;
}
let bundle = self.create_bundle();
self.bundles[bundle.index()].ranges = self.vregs[vreg.index()].ranges.clone();
trace!("vreg v{} gets bundle{}", vreg.index(), bundle.index());
@@ -325,11 +311,6 @@ impl<'a, F: Function> Env<'a, F> {
if let OperandConstraint::Reuse(reuse_idx) = op.constraint() {
let src_vreg = op.vreg();
let dst_vreg = self.func.inst_operands(inst)[reuse_idx].vreg();
if self.func.is_pinned_vreg(src_vreg).is_some()
|| self.func.is_pinned_vreg(dst_vreg).is_some()
{
continue;
}
trace!(
"trying to merge reused-input def: src {} to dst {}",
@@ -382,26 +363,6 @@ impl<'a, F: Function> Env<'a, F> {
dst
);
let dst_vreg = self.vreg(self.ranges[dst.index()].vreg);
let src_vreg = self.vreg(self.ranges[src.index()].vreg);
if self.func.is_pinned_vreg(src_vreg).is_some()
&& self.func.is_pinned_vreg(dst_vreg).is_some()
{
continue;
}
if let Some(preg) = self.func.is_pinned_vreg(src_vreg) {
let dest_bundle = self.ranges[dst.index()].bundle;
let spillset = self.bundles[dest_bundle.index()].spillset;
self.spillsets[spillset.index()].reg_hint = preg;
continue;
}
if let Some(preg) = self.func.is_pinned_vreg(dst_vreg) {
let src_bundle = self.ranges[src.index()].bundle;
let spillset = self.bundles[src_bundle.index()].spillset;
self.spillsets[spillset.index()].reg_hint = preg;
continue;
}
let src_bundle = self.ranges[src.index()].bundle;
debug_assert!(src_bundle.is_valid());
let dest_bundle = self.ranges[dst.index()].bundle;