MCPcopy Create free account
hub / github.com/bytecodealliance/wasmtime / program_with_loop

Function program_with_loop

cranelift/frontend/src/ssa.rs:851–973  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

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);

Callers

nothing calls this directly

Calls 11

make_blockMethod · 0.80
declare_blockMethod · 0.80
at_bottomMethod · 0.80
jumpMethod · 0.80
newFunction · 0.50
insert_blockMethod · 0.45
seal_blockMethod · 0.45
insMethod · 0.45
def_varMethod · 0.45
use_varMethod · 0.45

Tested by

no test coverage detected