|
|
@ -256,125 +256,4 @@ mod tests { |
|
|
|
assert_eq!(ebb1_successors.contains(&ebb1), true); |
|
|
|
assert_eq!(ebb1_successors.contains(&ebb2), true); |
|
|
|
} |
|
|
|
|
|
|
|
#[test] |
|
|
|
fn postorder_traversal() { |
|
|
|
let mut func = Function::new(); |
|
|
|
let ebb0 = func.dfg.make_ebb(); |
|
|
|
let ebb1 = func.dfg.make_ebb(); |
|
|
|
let ebb2 = func.dfg.make_ebb(); |
|
|
|
let ebb3 = func.dfg.make_ebb(); |
|
|
|
let ebb4 = func.dfg.make_ebb(); |
|
|
|
let ebb5 = func.dfg.make_ebb(); |
|
|
|
|
|
|
|
func.layout.append_ebb(ebb0); |
|
|
|
func.layout.append_ebb(ebb1); |
|
|
|
func.layout.append_ebb(ebb2); |
|
|
|
func.layout.append_ebb(ebb3); |
|
|
|
func.layout.append_ebb(ebb4); |
|
|
|
func.layout.append_ebb(ebb5); |
|
|
|
|
|
|
|
let br_ebb0_ebb1 = make_inst::branch(&mut func, ebb1); |
|
|
|
func.layout.append_inst(br_ebb0_ebb1, ebb0); |
|
|
|
|
|
|
|
let jmp_ebb0_ebb2 = make_inst::jump(&mut func, ebb2); |
|
|
|
func.layout.append_inst(jmp_ebb0_ebb2, ebb0); |
|
|
|
|
|
|
|
let br_ebb2_ebb2 = make_inst::branch(&mut func, ebb2); |
|
|
|
func.layout.append_inst(br_ebb2_ebb2, ebb2); |
|
|
|
|
|
|
|
let br_ebb2_ebb1 = make_inst::branch(&mut func, ebb1); |
|
|
|
func.layout.append_inst(br_ebb2_ebb1, ebb2); |
|
|
|
|
|
|
|
let jmp_ebb1_ebb3 = make_inst::jump(&mut func, ebb3); |
|
|
|
func.layout.append_inst(jmp_ebb1_ebb3, ebb1); |
|
|
|
|
|
|
|
let br_ebb2_ebb4 = make_inst::branch(&mut func, ebb4); |
|
|
|
func.layout.append_inst(br_ebb2_ebb4, ebb2); |
|
|
|
|
|
|
|
let jmp_ebb2_ebb5 = make_inst::jump(&mut func, ebb5); |
|
|
|
func.layout.append_inst(jmp_ebb2_ebb5, ebb2); |
|
|
|
|
|
|
|
let cfg = ControlFlowGraph::new(&func); |
|
|
|
let mut postorder = vec![ebb3, ebb1, ebb4, ebb5, ebb2, ebb0]; |
|
|
|
postorder.reverse(); |
|
|
|
for (ebb, key) in cfg.reverse_postorder_ebbs() { |
|
|
|
assert_eq!(ebb, postorder[key]); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#[test] |
|
|
|
fn loops_one() { |
|
|
|
let mut func = Function::new(); |
|
|
|
let ebb0 = func.dfg.make_ebb(); |
|
|
|
let ebb1 = func.dfg.make_ebb(); |
|
|
|
let ebb2 = func.dfg.make_ebb(); |
|
|
|
let ebb3 = func.dfg.make_ebb(); |
|
|
|
func.layout.append_ebb(ebb0); |
|
|
|
func.layout.append_ebb(ebb1); |
|
|
|
func.layout.append_ebb(ebb2); |
|
|
|
func.layout.append_ebb(ebb3); |
|
|
|
|
|
|
|
let jmp_ebb0_ebb1 = make_inst::jump(&mut func, ebb1); |
|
|
|
let br_ebb1_ebb3 = make_inst::branch(&mut func, ebb3); |
|
|
|
let jmp_ebb1_ebb2 = make_inst::jump(&mut func, ebb2); |
|
|
|
let jmp_ebb2_ebb3 = make_inst::jump(&mut func, ebb3); |
|
|
|
|
|
|
|
func.layout.append_inst(jmp_ebb0_ebb1, ebb0); |
|
|
|
func.layout.append_inst(br_ebb1_ebb3, ebb1); |
|
|
|
func.layout.append_inst(jmp_ebb1_ebb2, ebb1); |
|
|
|
func.layout.append_inst(jmp_ebb2_ebb3, ebb2); |
|
|
|
|
|
|
|
let cfg = ControlFlowGraph::new(&func); |
|
|
|
let mut postorder = vec![ebb3, ebb2, ebb1, ebb0]; |
|
|
|
postorder.reverse(); |
|
|
|
for (ebb, key) in cfg.reverse_postorder_ebbs() { |
|
|
|
assert_eq!(ebb, postorder[key]); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#[test] |
|
|
|
fn loops_two() { |
|
|
|
let mut func = Function::new(); |
|
|
|
let ebb0 = func.dfg.make_ebb(); |
|
|
|
let ebb1 = func.dfg.make_ebb(); |
|
|
|
let ebb2 = func.dfg.make_ebb(); |
|
|
|
let ebb3 = func.dfg.make_ebb(); |
|
|
|
let ebb4 = func.dfg.make_ebb(); |
|
|
|
let ebb5 = func.dfg.make_ebb(); |
|
|
|
|
|
|
|
func.layout.append_ebb(ebb0); |
|
|
|
func.layout.append_ebb(ebb1); |
|
|
|
func.layout.append_ebb(ebb2); |
|
|
|
func.layout.append_ebb(ebb3); |
|
|
|
func.layout.append_ebb(ebb4); |
|
|
|
func.layout.append_ebb(ebb5); |
|
|
|
|
|
|
|
let jmp_ebb0_ebb1 = make_inst::jump(&mut func, ebb1); |
|
|
|
let jmp_ebb0_ebb2 = make_inst::jump(&mut func, ebb2); |
|
|
|
let jmp_ebb1_ebb3 = make_inst::jump(&mut func, ebb3); |
|
|
|
let br_ebb2_ebb4 = make_inst::jump(&mut func, ebb4); |
|
|
|
let jmp_ebb2_ebb5 = make_inst::jump(&mut func, ebb5); |
|
|
|
let jmp_ebb3_ebb4 = make_inst::jump(&mut func, ebb4); |
|
|
|
let br_ebb4_ebb3 = make_inst::branch(&mut func, ebb3); |
|
|
|
let jmp_ebb4_ebb5 = make_inst::jump(&mut func, ebb5); |
|
|
|
let jmp_ebb5_ebb4 = make_inst::jump(&mut func, ebb4); |
|
|
|
|
|
|
|
func.layout.append_inst(jmp_ebb0_ebb1, ebb0); |
|
|
|
func.layout.append_inst(jmp_ebb0_ebb2, ebb0); |
|
|
|
func.layout.append_inst(jmp_ebb1_ebb3, ebb1); |
|
|
|
func.layout.append_inst(br_ebb2_ebb4, ebb2); |
|
|
|
func.layout.append_inst(jmp_ebb2_ebb5, ebb2); |
|
|
|
func.layout.append_inst(jmp_ebb3_ebb4, ebb3); |
|
|
|
func.layout.append_inst(br_ebb4_ebb3, ebb4); |
|
|
|
func.layout.append_inst(jmp_ebb4_ebb5, ebb4); |
|
|
|
func.layout.append_inst(jmp_ebb5_ebb4, ebb5); |
|
|
|
|
|
|
|
let cfg = ControlFlowGraph::new(&func); |
|
|
|
let mut postorder = vec![ebb1, ebb3, ebb4, ebb5, ebb2, ebb0]; |
|
|
|
postorder.reverse(); |
|
|
|
for (ebb, key) in cfg.reverse_postorder_ebbs() { |
|
|
|
assert_eq!(ebb, postorder[key]); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|