Compute register affinities during liveness analysis.

Each live range has an affinity hint containing the preferred register
class (or stack slot). Compute the affinity by merging the constraints
of the def and all uses.
This commit is contained in:
Jakob Stoklund Olesen
2017-02-03 15:06:05 -08:00
parent 4ae7fd2a37
commit 8ca61b2a24
2 changed files with 105 additions and 72 deletions

View File

@@ -205,11 +205,10 @@ impl LiveRange {
/// Create a new live range for `value` defined at `def`.
///
/// The live range will be created as dead, but it can be extended with `extend_in_ebb()`.
pub fn new<PP: Into<ProgramPoint>>(value: Value, def: PP) -> LiveRange {
let def = def.into();
pub fn new(value: Value, def: ProgramPoint, affinity: Affinity) -> LiveRange {
LiveRange {
value: value,
affinity: Default::default(),
affinity: affinity,
def_begin: def,
def_end: def,
liveins: Vec::new(),
@@ -423,7 +422,7 @@ mod tests {
let v0 = Value::new(0);
let i1 = Inst::new(1);
let e2 = Ebb::new(2);
let lr = LiveRange::new(v0, i1);
let lr = LiveRange::new(v0, i1.into(), Default::default());
assert!(lr.is_dead());
assert!(lr.is_local());
assert_eq!(lr.def(), i1.into());
@@ -436,7 +435,7 @@ mod tests {
fn dead_arg_range() {
let v0 = Value::new(0);
let e2 = Ebb::new(2);
let lr = LiveRange::new(v0, e2);
let lr = LiveRange::new(v0, e2.into(), Default::default());
assert!(lr.is_dead());
assert!(lr.is_local());
assert_eq!(lr.def(), e2.into());
@@ -453,7 +452,7 @@ mod tests {
let i11 = Inst::new(11);
let i12 = Inst::new(12);
let i13 = Inst::new(13);
let mut lr = LiveRange::new(v0, i11);
let mut lr = LiveRange::new(v0, i11.into(), Default::default());
assert_eq!(lr.extend_in_ebb(e10, i13, PO), false);
PO.validate(&lr);
@@ -476,7 +475,7 @@ mod tests {
let i11 = Inst::new(11);
let i12 = Inst::new(12);
let i13 = Inst::new(13);
let mut lr = LiveRange::new(v0, e10);
let mut lr = LiveRange::new(v0, e10.into(), Default::default());
// Extending a dead EBB argument in its own block should not indicate that a live-in
// interval was created.
@@ -510,7 +509,7 @@ mod tests {
let i21 = Inst::new(21);
let i22 = Inst::new(22);
let i23 = Inst::new(23);
let mut lr = LiveRange::new(v0, i11);
let mut lr = LiveRange::new(v0, i11.into(), Default::default());
assert_eq!(lr.extend_in_ebb(e10, i12, PO), false);