-
Aaron Councilman authoredAaron Councilman authored
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>,