Skip to main content

Allocation

Struct Allocation 

Source
pub struct Allocation { /* private fields */ }
Expand description

What the allocator did.

§Examples

use backend_lang::mir::{Effects, Function, Operand};
use backend_lang::regalloc;
use backend_lang::x86_64::{op, GPR, SYSV, RAX};

let mut f = Function::new("f", &SYSV);
let b = f.block()?;
let v = f.vreg(GPR)?;
f.push(b, op::MOV64RI, &[v.into(), Operand::Imm(7)])?;
f.push(b, op::COPY, &[RAX.into(), v.into()])?;
f.push_with(b, op::RET, &[], Effects::new().uses(&[RAX]))?;
let a = regalloc::allocate(&mut f)?;
assert_eq!(a.spilled(), 0);
// The value was given rax, the register it is copied to: no move left.
assert_eq!(backend_lang::emit(&f)?, [0x55, 0x48, 0x89, 0xE5, 0xB8, 7, 0, 0, 0, 0x5D, 0xC3]);

Implementations§

Source§

impl Allocation

Source

pub fn rounds(&self) -> u32

The coloring rounds run (1 when nothing spilled).

§Examples

See Allocation.

Source

pub fn spilled(&self) -> u32

The values spilled to stack slots.

§Examples

See Allocation.

Source

pub fn rematerialized(&self) -> u32

The spilled values rematerialized at their uses instead of stored.

§Examples

See Allocation.

Source

pub fn max_pressure(&self) -> u32

The most values of one class live at once, before any spilling: the register pressure the function itself demands.

§Examples

See Allocation.

Source

pub fn assignment(&self) -> Option<(&Function, &[Location])>

With Options::keep_assignment: the virtual function the final round colored (after spill code was inserted), and each of its virtual registers’ locations, indexed by VReg::index.

§Examples
use backend_lang::mir::{Function, Operand};
use backend_lang::regalloc::{self, Location, Options};
use backend_lang::x86_64::{op, GPR, SYSV};

let mut f = Function::new("f", &SYSV);
let b = f.block()?;
let v = f.vreg(GPR)?;
f.push(b, op::MOV64RI, &[v.into(), Operand::Imm(7)])?;
f.push(b, op::CMP64, &[v.into(), Operand::Imm(1)])?;
f.push(b, op::RET, &[])?;
let a = regalloc::allocate_with(&mut f, &Options::new().keep_assignment(true))?;
let (virt, locs) = a.assignment().unwrap();
assert_eq!(virt.vreg_count(), locs.len());
assert!(matches!(locs[0], Location::Reg(_)));

Trait Implementations§

Source§

impl Clone for Allocation

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Allocation

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.