Trait rustc_mir::transform::MirPass[−][src]

pub trait MirPass<'tcx> {
    fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>);

    fn name(&self) -> Cow<'_, str> { ... }
}
Expand description

A streamlined trait that you can implement to create a pass; the pass will be named after the type, and it will consist of a main loop that goes over each available MIR and applies run_pass.

Required methods

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

Loading content...

Provided methods

fn name(&self) -> Cow<'_, str>[src]

Loading content...

Implementors

impl MirPass<'_> for UnreachablePropagation[src]

fn run_pass<'tcx>(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

Breaks outgoing critical edges for call terminators in the MIR.

Critical edges are edges that are neither the only edge leaving a block, nor the only edge entering one.

When you want something to happen “along” an edge, you can either do at the end of the predecessor block, or at the start of the successor block. Critical edges have to be broken in order to prevent “edge actions” from affecting other edges. We need this for calls that are codegened to LLVM invoke instructions, because invoke is a block terminator in LLVM so we can’t insert any code to handle the call’s result into the block that performs the call.

This function will break those edges by inserting new blocks along them.

NOTE: Simplify CFG will happily undo most of the work this pass does.

fn run_pass(&self, _tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, mir_body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn name(&self) -> Cow<'_, str>[src]

fn run_pass(&self, _tcx: TyCtxt<'tcx>, _body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

If a source block is found that switches between two blocks that are exactly the same modulo const bool assignments (e.g., one assigns true another false to the same place), merge a target block statements into the source block, using Eq / Ne comparison with switch value where const bools value differ.

For example:

bb0: {
    switchInt(move _3) -> [42_isize: bb1, otherwise: bb2];
}

bb1: {
    _2 = const true;
    goto -> bb3;
}

bb2: {
    _2 = const false;
    goto -> bb3;
}

into:

bb0: {
   _2 = Eq(move _3, const 42_isize);
   goto -> bb3;
}

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn name(&self) -> Cow<'_, str>[src]

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn name(&self) -> Cow<'_, str>[src]

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

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

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)[src]

Loading content...