From 0eaa0fde0657e8df330bc06f95b0bd0b01ceb8ac Mon Sep 17 00:00:00 2001 From: Chris Fallin Date: Sat, 5 Jun 2021 14:47:55 -0700 Subject: [PATCH] Fix to checker: analyze all blocks, even if out-state of entry block is empty --- src/checker.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/checker.rs b/src/checker.rs index e3afb9f..4adecb3 100644 --- a/src/checker.rs +++ b/src/checker.rs @@ -613,10 +613,16 @@ impl<'a, F: Function> Checker<'a, F> { /// Perform the dataflow analysis to compute checker state at each BB entry. fn analyze(&mut self) { let mut queue = VecDeque::new(); - queue.push_back(self.f.entry_block()); + let mut queue_set = HashSet::new(); + for block in 0..self.f.blocks() { + let block = Block::new(block); + queue.push_back(block); + queue_set.insert(block); + } while !queue.is_empty() { let block = queue.pop_front().unwrap(); + queue_set.remove(&block); let mut state = self.bb_in.get(&block).cloned().unwrap(); debug!("analyze: block {} has state {:?}", block.index(), state); for inst in self.bb_insts.get(&block).unwrap() { @@ -637,7 +643,10 @@ impl<'a, F: Function> Checker<'a, F> { new_state ); self.bb_in.insert(succ, new_state); - queue.push_back(succ); + if !queue_set.contains(&succ) { + queue.push_back(succ); + queue_set.insert(succ); + } } } }