Skip to main content

RuleKind

Enum RuleKind 

Source
pub enum RuleKind {
    Simplify,
    Lower,
    Discharge,
}
Expand description

What a rule rewrites into.

The three kinds are matched by the same trie and verified by the same obligation, and the only thing that separates them is what the replacement is written in. Keeping them one language rather than three is the whole reason spec/09-optimizer.md section 9.3 and spec/10-backend.md section 10.2 ask for a rule DSL at all, because a rewrite and a lowering are the same claim about two terms and there is no reason to say it twice.

Variants§

§

Simplify

IR to IR. The replacement is IR, so a rewrite can be applied over and over and the result is still something later rules match. spec/optimizer/13-rewrite-rules.md.

§

Lower

IR to machine. The replacement is a machine term, so a lowering is the last thing that happens to a value and nothing matches what it produces. spec/10-backend.md.

§

Discharge

A question about a safety check, answered yes. The pattern is not an instruction: it is a term a pass builds out of what it has worked out about two checks, and the replacement is the constant one, so the rule says that under its guard the answer to the question is yes and the check the question was about does not have to happen.

It is a kind of its own rather than a simplify because a table of these is not matched against the IR and would be wrong to put in the simplifier, and because spec/safe-memory/07-check-elimination.md section 7.7 asks for exactly this split: the walk that establishes the context is ordinary code nobody proves, and the condition under which a check may go is data somebody proves.

Implementations§

Source§

impl RuleKind

Source

pub const fn as_str(self) -> &'static str

The keyword that introduces a rule of this kind.

Trait Implementations§

Source§

impl Clone for RuleKind

Source§

fn clone(&self) -> RuleKind

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 Copy for RuleKind

Source§

impl Debug for RuleKind

Source§

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

Formats the value using the given formatter. Read more
Source§

impl Display for RuleKind

Source§

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

Formats the value using the given formatter. Read more
Source§

impl Eq for RuleKind

Source§

impl PartialEq for RuleKind

Source§

fn eq(&self, other: &RuleKind) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for RuleKind

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> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. 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.