diff --git a/fuzz/fuzz_targets/domtree.rs b/fuzz/fuzz_targets/domtree.rs index 4cd8d79..c89b443 100644 --- a/fuzz/fuzz_targets/domtree.rs +++ b/fuzz/fuzz_targets/domtree.rs @@ -85,16 +85,13 @@ fn check_idom_violations(idom: &[Block], path: &Path) { let mut parent = idom[block.index()]; let mut domset = HashSet::new(); domset.insert(*block); - loop { - assert!(parent.is_valid()); + while parent.is_valid() { assert!(visited.contains(&parent)); domset.insert(parent); let next = idom[parent.index()]; - if next == parent { - break; - } parent = next; } + // Check that `dominates()` returns true for every block in domset, // and false for every other block. for domblock in 0..idom.len() { diff --git a/src/domtree.rs b/src/domtree.rs index 7677583..4300e04 100644 --- a/src/domtree.rs +++ b/src/domtree.rs @@ -98,6 +98,10 @@ pub fn calculate<'a, PredFn: Fn(Block) -> &'a [Block]>( } } + // Now set the start node's dominator-tree parent to "invalid"; + // this allows the loop in `dominates` to terminate. + idom[start.index()] = Block::invalid(); + idom } @@ -109,10 +113,6 @@ pub fn dominates(idom: &[Block], a: Block, mut b: Block) -> bool { if b.is_invalid() { return false; } - let parent = idom[b.index()]; - if b == parent { - return false; - } b = idom[b.index()]; } }