Added partial recompute of dominator tree in case of Ebb splitting (#135)

* Partial recompute for dominator tree in case of ebb splitting
Implemented via striding in RPO numbers
This commit is contained in:
Denis Merigoux
2017-08-03 18:26:41 -07:00
committed by Jakob Stoklund Olesen
parent 92392c6041
commit 05ba8dcab6
2 changed files with 164 additions and 4 deletions

View File

@@ -63,6 +63,8 @@ use std::error as std_error;
use std::fmt::{self, Display, Formatter};
use std::result;
use std::collections::BTreeSet;
use std::cmp::Ordering;
use iterators::IteratorExtras;
pub use self::liveness::verify_liveness;
pub use self::cssa::verify_cssa;
@@ -409,6 +411,34 @@ impl<'a> Verifier<'a> {
got);
}
}
// We also verify if the postorder defined by `DominatorTree` is sane
if self.domtree.cfg_postorder().len() != domtree.cfg_postorder().len() {
return err!(AnyEntity::Function,
"incorrect number of Ebbs in postorder traversal");
}
for (index, (&true_ebb, &test_ebb)) in
self.domtree
.cfg_postorder()
.iter()
.zip(domtree.cfg_postorder().iter())
.enumerate() {
if true_ebb != test_ebb {
return err!(test_ebb,
"invalid domtree, postorder ebb number {} should be {}, got {}",
index,
true_ebb,
test_ebb);
}
}
// We verify rpo_cmp on pairs of adjacent ebbs in the postorder
for (&prev_ebb, &next_ebb) in self.domtree.cfg_postorder().iter().adjacent_pairs() {
if domtree.rpo_cmp(prev_ebb, next_ebb, &self.func.layout) != Ordering::Greater {
return err!(next_ebb,
"invalid domtree, rpo_cmp does not says {} is greater than {}",
prev_ebb,
next_ebb);
}
}
Ok(())
}