Sha256: 402fde65416c1d1d3ac59eff133281559f3d2872f340b701150d2d611ab922a4

Contents?: true

Size: 1.87 KB

Versions: 24

Compression:

Stored size: 1.87 KB

Contents

//! Extended domtree with various traversal support.

use crate::dominator_tree::DominatorTree;
use crate::ir::{Block, Function};
use cranelift_entity::{packed_option::PackedOption, SecondaryMap};

#[derive(Clone, Debug)]
pub(crate) struct DomTreeWithChildren {
    nodes: SecondaryMap<Block, DomTreeNode>,
    root: Block,
}

#[derive(Clone, Copy, Debug, Default)]
struct DomTreeNode {
    children: PackedOption<Block>,
    next: PackedOption<Block>,
}

impl DomTreeWithChildren {
    pub(crate) fn new(func: &Function, domtree: &DominatorTree) -> DomTreeWithChildren {
        let mut nodes: SecondaryMap<Block, DomTreeNode> =
            SecondaryMap::with_capacity(func.dfg.num_blocks());

        for block in func.layout.blocks() {
            let idom_inst = match domtree.idom(block) {
                Some(idom_inst) => idom_inst,
                None => continue,
            };
            let idom = func
                .layout
                .inst_block(idom_inst)
                .expect("Dominating instruction should be part of a block");

            nodes[block].next = nodes[idom].children;
            nodes[idom].children = block.into();
        }

        let root = func.layout.entry_block().unwrap();

        Self { nodes, root }
    }

    pub(crate) fn root(&self) -> Block {
        self.root
    }

    pub(crate) fn children<'a>(&'a self, block: Block) -> DomTreeChildIter<'a> {
        let block = self.nodes[block].children;
        DomTreeChildIter {
            domtree: self,
            block,
        }
    }
}

pub(crate) struct DomTreeChildIter<'a> {
    domtree: &'a DomTreeWithChildren,
    block: PackedOption<Block>,
}

impl<'a> Iterator for DomTreeChildIter<'a> {
    type Item = Block;
    fn next(&mut self) -> Option<Block> {
        self.block.expand().map(|block| {
            self.block = self.domtree.nodes[block].next;
            block
        })
    }
}

Version data entries

24 entries across 24 versions & 1 rubygems

Version Path
wasmtime-17.0.1 ./ext/cargo-vendor/cranelift-codegen-0.104.1/src/egraph/domtree.rs
wasmtime-17.0.0 ./ext/cargo-vendor/cranelift-codegen-0.104.0/src/egraph/domtree.rs
wasmtime-16.0.0 ./ext/cargo-vendor/cranelift-codegen-0.103.0/src/egraph/domtree.rs
wasmtime-15.0.1 ./ext/cargo-vendor/cranelift-codegen-0.102.1/src/egraph/domtree.rs
wasmtime-15.0.0 ./ext/cargo-vendor/cranelift-codegen-0.102.1/src/egraph/domtree.rs
wasmtime-14.0.4 ./ext/cargo-vendor/cranelift-codegen-0.101.4/src/egraph/domtree.rs
wasmtime-14.0.3 ./ext/cargo-vendor/cranelift-codegen-0.101.4/src/egraph/domtree.rs
wasmtime-14.0.1 ./ext/cargo-vendor/cranelift-codegen-0.101.1/src/egraph/domtree.rs
wasmtime-14.0.0 ./ext/cargo-vendor/cranelift-codegen-0.101.1/src/egraph/domtree.rs
wasmtime-13.0.0 ./ext/cargo-vendor/cranelift-codegen-0.100.0/src/egraph/domtree.rs
wasmtime-12.0.1 ./ext/cargo-vendor/cranelift-codegen-0.99.1/src/egraph/domtree.rs
wasmtime-12.0.0 ./ext/cargo-vendor/cranelift-codegen-0.99.1/src/egraph/domtree.rs
wasmtime-11.0.0 ./ext/cargo-vendor/cranelift-codegen-0.98.1/src/egraph/domtree.rs
wasmtime-10.0.1 ./ext/cargo-vendor/cranelift-codegen-0.97.1/src/egraph/domtree.rs
wasmtime-10.0.0 ./ext/cargo-vendor/cranelift-codegen-0.97.1/src/egraph/domtree.rs
wasmtime-9.0.4 ./ext/cargo-vendor/cranelift-codegen-0.96.4/src/egraph/domtree.rs
wasmtime-9.0.1 ./ext/cargo-vendor/cranelift-codegen-0.96.1/src/egraph/domtree.rs
wasmtime-8.0.0 ./ext/cargo-vendor/cranelift-codegen-0.95.0/src/egraph/domtree.rs
wasmtime-7.0.0 ./ext/cargo-vendor/cranelift-codegen-0.94.0/src/egraph/domtree.rs
wasmtime-6.0.1 ./ext/cargo-vendor/cranelift-codegen-0.93.1/src/egraph/domtree.rs