Skip to content
Snippets Groups Projects

Clone elimination pass

Merged rarbore2 requested to merge clone_elimination into main
5 files
+ 75
3
Compare changes
  • Side-by-side
  • Inline
Files
5
+ 33
0
extern crate hercules_ir;
use std::collections::BTreeSet;
use self::hercules_ir::ir::*;
use crate::*;
/*
* Top level function to run clone elimination.
*/
pub fn clone_elim(editor: &mut FunctionEditor) {
// Create workset (starts as all nodes).
let mut workset: BTreeSet<NodeID> = (0..editor.func().nodes.len()).map(NodeID::new).collect();
while let Some(work) = workset.pop_first() {
// Look for Write nodes with identical `collect` and `data` inputs.
let nodes = &editor.func().nodes;
if let Node::Write {
collect,
data,
ref indices,
} = nodes[work.idx()]
&& nodes[collect.idx()] == nodes[data.idx()]
{
assert!(indices.is_empty());
editor.edit(|edit| edit.replace_all_uses(work, collect)?.delete_node(work));
// Removing this write may affect downstream writes.
workset.extend(editor.get_users(work));
}
}
}
Loading