()
| 849 | |
| 850 | #[test] |
| 851 | fn program_with_loop() { |
| 852 | let mut func = Function::new(); |
| 853 | let mut ssa = SSABuilder::default(); |
| 854 | let block0 = func.dfg.make_block(); |
| 855 | let block1 = func.dfg.make_block(); |
| 856 | let block2 = func.dfg.make_block(); |
| 857 | let block3 = func.dfg.make_block(); |
| 858 | { |
| 859 | let mut cur = FuncCursor::new(&mut func); |
| 860 | cur.insert_block(block0); |
| 861 | cur.insert_block(block1); |
| 862 | cur.insert_block(block2); |
| 863 | cur.insert_block(block3); |
| 864 | } |
| 865 | // Here is the pseudo-program we want to translate: |
| 866 | // block0: |
| 867 | // x = 1; |
| 868 | // y = 2; |
| 869 | // z = x + y; |
| 870 | // jump block1 |
| 871 | // block1: |
| 872 | // z = z + y; |
| 873 | // brif y, block3, block2; |
| 874 | // block2: |
| 875 | // z = z - x; |
| 876 | // return y |
| 877 | // block3: |
| 878 | // y = y - x |
| 879 | // jump block1 |
| 880 | |
| 881 | // block0 |
| 882 | ssa.declare_block(block0); |
| 883 | ssa.seal_block(block0, &mut func); |
| 884 | let x_var = Variable::new(0); |
| 885 | let x1 = { |
| 886 | let mut cur = FuncCursor::new(&mut func).at_bottom(block0); |
| 887 | cur.ins().iconst(I32, 1) |
| 888 | }; |
| 889 | ssa.def_var(x_var, x1, block0); |
| 890 | let y_var = Variable::new(1); |
| 891 | let y1 = { |
| 892 | let mut cur = FuncCursor::new(&mut func).at_bottom(block0); |
| 893 | cur.ins().iconst(I32, 2) |
| 894 | }; |
| 895 | ssa.def_var(y_var, y1, block0); |
| 896 | let z_var = Variable::new(2); |
| 897 | let x2 = ssa.use_var(&mut func, x_var, I32, block0).0; |
| 898 | let y2 = ssa.use_var(&mut func, y_var, I32, block0).0; |
| 899 | let z1 = { |
| 900 | let mut cur = FuncCursor::new(&mut func).at_bottom(block0); |
| 901 | cur.ins().iadd(x2, y2) |
| 902 | }; |
| 903 | ssa.def_var(z_var, z1, block0); |
| 904 | let jump_block0_block1 = { |
| 905 | let mut cur = FuncCursor::new(&mut func).at_bottom(block0); |
| 906 | cur.ins().jump(block1, &[]) |
| 907 | }; |
| 908 | assert_eq!(ssa.use_var(&mut func, x_var, I32, block0).0, x1); |
nothing calls this directly
no test coverage detected