()
| 708 | |
| 709 | #[test] |
| 710 | fn backwards_layout() { |
| 711 | let mut func = Function::new(); |
| 712 | let block0 = func.dfg.make_block(); |
| 713 | let block1 = func.dfg.make_block(); |
| 714 | let block2 = func.dfg.make_block(); |
| 715 | |
| 716 | let mut cur = FuncCursor::new(&mut func); |
| 717 | |
| 718 | cur.insert_block(block0); |
| 719 | let jmp02 = cur.ins().jump(block2, &[]); |
| 720 | |
| 721 | cur.insert_block(block1); |
| 722 | let trap = cur.ins().trap(TrapCode::unwrap_user(5)); |
| 723 | |
| 724 | cur.insert_block(block2); |
| 725 | let jmp21 = cur.ins().jump(block1, &[]); |
| 726 | |
| 727 | let cfg = ControlFlowGraph::with_function(cur.func); |
| 728 | let dt = DominatorTree::with_function(cur.func, &cfg); |
| 729 | |
| 730 | assert_eq!(cur.func.layout.entry_block(), Some(block0)); |
| 731 | assert_eq!(dt.idom(block0), None); |
| 732 | assert_eq!(dt.idom(block1), Some(block2)); |
| 733 | assert_eq!(dt.idom(block2), Some(block0)); |
| 734 | |
| 735 | assert!(dt.dominates(block0, block0, &cur.func.layout)); |
| 736 | assert!(dt.dominates(block0, jmp02, &cur.func.layout)); |
| 737 | assert!(dt.dominates(block0, block1, &cur.func.layout)); |
| 738 | assert!(dt.dominates(block0, trap, &cur.func.layout)); |
| 739 | assert!(dt.dominates(block0, block2, &cur.func.layout)); |
| 740 | assert!(dt.dominates(block0, jmp21, &cur.func.layout)); |
| 741 | |
| 742 | assert!(!dt.dominates(jmp02, block0, &cur.func.layout)); |
| 743 | assert!(dt.dominates(jmp02, jmp02, &cur.func.layout)); |
| 744 | assert!(dt.dominates(jmp02, block1, &cur.func.layout)); |
| 745 | assert!(dt.dominates(jmp02, trap, &cur.func.layout)); |
| 746 | assert!(dt.dominates(jmp02, block2, &cur.func.layout)); |
| 747 | assert!(dt.dominates(jmp02, jmp21, &cur.func.layout)); |
| 748 | |
| 749 | assert!(!dt.dominates(block1, block0, &cur.func.layout)); |
| 750 | assert!(!dt.dominates(block1, jmp02, &cur.func.layout)); |
| 751 | assert!(dt.dominates(block1, block1, &cur.func.layout)); |
| 752 | assert!(dt.dominates(block1, trap, &cur.func.layout)); |
| 753 | assert!(!dt.dominates(block1, block2, &cur.func.layout)); |
| 754 | assert!(!dt.dominates(block1, jmp21, &cur.func.layout)); |
| 755 | |
| 756 | assert!(!dt.dominates(trap, block0, &cur.func.layout)); |
| 757 | assert!(!dt.dominates(trap, jmp02, &cur.func.layout)); |
| 758 | assert!(!dt.dominates(trap, block1, &cur.func.layout)); |
| 759 | assert!(dt.dominates(trap, trap, &cur.func.layout)); |
| 760 | assert!(!dt.dominates(trap, block2, &cur.func.layout)); |
| 761 | assert!(!dt.dominates(trap, jmp21, &cur.func.layout)); |
| 762 | |
| 763 | assert!(!dt.dominates(block2, block0, &cur.func.layout)); |
| 764 | assert!(!dt.dominates(block2, jmp02, &cur.func.layout)); |
| 765 | assert!(dt.dominates(block2, block1, &cur.func.layout)); |
| 766 | assert!(dt.dominates(block2, trap, &cur.func.layout)); |
| 767 | assert!(dt.dominates(block2, block2, &cur.func.layout)); |
nothing calls this directly
no test coverage detected