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