Skip to content

Commit c728e6d

Browse files
committed
Simplify Requirement by removing register classes
We never merge bundles from vregs of different classes, so we don't need to check for register class conflicts.
1 parent 57ccaef commit c728e6d

File tree

2 files changed

+20
-54
lines changed

2 files changed

+20
-54
lines changed

src/ion/process.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,7 @@ impl<'a, F: Function> Env<'a, F> {
748748
bundle: LiveBundleIndex,
749749
reg_hint: PReg,
750750
) -> Result<(), RegAllocError> {
751+
let class = self.spillsets[self.bundles[bundle.index()].spillset.index()].class;
751752
let req = self.compute_requirement(bundle);
752753
// Grab a hint from either the queue or our spillset, if any.
753754
let hint_reg = if reg_hint != PReg::invalid() {
@@ -778,7 +779,7 @@ impl<'a, F: Function> Env<'a, F> {
778779
// spill bundle is already present, then move the LRs over to
779780
// the spill bundle right away.
780781
match req {
781-
Requirement::Unknown | Requirement::Any(_) => {
782+
Requirement::Unknown | Requirement::Any => {
782783
if let Some(spill) =
783784
self.get_or_create_spill_bundle(bundle, /* create_if_absent = */ false)
784785
{
@@ -801,17 +802,17 @@ impl<'a, F: Function> Env<'a, F> {
801802
log::trace!("attempt {}, req {:?}", attempts, req);
802803
debug_assert!(attempts < 100 * self.func.num_insts());
803804

804-
let (class, fixed_preg) = match req {
805-
Requirement::Fixed(preg) => (preg.class(), Some(preg)),
806-
Requirement::Register(class) => (class, None),
807-
Requirement::Stack(_) => {
805+
let fixed_preg = match req {
806+
Requirement::Fixed(preg) => Some(preg),
807+
Requirement::Register => None,
808+
Requirement::Stack => {
808809
// If we must be on the stack, mark our spillset
809810
// as required immediately.
810811
self.spillsets[self.bundles[bundle.index()].spillset.index()].required = true;
811812
return Ok(());
812813
}
813814

814-
Requirement::Any(_) | Requirement::Unknown => {
815+
Requirement::Any | Requirement::Unknown => {
815816
self.spilled_bundles.push(bundle);
816817
return Ok(());
817818
}
@@ -966,7 +967,7 @@ impl<'a, F: Function> Env<'a, F> {
966967
|| lowest_cost_evict_conflict_cost.is_none()
967968
|| lowest_cost_evict_conflict_cost.unwrap() >= our_spill_weight)
968969
{
969-
if let Requirement::Register(class) = req {
970+
if let Requirement::Register = req {
970971
// Check if this is a too-many-live-registers situation.
971972
let range = self.bundles[bundle.index()].ranges[0].range;
972973
log::trace!("checking for too many live regs");

src/ion/requirement.rs

Lines changed: 12 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,28 @@
11
//! Requirements computation.
22
33
use super::{Env, LiveBundleIndex};
4-
use crate::{Function, Operand, OperandConstraint, PReg, RegClass};
4+
use crate::{Function, Operand, OperandConstraint, PReg};
55

66
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
77
pub enum Requirement {
88
Unknown,
99
Fixed(PReg),
10-
Register(RegClass),
11-
Stack(RegClass),
12-
Any(RegClass),
10+
Register,
11+
Stack,
12+
Any,
1313
Conflict,
1414
}
1515
impl Requirement {
16-
#[inline(always)]
17-
pub fn class(self) -> RegClass {
18-
match self {
19-
Requirement::Unknown => panic!("No class for unknown Requirement"),
20-
Requirement::Fixed(preg) => preg.class(),
21-
Requirement::Register(class) | Requirement::Any(class) | Requirement::Stack(class) => {
22-
class
23-
}
24-
Requirement::Conflict => panic!("No class for conflicted Requirement"),
25-
}
26-
}
2716
#[inline(always)]
2817
pub fn merge(self, other: Requirement) -> Requirement {
2918
match (self, other) {
3019
(Requirement::Unknown, other) | (other, Requirement::Unknown) => other,
3120
(Requirement::Conflict, _) | (_, Requirement::Conflict) => Requirement::Conflict,
32-
(other, Requirement::Any(rc)) | (Requirement::Any(rc), other) => {
33-
if other.class() == rc {
34-
other
35-
} else {
36-
Requirement::Conflict
37-
}
38-
}
39-
(Requirement::Stack(rc1), Requirement::Stack(rc2)) => {
40-
if rc1 == rc2 {
41-
self
42-
} else {
43-
Requirement::Conflict
44-
}
45-
}
46-
(Requirement::Register(rc), Requirement::Fixed(preg))
47-
| (Requirement::Fixed(preg), Requirement::Register(rc)) => {
48-
if rc == preg.class() {
49-
Requirement::Fixed(preg)
50-
} else {
51-
Requirement::Conflict
52-
}
53-
}
54-
(Requirement::Register(rc1), Requirement::Register(rc2)) => {
55-
if rc1 == rc2 {
56-
self
57-
} else {
58-
Requirement::Conflict
59-
}
60-
}
21+
(other, Requirement::Any) | (Requirement::Any, other) => other,
22+
(Requirement::Stack, Requirement::Stack) => self,
23+
(Requirement::Register, Requirement::Fixed(preg))
24+
| (Requirement::Fixed(preg), Requirement::Register) => Requirement::Fixed(preg),
25+
(Requirement::Register, Requirement::Register) => self,
6126
(Requirement::Fixed(a), Requirement::Fixed(b)) if a == b => self,
6227
_ => Requirement::Conflict,
6328
}
@@ -67,10 +32,10 @@ impl Requirement {
6732
match op.constraint() {
6833
OperandConstraint::FixedReg(preg) => Requirement::Fixed(preg),
6934
OperandConstraint::Reg | OperandConstraint::Reuse(_) => {
70-
Requirement::Register(op.class())
35+
Requirement::Register
7136
}
72-
OperandConstraint::Stack => Requirement::Stack(op.class()),
73-
_ => Requirement::Any(op.class()),
37+
OperandConstraint::Stack => Requirement::Stack,
38+
_ => Requirement::Any,
7439
}
7540
}
7641
}

0 commit comments

Comments
 (0)