Sha256: c23499b5eb8efd1b6df939255888e00d91259f9867abfdad2fd55339001cce9d

Contents?: true

Size: 1.43 KB

Versions: 29

Compression:

Stored size: 1.43 KB

Contents

/*
 * Released under the terms of the Apache 2.0 license with LLVM
 * exception. See `LICENSE` for details.
 */

//! Fast postorder computation.

use crate::Block;
use alloc::vec;
use alloc::vec::Vec;
use smallvec::{smallvec, SmallVec};

pub fn calculate<'a, SuccFn: Fn(Block) -> &'a [Block]>(
    num_blocks: usize,
    entry: Block,
    succ_blocks: SuccFn,
) -> Vec<Block> {
    let mut ret = vec![];

    // State: visited-block map, and explicit DFS stack.
    let mut visited = vec![false; num_blocks];

    struct State<'a> {
        block: Block,
        succs: &'a [Block],
        next_succ: usize,
    }
    let mut stack: SmallVec<[State; 64]> = smallvec![];

    visited[entry.index()] = true;
    stack.push(State {
        block: entry,
        succs: succ_blocks(entry),
        next_succ: 0,
    });

    while let Some(ref mut state) = stack.last_mut() {
        // Perform one action: push to new succ, skip an already-visited succ, or pop.
        if state.next_succ < state.succs.len() {
            let succ = state.succs[state.next_succ];
            state.next_succ += 1;
            if !visited[succ.index()] {
                visited[succ.index()] = true;
                stack.push(State {
                    block: succ,
                    succs: succ_blocks(succ),
                    next_succ: 0,
                });
            }
        } else {
            ret.push(state.block);
            stack.pop();
        }
    }

    ret
}

Version data entries

29 entries across 29 versions & 1 rubygems

Version Path
wasmtime-27.0.0 ./ext/cargo-vendor/regalloc2-0.10.2/src/postorder.rs
wasmtime-26.0.0 ./ext/cargo-vendor/regalloc2-0.10.2/src/postorder.rs
wasmtime-25.0.2 ./ext/cargo-vendor/regalloc2-0.10.2/src/postorder.rs
wasmtime-25.0.1 ./ext/cargo-vendor/regalloc2-0.10.2/src/postorder.rs
wasmtime-25.0.0 ./ext/cargo-vendor/regalloc2-0.10.2/src/postorder.rs
wasmtime-24.0.0 ./ext/cargo-vendor/regalloc2-0.9.3/src/postorder.rs
wasmtime-23.0.2 ./ext/cargo-vendor/regalloc2-0.9.3/src/postorder.rs
wasmtime-22.0.0 ./ext/cargo-vendor/regalloc2-0.9.3/src/postorder.rs
wasmtime-21.0.1 ./ext/cargo-vendor/regalloc2-0.9.3/src/postorder.rs
wasmtime-20.0.2 ./ext/cargo-vendor/regalloc2-0.9.3/src/postorder.rs
wasmtime-20.0.0 ./ext/cargo-vendor/regalloc2-0.9.3/src/postorder.rs
wasmtime-18.0.3 ./ext/cargo-vendor/regalloc2-0.9.3/src/postorder.rs
wasmtime-17.0.1 ./ext/cargo-vendor/regalloc2-0.9.3/src/postorder.rs
wasmtime-17.0.0 ./ext/cargo-vendor/regalloc2-0.9.3/src/postorder.rs
wasmtime-16.0.0 ./ext/cargo-vendor/regalloc2-0.9.3/src/postorder.rs
wasmtime-15.0.1 ./ext/cargo-vendor/regalloc2-0.9.3/src/postorder.rs
wasmtime-15.0.0 ./ext/cargo-vendor/regalloc2-0.9.3/src/postorder.rs
wasmtime-14.0.4 ./ext/cargo-vendor/regalloc2-0.9.3/src/postorder.rs
wasmtime-14.0.3 ./ext/cargo-vendor/regalloc2-0.9.3/src/postorder.rs
wasmtime-14.0.1 ./ext/cargo-vendor/regalloc2-0.9.3/src/postorder.rs