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
Loading content...Provided methods
Loading content...Implementors
impl MirPass<'_> for UnreachablePropagation[src]
impl MirPass<'_> for UnreachablePropagation[src]impl<'tcx> MirPass<'tcx> for AddCallGuards[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.
impl<'tcx> MirPass<'tcx> for AddMovesForPackedDrops[src]
impl<'tcx> MirPass<'tcx> for AddMovesForPackedDrops[src]impl<'tcx> MirPass<'tcx> for CheckConstItemMutation[src]
impl<'tcx> MirPass<'tcx> for CheckConstItemMutation[src]impl<'tcx> MirPass<'tcx> for CheckPackedRef[src]
impl<'tcx> MirPass<'tcx> for CheckPackedRef[src]impl<'tcx> MirPass<'tcx> for CleanupNonCodegenStatements[src]
impl<'tcx> MirPass<'tcx> for CleanupNonCodegenStatements[src]impl<'tcx> MirPass<'tcx> for ConstDebugInfo[src]
impl<'tcx> MirPass<'tcx> for ConstDebugInfo[src]impl<'tcx> MirPass<'tcx> for InstrumentCoverage[src]
impl<'tcx> MirPass<'tcx> for InstrumentCoverage[src]impl<'tcx> MirPass<'tcx> for Deaggregator[src]
impl<'tcx> MirPass<'tcx> for Deaggregator[src]impl<'tcx> MirPass<'tcx> for DeduplicateBlocks[src]
impl<'tcx> MirPass<'tcx> for DeduplicateBlocks[src]impl<'tcx> MirPass<'tcx> for DestinationPropagation[src]
impl<'tcx> MirPass<'tcx> for DestinationPropagation[src]impl<'tcx> MirPass<'tcx> for EarlyOtherwiseBranch[src]
impl<'tcx> MirPass<'tcx> for EarlyOtherwiseBranch[src]impl<'tcx> MirPass<'tcx> for ElaborateDrops[src]
impl<'tcx> MirPass<'tcx> for ElaborateDrops[src]impl<'tcx> MirPass<'tcx> for FunctionItemReferences[src]
impl<'tcx> MirPass<'tcx> for FunctionItemReferences[src]impl<'tcx> MirPass<'tcx> for StateTransform[src]
impl<'tcx> MirPass<'tcx> for StateTransform[src]impl<'tcx> MirPass<'tcx> for InstCombine[src]
impl<'tcx> MirPass<'tcx> for InstCombine[src]impl<'tcx> MirPass<'tcx> for LowerIntrinsics[src]
impl<'tcx> MirPass<'tcx> for LowerIntrinsics[src]impl<'tcx> MirPass<'tcx> for MatchBranchSimplification[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; }
impl<'tcx> MirPass<'tcx> for MultipleReturnTerminators[src]
impl<'tcx> MirPass<'tcx> for MultipleReturnTerminators[src]impl<'tcx> MirPass<'tcx> for NoLandingPads[src]
impl<'tcx> MirPass<'tcx> for NoLandingPads[src]impl<'tcx> MirPass<'tcx> for RenameReturnPlace[src]
impl<'tcx> MirPass<'tcx> for RenameReturnPlace[src]impl<'tcx> MirPass<'tcx> for PromoteTemps<'tcx>[src]
impl<'tcx> MirPass<'tcx> for PromoteTemps<'tcx>[src]impl<'tcx> MirPass<'tcx> for RemoveNoopLandingPads[src]
impl<'tcx> MirPass<'tcx> for RemoveNoopLandingPads[src]impl<'tcx> MirPass<'tcx> for RemoveStorageMarkers[src]
impl<'tcx> MirPass<'tcx> for RemoveStorageMarkers[src]impl<'tcx> MirPass<'tcx> for RemoveUnneededDrops[src]
impl<'tcx> MirPass<'tcx> for RemoveUnneededDrops[src]impl<'tcx> MirPass<'tcx> for RemoveZsts[src]
impl<'tcx> MirPass<'tcx> for RemoveZsts[src]impl<'tcx> MirPass<'tcx> for SanityCheck[src]
impl<'tcx> MirPass<'tcx> for SanityCheck[src]impl<'tcx> MirPass<'tcx> for SimplifyCfg[src]
impl<'tcx> MirPass<'tcx> for SimplifyCfg[src]impl<'tcx> MirPass<'tcx> for SimplifyLocals[src]
impl<'tcx> MirPass<'tcx> for SimplifyLocals[src]impl<'tcx> MirPass<'tcx> for SimplifyBranches[src]
impl<'tcx> MirPass<'tcx> for SimplifyBranches[src]impl<'tcx> MirPass<'tcx> for SimplifyComparisonIntegral[src]
impl<'tcx> MirPass<'tcx> for SimplifyComparisonIntegral[src]impl<'tcx> MirPass<'tcx> for SimplifyArmIdentity[src]
impl<'tcx> MirPass<'tcx> for SimplifyArmIdentity[src]impl<'tcx> MirPass<'tcx> for SimplifyBranchSame[src]
impl<'tcx> MirPass<'tcx> for SimplifyBranchSame[src]impl<'tcx> MirPass<'tcx> for UninhabitedEnumBranching[src]
impl<'tcx> MirPass<'tcx> for UninhabitedEnumBranching[src]