Skip to content
Snippets Groups Projects
pass.rs 29.17 KiB
extern crate hercules_cg;
extern crate hercules_ir;
extern crate postcard;
extern crate serde;
extern crate take_mut;

use std::cell::RefCell;
use std::collections::HashMap;
use std::env::temp_dir;
use std::fs::File;
use std::io::Write;
use std::iter::zip;
use std::process::{Command, Stdio};

use self::serde::Deserialize;

use self::hercules_cg::*;
use self::hercules_ir::*;

use crate::*;

/*
 * Passes that can be run on a module.
 */
#[derive(Debug, Clone, Deserialize)]
pub enum Pass {
    DCE,
    CCP,
    GVN,
    Forkify,
    PhiElim,
    ForkGuardElim,
    Predication,
    SROA,
    Inline,
    Verify,
    // Parameterized over whether analyses that aid visualization are necessary.
    // Useful to set to false if displaying a potentially broken module.
    Xdot(bool),
    SchedXdot,
    // Parameterized over output directory and module name.
    Codegen(String, String),
    // Parameterized over where to serialize module to.
    Serialize(String),
}

/*
 * Manages passes to be run on an IR module. Transparently handles analysis
 * requirements for optimizations.
 */
#[derive(Debug, Clone)]
pub struct PassManager {
    module: Module,

    // Passes to run.
    passes: Vec<Pass>,

    // Cached analysis results.
    pub def_uses: Option<Vec<ImmutableDefUseMap>>,
    pub reverse_postorders: Option<Vec<Vec<NodeID>>>,
    pub typing: Option<ModuleTyping>,
    pub control_subgraphs: Option<Vec<Subgraph>>,
    pub doms: Option<Vec<DomTree>>,
    pub postdoms: Option<Vec<DomTree>>,
    pub fork_join_maps: Option<Vec<HashMap<NodeID, NodeID>>>,
    pub fork_join_nests: Option<Vec<HashMap<NodeID, Vec<NodeID>>>>,
    pub loops: Option<Vec<LoopTree>>,
    pub antideps: Option<Vec<Vec<(NodeID, NodeID)>>>,
    pub bbs: Option<Vec<Vec<NodeID>>>,
    pub callgraph: Option<CallGraph>,