Skip to content

Instantly share code, notes, and snippets.

@SchrodingerZhu
Created January 18, 2023 14:35
Show Gist options
  • Select an option

  • Save SchrodingerZhu/80577654840c3283329ae64d656b54bf to your computer and use it in GitHub Desktop.

Select an option

Save SchrodingerZhu/80577654840c3283329ae64d656b54bf to your computer and use it in GitHub Desktop.
let mut postorder = Vec::new();
let mut visited = HashSet::new();
fn dfs(pool: &[BasicBlock], cursor: usize, visited: &mut HashSet<usize>, postorder: &mut Vec<usize>) {
if visited.contains(&cursor) {
return;
}
visited.insert(cursor);
for i in pool[cursor].outgoing.iter() {
dfs(pool, *i, visited, postorder);
}
postorder.push(cursor);
}
dfs(&pool.storage, 0, &mut visited, &mut postorder);
let mut changed = true;
let length = pool.storage.len();
for i in pool.storage.iter_mut() {
for j in 0..length {
i.dom.insert(j);
}
}
while changed {
changed = false;
for i in postorder.iter().cloned().rev() {
let before = pool[i].dom.clone();
let mut intersection = None;
for j in pool[i].incoming.iter().cloned() {
intersection = match intersection {
Some(i) => Some(pool[j].dom.intersection(&i).cloned().collect()),
None => Some(pool[j].dom.clone())
};
}
pool[i].dom = intersection.unwrap_or_else(|| BTreeSet::new());
pool[i].dom.insert(i);
changed = changed || before != pool[i].dom;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment