[][src]Struct rustc_mir::transform::nrvo::RenameReturnPlace

pub struct RenameReturnPlace;

This pass looks for MIR that always copies the same local into the return place and eliminates the copy by renaming all uses of that local to _0.

This allows LLVM to perform an optimization similar to the named return value optimization (NRVO) that is guaranteed in C++. This avoids a stack allocation and memcpy for the relatively common pattern of allocating a buffer on the stack, mutating it, and returning it by value like so:

fn foo(init: fn(&mut [u8; 1024])) -> [u8; 1024] {
    let mut buf = [0; 1024];
    init(&mut buf);
    buf
}

For now, this pass is very simple and only capable of eliminating a single copy. A more general version of copy propagation, such as the one based on non-overlapping live ranges in #47954 and #71003, could yield even more benefits.

Trait Implementations

impl<'tcx> MirPass<'tcx> for RenameReturnPlace[src]

Auto Trait Implementations

impl RefUnwindSafe for RenameReturnPlace

impl Send for RenameReturnPlace

impl Sync for RenameReturnPlace

impl Unpin for RenameReturnPlace

impl UnwindSafe for RenameReturnPlace

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

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

The type returned in the event of a conversion error.

impl<T> WithConstness for T[src]