Dominator tree pre-order.
Add a DominatorTreePreorder data structure which can be initialized for a DominatorTree and used for queries involving a pre-order of the dominator tree. Print out the pre-order and send it through filecheck in "test domtree" file tests.
This commit is contained in:
@@ -16,3 +16,10 @@ function %test(i32) {
|
||||
; sameln: ebb3
|
||||
; sameln: ebb1
|
||||
; sameln: ebb0
|
||||
|
||||
; check: domtree_preorder {
|
||||
; nextln: ebb0: ebb1
|
||||
; nextln: ebb1: ebb3 ebb2
|
||||
; nextln: ebb3:
|
||||
; nextln: ebb2:
|
||||
; nextln: }
|
||||
|
||||
@@ -50,6 +50,15 @@ function %test(i32) {
|
||||
; sameln: ebb1
|
||||
; sameln: ebb0
|
||||
|
||||
; check: domtree_preorder {
|
||||
; nextln: ebb0: ebb1 ebb2 ebb4 ebb3 ebb5
|
||||
; nextln: ebb1:
|
||||
; nextln: ebb2:
|
||||
; nextln: ebb4:
|
||||
; nextln: ebb3:
|
||||
; nextln: ebb5:
|
||||
; nextln: }
|
||||
|
||||
function %loop2(i32) native {
|
||||
ebb0(v0: i32):
|
||||
brz v0, ebb1 ; dominates: ebb1 ebb3 ebb4 ebb5
|
||||
@@ -82,3 +91,14 @@ function %loop2(i32) native {
|
||||
; sameln: ebb2
|
||||
; sameln: ebb1
|
||||
; sameln: ebb0
|
||||
|
||||
; check: domtree_preorder {
|
||||
; nextln: ebb0: ebb1 ebb2 ebb4 ebb3 ebb5
|
||||
; nextln: ebb1:
|
||||
; nextln: ebb2:
|
||||
; nextln: ebb4: ebb6
|
||||
; nextln: ebb6: ebb7
|
||||
; nextln: ebb7:
|
||||
; nextln: ebb3:
|
||||
; nextln: ebb5:
|
||||
; nextln: }
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
test domtree
|
||||
|
||||
function %test(i32) {
|
||||
function %loop1(i32) {
|
||||
ebb0(v0: i32):
|
||||
brz v0, ebb1 ; dominates: ebb1 ebb6
|
||||
brnz v0, ebb2 ; dominates: ebb2 ebb9
|
||||
@@ -30,7 +30,20 @@ function %test(i32) {
|
||||
return
|
||||
}
|
||||
|
||||
function %test(i32) native {
|
||||
; check: domtree_preorder {
|
||||
; nextln: ebb0: ebb1 ebb2 ebb6 ebb3 ebb9
|
||||
; nextln: ebb1:
|
||||
; nextln: ebb2: ebb4 ebb5 ebb7 ebb8
|
||||
; nextln: ebb4:
|
||||
; nextln: ebb5:
|
||||
; nextln: ebb7:
|
||||
; nextln: ebb8:
|
||||
; nextln: ebb6:
|
||||
; nextln: ebb3:
|
||||
; nextln: ebb9:
|
||||
; nextln: }
|
||||
|
||||
function %loop2(i32) native {
|
||||
ebb0(v0: i32):
|
||||
brz v0, ebb1 ; dominates: ebb1 ebb3 ebb4 ebb5
|
||||
jump ebb2 ; dominates: ebb2
|
||||
@@ -55,3 +68,12 @@ function %test(i32) native {
|
||||
; sameln: ebb2
|
||||
; sameln: ebb1
|
||||
; sameln: ebb0
|
||||
|
||||
; check: domtree_preorder {
|
||||
; nextln: ebb0: ebb1 ebb2 ebb4 ebb3 ebb5
|
||||
; nextln: ebb1:
|
||||
; nextln: ebb2:
|
||||
; nextln: ebb4:
|
||||
; nextln: ebb3:
|
||||
; nextln: ebb5:
|
||||
; nextln: }
|
||||
|
||||
@@ -31,3 +31,18 @@ function %test(i32) {
|
||||
ebb11:
|
||||
return
|
||||
}
|
||||
|
||||
; check: domtree_preorder {
|
||||
; nextln: ebb0: ebb1 ebb2 ebb3 ebb5
|
||||
; nextln: ebb1: ebb4
|
||||
; nextln: ebb4: ebb6 ebb7 ebb10
|
||||
; nextln: ebb6: ebb8 ebb9 ebb11
|
||||
; nextln: ebb8:
|
||||
; nextln: ebb9:
|
||||
; nextln: ebb11:
|
||||
; nextln: ebb7:
|
||||
; nextln: ebb10:
|
||||
; nextln: ebb2:
|
||||
; nextln: ebb3:
|
||||
; nextln: ebb5:
|
||||
; nextln: }
|
||||
|
||||
@@ -39,3 +39,20 @@ function %test(i32) {
|
||||
ebb13:
|
||||
return
|
||||
}
|
||||
|
||||
; check: domtree_preorder {
|
||||
; nextln: ebb0: ebb13 ebb1
|
||||
; nextln: ebb13:
|
||||
; nextln: ebb1: ebb2 ebb3 ebb4 ebb5 ebb6 ebb7
|
||||
; nextln: ebb2:
|
||||
; nextln: ebb3:
|
||||
; nextln: ebb4:
|
||||
; nextln: ebb5:
|
||||
; nextln: ebb6:
|
||||
; nextln: ebb7: ebb8 ebb9 ebb10 ebb12 ebb11
|
||||
; nextln: ebb8:
|
||||
; nextln: ebb9:
|
||||
; nextln: ebb10:
|
||||
; nextln: ebb12:
|
||||
; nextln: ebb11:
|
||||
; nextln: }
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
//! We verify that the dominator tree annotations are complete and correct.
|
||||
//!
|
||||
|
||||
use cretonne::dominator_tree::DominatorTree;
|
||||
use cretonne::dominator_tree::{DominatorTree, DominatorTreePreorder};
|
||||
use cretonne::flowgraph::ControlFlowGraph;
|
||||
use cretonne::ir::Function;
|
||||
use cretonne::ir::entities::AnyEntity;
|
||||
@@ -110,13 +110,13 @@ impl SubTest for TestDomtree {
|
||||
}
|
||||
}
|
||||
|
||||
let text = filecheck_text(&domtree).expect("formatting error");
|
||||
let text = filecheck_text(func, &domtree).expect("formatting error");
|
||||
run_filecheck(&text, context)
|
||||
}
|
||||
}
|
||||
|
||||
// Generate some output for filecheck testing
|
||||
fn filecheck_text(domtree: &DominatorTree) -> result::Result<String, fmt::Error> {
|
||||
fn filecheck_text(func: &Function, domtree: &DominatorTree) -> result::Result<String, fmt::Error> {
|
||||
let mut s = String::new();
|
||||
|
||||
write!(s, "cfg_postorder:")?;
|
||||
@@ -125,5 +125,24 @@ fn filecheck_text(domtree: &DominatorTree) -> result::Result<String, fmt::Error>
|
||||
}
|
||||
writeln!(s, "")?;
|
||||
|
||||
// Compute and print out a pre-order of the dominator tree.
|
||||
writeln!(s, "domtree_preorder {{")?;
|
||||
let mut dtpo = DominatorTreePreorder::new();
|
||||
dtpo.compute(domtree, &func.layout);
|
||||
let mut stack = Vec::new();
|
||||
stack.extend(func.layout.entry_block());
|
||||
while let Some(ebb) = stack.pop() {
|
||||
write!(s, " {}:", ebb)?;
|
||||
let i = stack.len();
|
||||
for ch in dtpo.children(ebb) {
|
||||
write!(s, " {}", ch)?;
|
||||
stack.push(ch);
|
||||
}
|
||||
writeln!(s, "")?;
|
||||
// Reverse the children we just pushed so we'll pop them in order.
|
||||
stack[i..].reverse();
|
||||
}
|
||||
writeln!(s, "}}")?;
|
||||
|
||||
Ok(s)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user