Skip to main content

Cycles

Struct Cycles 

Source
pub struct Cycles(/* private fields */);
Expand description

Time, as multiples of one simple ALU operation.

Fixed point with two decimal places, per Cycles::SCALE. Integers are not enough: an lea on x86-64 costs less than an add on some microarchitectures and more on others, and a table that can only say one or two has to round the answer before any pass has seen it. Floating point would do, and is not used, because two compilers built from the same source must make the same decisions and a cost that is compared for equality is a cost that has to be exact.

§Infinity

Cycles::INFINITE means the thing is not possible, which is a different statement from very expensive and is the same type so that the comparison operators work on both. Section 40.2 takes this from GCC’s infinite_cost in gcc/tree-ssa-loop-ivopts.cc, and the reason to have it once rather than in each pass is that i64::MAX / 2 written in eight places is eight chances to overflow it.

Arithmetic saturates at infinity rather than wrapping. Section 40.13 asks that the saturating case be visible rather than silent, and crate::Cost is where that is recorded, because a saturation matters when it decides something and a bare Cycles has not decided anything yet.

Implementations§

Source§

impl Cycles

Source

pub const SCALE: i64 = 100

How many units one simple ALU operation is worth, which fixes where the point sits.

A hundred, so that a table can be read and written in the units people quote latencies in. GCC’s COSTS_N_INSNS uses four, which buys quarter granularity and makes every number in every target file a multiple of four that has to be divided in your head.

Source

pub const ZERO: Self

Free. Not the same as Cycles::ONE on a machine that issues several operations a cycle, and not the same as unknown either.

Source

pub const ONE: Self

One simple ALU operation, the unit everything else is quoted against.

Source

pub const INFINITE: Self

This is not possible. Saturating, and larger than every finite cost.

Source

pub const fn insns(n: i64) -> Self

A whole number of simple operations.

Source

pub const fn hundredths(n: i64) -> Self

A number of hundredths, for a table entry that is not a whole number of operations.

Source

pub const fn is_infinite(self) -> bool

Whether this is Cycles::INFINITE, meaning impossible rather than expensive.

Worth asking before printing a cost and before dividing by one, and worth not asking anywhere else, since the ordering already puts it above everything finite.

Source

pub const fn raw(self) -> i64

The raw hundredths, for a report that wants to do its own arithmetic.

Trait Implementations§

Source§

impl Add for Cycles

Source§

type Output = Cycles

The resulting type after applying the + operator.
Source§

fn add(self, other: Self) -> Self

Performs the + operation. Read more
Source§

impl AddAssign for Cycles

Source§

fn add_assign(&mut self, other: Self)

Performs the += operation. Read more
Source§

impl Capability for Cycles

Source§

fn impossible(&self) -> Vec<bool>

One entry per costed lane, saying whether that lane is impossible.
Source§

impl Clone for Cycles

Source§

fn clone(&self) -> Cycles

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 Cycles

Source§

impl Debug for Cycles

Source§

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

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

impl Default for Cycles

Source§

fn default() -> Cycles

Returns the “default value” for a type. Read more
Source§

impl Display for Cycles

Source§

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

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

impl Div<i64> for Cycles

Source§

fn div(self, by: i64) -> Self

Dividing infinity leaves infinity, and dividing by zero is a bug rather than an infinity.

A pass that divides a cost by a count it did not check is a pass with an empty set it thought was non-empty, and turning that into a very large number would hide it until the number came out of a heuristic somewhere else.

Source§

type Output = Cycles

The resulting type after applying the / operator.
Source§

impl Eq for Cycles

Source§

impl Hash for Cycles

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Mul<i64> for Cycles

Source§

type Output = Cycles

The resulting type after applying the * operator.
Source§

fn mul(self, by: i64) -> Self

Performs the * operation. Read more
Source§

impl Ord for Cycles

Source§

fn cmp(&self, other: &Cycles) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 (const: unstable) · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 (const: unstable) · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 (const: unstable) · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

fn clamp_to<R>(self, range: R) -> Self
where Self: Sized, R: ClampBounds<Self>,

🔬This is a nightly-only experimental API. (clamp_to)
Restrict a value to a certain range. Read more
Source§

impl PartialEq for Cycles

Source§

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

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

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

Inequality operator !=. Read more
Source§

impl PartialOrd for Cycles

Source§

fn partial_cmp(&self, other: &Cycles) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 (const: unstable) · Source§

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

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 (const: unstable) · Source§

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

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 (const: unstable) · Source§

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

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 (const: unstable) · Source§

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

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl StructuralPartialEq for Cycles

Source§

impl Sub for Cycles

Source§

fn sub(self, other: Self) -> Self

Saturating below at zero as well as above at infinity.

A negative cost is not a thing any pass here means. Every subtraction in the documents is a saving, of the form what it cost before minus what it costs now, and a saving that came out negative is a transformation that did not pay, which zero says as well as minus three does and without the risk that something later multiplies by it.

Source§

type Output = Cycles

The resulting type after applying the - operator.

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.