============ initial translation from Move ================ [variant baseline] fun TestPackref::test1(): TestPackref::R { var $t0|r: TestPackref::R var $t1|r_ref: &mut TestPackref::R var $t2|x_ref: &mut u64 var $t3: u64 var $t4: TestPackref::R var $t5: &mut TestPackref::R var $t6: &mut TestPackref::R var $t7: &mut u64 var $t8: u64 var $t9: &mut u64 var $t10: TestPackref::R 0: $t3 := 3 1: $t4 := pack TestPackref::R($t3) 2: $t0 := $t4 3: $t5 := borrow_local($t0) 4: $t1 := $t5 5: $t6 := move($t1) 6: $t7 := borrow_field.x($t6) 7: $t2 := $t7 8: $t8 := 0 9: $t9 := move($t2) 10: write_ref($t9, $t8) 11: $t10 := move($t0) 12: return $t10 } [variant baseline] fun TestPackref::test2($t0|x_ref: &mut u64, $t1|v: u64) { var $t2: u64 var $t3: &mut u64 0: $t2 := move($t1) 1: $t3 := move($t0) 2: write_ref($t3, $t2) 3: return () } [variant baseline] public fun TestPackref::test3($t0|r_ref: &mut TestPackref::R, $t1|v: u64) { var $t2|x_ref: &mut u64 var $t3: &mut TestPackref::R var $t4: &mut u64 var $t5: &mut u64 var $t6: u64 0: $t3 := move($t0) 1: $t4 := borrow_field.x($t3) 2: $t2 := $t4 3: $t5 := move($t2) 4: $t6 := move($t1) 5: TestPackref::test2($t5, $t6) 6: return () } [variant baseline] fun TestPackref::test4(): TestPackref::R { var $t0|r: TestPackref::R var $t1|r_ref: &mut TestPackref::R var $t2: u64 var $t3: TestPackref::R var $t4: &mut TestPackref::R var $t5: &mut TestPackref::R var $t6: u64 var $t7: TestPackref::R 0: $t2 := 3 1: $t3 := pack TestPackref::R($t2) 2: $t0 := $t3 3: $t4 := borrow_local($t0) 4: $t1 := $t4 5: $t5 := move($t1) 6: $t6 := 0 7: TestPackref::test3($t5, $t6) 8: $t7 := move($t0) 9: return $t7 } [variant baseline] public fun TestPackref::test5($t0|r_ref: &mut TestPackref::R): &mut u64 { var $t1: &mut TestPackref::R var $t2: &mut u64 0: $t1 := move($t0) 1: $t2 := borrow_field.x($t1) 2: return $t2 } [variant baseline] fun TestPackref::test6(): TestPackref::R { var $t0|r: TestPackref::R var $t1|r_ref: &mut TestPackref::R var $t2|x_ref: &mut u64 var $t3: u64 var $t4: TestPackref::R var $t5: &mut TestPackref::R var $t6: &mut TestPackref::R var $t7: &mut u64 var $t8: &mut u64 var $t9: u64 var $t10: TestPackref::R 0: $t3 := 3 1: $t4 := pack TestPackref::R($t3) 2: $t0 := $t4 3: $t5 := borrow_local($t0) 4: $t1 := $t5 5: $t6 := move($t1) 6: $t7 := TestPackref::test5($t6) 7: $t2 := $t7 8: $t8 := move($t2) 9: $t9 := 0 10: TestPackref::test2($t8, $t9) 11: $t10 := move($t0) 12: return $t10 } [variant baseline] fun TestPackref::test7($t0|b: bool) { var $t1|r1: TestPackref::R var $t2|r2: TestPackref::R var $t3|r_ref: &mut TestPackref::R var $t4: u64 var $t5: TestPackref::R var $t6: u64 var $t7: TestPackref::R var $t8: &mut TestPackref::R var $t9: bool var $t10: &mut TestPackref::R var $t11: &mut TestPackref::R var $t12: &mut TestPackref::R var $t13: u64 0: $t4 := 3 1: $t5 := pack TestPackref::R($t4) 2: $t1 := $t5 3: $t6 := 4 4: $t7 := pack TestPackref::R($t6) 5: $t2 := $t7 6: $t8 := borrow_local($t1) 7: $t3 := $t8 8: $t9 := move($t0) 9: if ($t9) goto 10 else goto 16 10: label L0 11: $t10 := move($t3) 12: destroy($t10) 13: $t11 := borrow_local($t2) 14: $t3 := $t11 15: goto 16 16: label L2 17: $t12 := move($t3) 18: $t13 := 0 19: TestPackref::test3($t12, $t13) 20: return () } [variant baseline] fun TestPackref::test8($t0|b: bool, $t1|n: u64, $t2|r_ref: &mut TestPackref::R) { var $t3|r1: TestPackref::R var $t4|r2: TestPackref::R var $t5|t_ref: &mut TestPackref::R var $t6: u64 var $t7: TestPackref::R var $t8: u64 var $t9: TestPackref::R var $t10: &mut TestPackref::R var $t11: u64 var $t12: u64 var $t13: bool var $t14: &mut TestPackref::R var $t15: u64 var $t16: u64 var $t17: u64 var $t18: u64 var $t19: bool var $t20: &mut TestPackref::R var $t21: &mut TestPackref::R var $t22: u64 var $t23: u64 var $t24: u64 var $t25: bool var $t26: &mut TestPackref::R var $t27: &mut TestPackref::R var $t28: u64 var $t29: &mut TestPackref::R var $t30: &mut TestPackref::R var $t31: u64 0: $t6 := 3 1: $t7 := pack TestPackref::R($t6) 2: $t3 := $t7 3: $t8 := 4 4: $t9 := pack TestPackref::R($t8) 5: $t4 := $t9 6: $t10 := borrow_local($t4) 7: $t5 := $t10 8: goto 9 9: label L7 10: $t11 := 0 11: $t12 := copy($t1) 12: $t13 := <($t11, $t12) 13: if ($t13) goto 14 else goto 37 14: label L0 15: $t14 := move($t5) 16: destroy($t14) 17: $t15 := copy($t1) 18: $t16 := 2 19: $t17 := /($t15, $t16) 20: $t18 := 0 21: $t19 := ==($t17, $t18) 22: if ($t19) goto 23 else goto 27 23: label L3 24: $t20 := borrow_local($t3) 25: $t5 := $t20 26: goto 31 27: label L5 28: $t21 := borrow_local($t4) 29: $t5 := $t21 30: goto 31 31: label L6 32: $t22 := move($t1) 33: $t23 := 1 34: $t24 := -($t22, $t23) 35: $t1 := $t24 36: goto 9 37: label L2 38: $t25 := move($t0) 39: if ($t25) goto 40 else goto 47 40: label L8 41: $t26 := move($t5) 42: destroy($t26) 43: $t27 := move($t2) 44: $t28 := 0 45: TestPackref::test3($t27, $t28) 46: goto 54 47: label L10 48: $t29 := move($t2) 49: destroy($t29) 50: $t30 := move($t5) 51: $t31 := 0 52: TestPackref::test3($t30, $t31) 53: goto 54 54: label L11 55: return () } ============ after pipeline `memory_instr` ================ [variant baseline] fun TestPackref::test1(): TestPackref::R { var $t0|r: TestPackref::R var $t1|r_ref: &mut TestPackref::R var $t2|x_ref: &mut u64 var $t3: u64 var $t4: &mut TestPackref::R var $t5: &mut u64 var $t6: u64 var $t7: TestPackref::R 0: $t3 := 3 1: $t0 := pack TestPackref::R($t3) 2: $t4 := borrow_local($t0) 3: $t5 := borrow_field.x($t4) 4: $t6 := 0 5: write_ref($t5, $t6) 6: write_back[Reference($t4).x (u64)]($t5) 7: write_back[LocalRoot($t0)@]($t4) 8: trace_local[r]($t0) 9: $t7 := move($t0) 10: return $t7 } [variant baseline] fun TestPackref::test2($t0|x_ref: &mut u64, $t1|v: u64) { 0: write_ref($t0, $t1) 1: trace_local[x_ref]($t0) 2: return () } [variant baseline] public fun TestPackref::test3($t0|r_ref: &mut TestPackref::R, $t1|v: u64) { var $t2|x_ref: &mut u64 var $t3: &mut u64 0: $t3 := borrow_field.x($t0) 1: TestPackref::test2($t3, $t1) 2: write_back[Reference($t0).x (u64)]($t3) 3: trace_local[r_ref]($t0) 4: trace_local[r_ref]($t0) 5: return () } [variant baseline] fun TestPackref::test4(): TestPackref::R { var $t0|r: TestPackref::R var $t1|r_ref: &mut TestPackref::R var $t2: u64 var $t3: &mut TestPackref::R var $t4: u64 var $t5: TestPackref::R 0: $t2 := 3 1: $t0 := pack TestPackref::R($t2) 2: $t3 := borrow_local($t0) 3: $t4 := 0 4: TestPackref::test3($t3, $t4) 5: write_back[LocalRoot($t0)@]($t3) 6: trace_local[r]($t0) 7: $t5 := move($t0) 8: return $t5 } [variant baseline] public fun TestPackref::test5($t0|r_ref: &mut TestPackref::R): &mut u64 { var $t1: &mut u64 0: $t1 := borrow_field.x($t0) 1: trace_local[r_ref]($t0) 2: write_back[Reference($t0).x (u64)]($t1) 3: trace_local[r_ref]($t0) 4: return $t1 } [variant baseline] fun TestPackref::test6(): TestPackref::R { var $t0|r: TestPackref::R var $t1|r_ref: &mut TestPackref::R var $t2|x_ref: &mut u64 var $t3: u64 var $t4: &mut TestPackref::R var $t5: &mut u64 var $t6: u64 var $t7: TestPackref::R 0: $t3 := 3 1: $t0 := pack TestPackref::R($t3) 2: $t4 := borrow_local($t0) 3: $t5 := TestPackref::test5($t4) 4: $t6 := 0 5: TestPackref::test2($t5, $t6) 6: write_back[Reference($t4).x (u64)]($t5) 7: write_back[LocalRoot($t0)@]($t4) 8: trace_local[r]($t0) 9: $t7 := move($t0) 10: return $t7 } [variant baseline] fun TestPackref::test7($t0|b: bool) { var $t1|r1: TestPackref::R var $t2|r2: TestPackref::R var $t3|r_ref: &mut TestPackref::R var $t4: u64 var $t5: u64 var $t6: &mut TestPackref::R var $t7: &mut TestPackref::R var $t8: u64 var $t9: bool var $t10: bool 0: $t4 := 3 1: $t1 := pack TestPackref::R($t4) 2: $t5 := 4 3: $t2 := pack TestPackref::R($t5) 4: $t6 := borrow_local($t1) 5: $t3 := $t6 6: if ($t0) goto 31 else goto 35 7: label L0 8: write_back[LocalRoot($t1)@]($t6) 9: trace_local[r1]($t1) 10: destroy($t6) 11: $t7 := borrow_local($t2) 12: $t3 := $t7 13: label L2 14: $t8 := 0 15: TestPackref::test3($t3, $t8) 16: $t9 := is_parent[Reference($t6)@]($t3) 17: if ($t9) goto 18 else goto 22 18: label L5 19: write_back[Reference($t6)@]($t3) 20: write_back[LocalRoot($t1)@]($t6) 21: trace_local[r1]($t1) 22: label L6 23: $t10 := is_parent[Reference($t7)@]($t3) 24: if ($t10) goto 25 else goto 29 25: label L7 26: write_back[Reference($t7)@]($t3) 27: write_back[LocalRoot($t2)@]($t7) 28: trace_local[r2]($t2) 29: label L8 30: return () 31: label L3 32: write_back[Reference($t6)@]($t3) 33: destroy($t3) 34: goto 7 35: label L4 36: destroy($t6) 37: goto 13 } [variant baseline] fun TestPackref::test8($t0|b: bool, $t1|n: u64, $t2|r_ref: &mut TestPackref::R) { var $t3|r1: TestPackref::R var $t4|r2: TestPackref::R var $t5|t_ref: &mut TestPackref::R var $t6: u64 var $t7: u64 var $t8: &mut TestPackref::R var $t9: u64 var $t10: bool var $t11: u64 var $t12: u64 var $t13: u64 var $t14: bool var $t15: &mut TestPackref::R var $t16: &mut TestPackref::R var $t17: u64 var $t18: u64 var $t19: u64 var $t20: bool var $t21: bool var $t22: bool var $t23: bool var $t24: bool var $t25: bool var $t26: bool var $t27: bool var $t28: bool 0: $t6 := 3 1: $t3 := pack TestPackref::R($t6) 2: $t7 := 4 3: $t4 := pack TestPackref::R($t7) 4: $t8 := borrow_local($t4) 5: $t5 := $t8 6: label L7 7: $t9 := 0 8: $t10 := <($t9, $t1) 9: if ($t10) goto 10 else goto 49 10: label L0 11: $t20 := is_parent[Reference($t8)@]($t5) 12: if ($t20) goto 13 else goto 17 13: label L12 14: write_back[Reference($t8)@]($t5) 15: write_back[LocalRoot($t4)@]($t8) 16: trace_local[r2]($t4) 17: label L13 18: $t21 := is_parent[Reference($t15)@]($t5) 19: if ($t21) goto 20 else goto 24 20: label L14 21: write_back[Reference($t15)@]($t5) 22: write_back[LocalRoot($t3)@]($t15) 23: trace_local[r1]($t3) 24: label L15 25: $t22 := is_parent[Reference($t16)@]($t5) 26: if ($t22) goto 27 else goto 31 27: label L16 28: write_back[Reference($t16)@]($t5) 29: write_back[LocalRoot($t4)@]($t16) 30: trace_local[r2]($t4) 31: label L17 32: destroy($t5) 33: $t11 := 2 34: $t12 := /($t1, $t11) 35: $t13 := 0 36: $t14 := ==($t12, $t13) 37: if ($t14) goto 38 else goto 42 38: label L3 39: $t15 := borrow_local($t3) 40: $t5 := $t15 41: goto 45 42: label L5 43: $t16 := borrow_local($t4) 44: $t5 := $t16 45: label L6 46: $t17 := 1 47: $t1 := -($t1, $t17) 48: goto 6 49: label L2 50: if ($t0) goto 51 else goto 77 51: label L8 52: $t23 := is_parent[Reference($t8)@]($t5) 53: if ($t23) goto 54 else goto 58 54: label L18 55: write_back[Reference($t8)@]($t5) 56: write_back[LocalRoot($t4)@]($t8) 57: trace_local[r2]($t4) 58: label L19 59: $t24 := is_parent[Reference($t15)@]($t5) 60: if ($t24) goto 61 else goto 65 61: label L20 62: write_back[Reference($t15)@]($t5) 63: write_back[LocalRoot($t3)@]($t15) 64: trace_local[r1]($t3) 65: label L21 66: $t25 := is_parent[Reference($t16)@]($t5) 67: if ($t25) goto 68 else goto 72 68: label L22 69: write_back[Reference($t16)@]($t5) 70: write_back[LocalRoot($t4)@]($t16) 71: trace_local[r2]($t4) 72: label L23 73: destroy($t5) 74: $t18 := 0 75: TestPackref::test3($t2, $t18) 76: goto 102 77: label L10 78: destroy($t2) 79: $t19 := 0 80: TestPackref::test3($t5, $t19) 81: $t26 := is_parent[Reference($t8)@]($t5) 82: if ($t26) goto 83 else goto 87 83: label L24 84: write_back[Reference($t8)@]($t5) 85: write_back[LocalRoot($t4)@]($t8) 86: trace_local[r2]($t4) 87: label L25 88: $t27 := is_parent[Reference($t15)@]($t5) 89: if ($t27) goto 90 else goto 94 90: label L26 91: write_back[Reference($t15)@]($t5) 92: write_back[LocalRoot($t3)@]($t15) 93: trace_local[r1]($t3) 94: label L27 95: $t28 := is_parent[Reference($t16)@]($t5) 96: if ($t28) goto 97 else goto 101 97: label L28 98: write_back[Reference($t16)@]($t5) 99: write_back[LocalRoot($t4)@]($t16) 100: trace_local[r2]($t4) 101: label L29 102: label L11 103: trace_local[r_ref]($t2) 104: return () }