============ initial translation from Move ================ [variant baseline] fun TestEliminateMutRefs::test1(): TestEliminateMutRefs::R { var $t0|r: TestEliminateMutRefs::R var $t1|r_ref: &mut TestEliminateMutRefs::R var $t2|x_ref: &mut u64 var $t3: u64 var $t4: TestEliminateMutRefs::R var $t5: &mut TestEliminateMutRefs::R var $t6: &mut TestEliminateMutRefs::R var $t7: &mut u64 var $t8: u64 var $t9: &mut u64 var $t10: TestEliminateMutRefs::R 0: $t3 := 3 1: $t4 := pack TestEliminateMutRefs::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 TestEliminateMutRefs::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 TestEliminateMutRefs::test3($t0|r_ref: &mut TestEliminateMutRefs::R, $t1|v: u64) { var $t2|x_ref: &mut u64 var $t3: &mut TestEliminateMutRefs::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: TestEliminateMutRefs::test2($t5, $t6) 6: return () } [variant baseline] fun TestEliminateMutRefs::test4(): TestEliminateMutRefs::R { var $t0|r: TestEliminateMutRefs::R var $t1|r_ref: &mut TestEliminateMutRefs::R var $t2: u64 var $t3: TestEliminateMutRefs::R var $t4: &mut TestEliminateMutRefs::R var $t5: &mut TestEliminateMutRefs::R var $t6: u64 var $t7: TestEliminateMutRefs::R 0: $t2 := 3 1: $t3 := pack TestEliminateMutRefs::R($t2) 2: $t0 := $t3 3: $t4 := borrow_local($t0) 4: $t1 := $t4 5: $t5 := move($t1) 6: $t6 := 0 7: TestEliminateMutRefs::test3($t5, $t6) 8: $t7 := move($t0) 9: return $t7 } [variant baseline] public fun TestEliminateMutRefs::test5($t0|r_ref: &mut TestEliminateMutRefs::R): &mut u64 { var $t1: &mut TestEliminateMutRefs::R var $t2: &mut u64 0: $t1 := move($t0) 1: $t2 := borrow_field.x($t1) 2: return $t2 } [variant baseline] fun TestEliminateMutRefs::test6(): TestEliminateMutRefs::R { var $t0|r: TestEliminateMutRefs::R var $t1|r_ref: &mut TestEliminateMutRefs::R var $t2|x_ref: &mut u64 var $t3: u64 var $t4: TestEliminateMutRefs::R var $t5: &mut TestEliminateMutRefs::R var $t6: &mut TestEliminateMutRefs::R var $t7: &mut u64 var $t8: &mut u64 var $t9: u64 var $t10: TestEliminateMutRefs::R 0: $t3 := 3 1: $t4 := pack TestEliminateMutRefs::R($t3) 2: $t0 := $t4 3: $t5 := borrow_local($t0) 4: $t1 := $t5 5: $t6 := move($t1) 6: $t7 := TestEliminateMutRefs::test5($t6) 7: $t2 := $t7 8: $t8 := move($t2) 9: $t9 := 0 10: TestEliminateMutRefs::test2($t8, $t9) 11: $t10 := move($t0) 12: return $t10 } [variant baseline] fun TestEliminateMutRefs::test7($t0|b: bool) { var $t1|r1: TestEliminateMutRefs::R var $t2|r2: TestEliminateMutRefs::R var $t3|r_ref: &mut TestEliminateMutRefs::R var $t4: u64 var $t5: TestEliminateMutRefs::R var $t6: u64 var $t7: TestEliminateMutRefs::R var $t8: &mut TestEliminateMutRefs::R var $t9: bool var $t10: &mut TestEliminateMutRefs::R var $t11: &mut TestEliminateMutRefs::R var $t12: &mut TestEliminateMutRefs::R var $t13: u64 0: $t4 := 3 1: $t5 := pack TestEliminateMutRefs::R($t4) 2: $t1 := $t5 3: $t6 := 4 4: $t7 := pack TestEliminateMutRefs::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: TestEliminateMutRefs::test3($t12, $t13) 20: return () } [variant baseline] fun TestEliminateMutRefs::test8($t0|b: bool, $t1|n: u64, $t2|r_ref: &mut TestEliminateMutRefs::R) { var $t3|r1: TestEliminateMutRefs::R var $t4|r2: TestEliminateMutRefs::R var $t5|t_ref: &mut TestEliminateMutRefs::R var $t6: u64 var $t7: TestEliminateMutRefs::R var $t8: u64 var $t9: TestEliminateMutRefs::R var $t10: &mut TestEliminateMutRefs::R var $t11: u64 var $t12: u64 var $t13: bool var $t14: &mut TestEliminateMutRefs::R var $t15: u64 var $t16: u64 var $t17: u64 var $t18: u64 var $t19: bool var $t20: &mut TestEliminateMutRefs::R var $t21: &mut TestEliminateMutRefs::R var $t22: u64 var $t23: u64 var $t24: u64 var $t25: bool var $t26: &mut TestEliminateMutRefs::R var $t27: &mut TestEliminateMutRefs::R var $t28: u64 var $t29: &mut TestEliminateMutRefs::R var $t30: &mut TestEliminateMutRefs::R var $t31: u64 0: $t6 := 3 1: $t7 := pack TestEliminateMutRefs::R($t6) 2: $t3 := $t7 3: $t8 := 4 4: $t9 := pack TestEliminateMutRefs::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: TestEliminateMutRefs::test3($t27, $t28) 46: goto 54 47: label L10 48: $t29 := move($t2) 49: destroy($t29) 50: $t30 := move($t5) 51: $t31 := 0 52: TestEliminateMutRefs::test3($t30, $t31) 53: goto 54 54: label L11 55: return () } ============ after pipeline `mut_ref_instrumentation` ================ [variant baseline] fun TestEliminateMutRefs::test1(): TestEliminateMutRefs::R { var $t0|r: TestEliminateMutRefs::R var $t1|r_ref: &mut TestEliminateMutRefs::R var $t2|x_ref: &mut u64 var $t3: u64 var $t4: TestEliminateMutRefs::R var $t5: &mut TestEliminateMutRefs::R var $t6: &mut TestEliminateMutRefs::R var $t7: &mut u64 var $t8: u64 var $t9: &mut u64 var $t10: TestEliminateMutRefs::R 0: $t3 := 3 1: $t4 := pack TestEliminateMutRefs::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 TestEliminateMutRefs::test2($t0|x_ref: &mut u64, $t1|v: u64) { var $t2: u64 var $t3: &mut u64 0: $t2 := move($t1) 1: $t3 := copy($t0) 2: write_ref($t3, $t2) 3: trace_local[x_ref]($t0) 4: return () } [variant baseline] public fun TestEliminateMutRefs::test3($t0|r_ref: &mut TestEliminateMutRefs::R, $t1|v: u64) { var $t2|x_ref: &mut u64 var $t3: &mut TestEliminateMutRefs::R var $t4: &mut u64 var $t5: &mut u64 var $t6: u64 0: $t3 := copy($t0) 1: $t4 := borrow_field.x($t3) 2: $t2 := $t4 3: $t5 := move($t2) 4: $t6 := move($t1) 5: TestEliminateMutRefs::test2($t5, $t6) 6: trace_local[r_ref]($t0) 7: return () } [variant baseline] fun TestEliminateMutRefs::test4(): TestEliminateMutRefs::R { var $t0|r: TestEliminateMutRefs::R var $t1|r_ref: &mut TestEliminateMutRefs::R var $t2: u64 var $t3: TestEliminateMutRefs::R var $t4: &mut TestEliminateMutRefs::R var $t5: &mut TestEliminateMutRefs::R var $t6: u64 var $t7: TestEliminateMutRefs::R 0: $t2 := 3 1: $t3 := pack TestEliminateMutRefs::R($t2) 2: $t0 := $t3 3: $t4 := borrow_local($t0) 4: $t1 := $t4 5: $t5 := move($t1) 6: $t6 := 0 7: TestEliminateMutRefs::test3($t5, $t6) 8: $t7 := move($t0) 9: return $t7 } [variant baseline] public fun TestEliminateMutRefs::test5($t0|r_ref: &mut TestEliminateMutRefs::R): &mut u64 { var $t1: &mut TestEliminateMutRefs::R var $t2: &mut u64 0: $t1 := copy($t0) 1: $t2 := borrow_field.x($t1) 2: trace_local[r_ref]($t0) 3: return $t2 } [variant baseline] fun TestEliminateMutRefs::test6(): TestEliminateMutRefs::R { var $t0|r: TestEliminateMutRefs::R var $t1|r_ref: &mut TestEliminateMutRefs::R var $t2|x_ref: &mut u64 var $t3: u64 var $t4: TestEliminateMutRefs::R var $t5: &mut TestEliminateMutRefs::R var $t6: &mut TestEliminateMutRefs::R var $t7: &mut u64 var $t8: &mut u64 var $t9: u64 var $t10: TestEliminateMutRefs::R 0: $t3 := 3 1: $t4 := pack TestEliminateMutRefs::R($t3) 2: $t0 := $t4 3: $t5 := borrow_local($t0) 4: $t1 := $t5 5: $t6 := move($t1) 6: $t7 := TestEliminateMutRefs::test5($t6) 7: $t2 := $t7 8: $t8 := move($t2) 9: $t9 := 0 10: TestEliminateMutRefs::test2($t8, $t9) 11: $t10 := move($t0) 12: return $t10 } [variant baseline] fun TestEliminateMutRefs::test7($t0|b: bool) { var $t1|r1: TestEliminateMutRefs::R var $t2|r2: TestEliminateMutRefs::R var $t3|r_ref: &mut TestEliminateMutRefs::R var $t4: u64 var $t5: TestEliminateMutRefs::R var $t6: u64 var $t7: TestEliminateMutRefs::R var $t8: &mut TestEliminateMutRefs::R var $t9: bool var $t10: &mut TestEliminateMutRefs::R var $t11: &mut TestEliminateMutRefs::R var $t12: &mut TestEliminateMutRefs::R var $t13: u64 0: $t4 := 3 1: $t5 := pack TestEliminateMutRefs::R($t4) 2: $t1 := $t5 3: $t6 := 4 4: $t7 := pack TestEliminateMutRefs::R($t6) 5: $t2 := $t7 6: $t8 := borrow_local($t1) 7: $t3 := $t8 8: $t9 := move($t0) 9: if ($t9) goto 10 else goto 15 10: label L0 11: $t10 := move($t3) 12: destroy($t10) 13: $t11 := borrow_local($t2) 14: $t3 := $t11 15: label L2 16: $t12 := move($t3) 17: $t13 := 0 18: TestEliminateMutRefs::test3($t12, $t13) 19: return () } [variant baseline] fun TestEliminateMutRefs::test8($t0|b: bool, $t1|n: u64, $t2|r_ref: &mut TestEliminateMutRefs::R) { var $t3|r1: TestEliminateMutRefs::R var $t4|r2: TestEliminateMutRefs::R var $t5|t_ref: &mut TestEliminateMutRefs::R var $t6: u64 var $t7: TestEliminateMutRefs::R var $t8: u64 var $t9: TestEliminateMutRefs::R var $t10: &mut TestEliminateMutRefs::R var $t11: u64 var $t12: u64 var $t13: bool var $t14: &mut TestEliminateMutRefs::R var $t15: u64 var $t16: u64 var $t17: u64 var $t18: u64 var $t19: bool var $t20: &mut TestEliminateMutRefs::R var $t21: &mut TestEliminateMutRefs::R var $t22: u64 var $t23: u64 var $t24: u64 var $t25: bool var $t26: &mut TestEliminateMutRefs::R var $t27: &mut TestEliminateMutRefs::R var $t28: u64 var $t29: &mut TestEliminateMutRefs::R var $t30: &mut TestEliminateMutRefs::R var $t31: u64 0: $t6 := 3 1: $t7 := pack TestEliminateMutRefs::R($t6) 2: $t3 := $t7 3: $t8 := 4 4: $t9 := pack TestEliminateMutRefs::R($t8) 5: $t4 := $t9 6: $t10 := borrow_local($t4) 7: $t5 := $t10 8: label L7 9: $t11 := 0 10: $t12 := copy($t1) 11: $t13 := <($t11, $t12) 12: if ($t13) goto 13 else goto 35 13: label L0 14: $t14 := move($t5) 15: destroy($t14) 16: $t15 := copy($t1) 17: $t16 := 2 18: $t17 := /($t15, $t16) 19: $t18 := 0 20: $t19 := ==($t17, $t18) 21: if ($t19) goto 22 else goto 26 22: label L3 23: $t20 := borrow_local($t3) 24: $t5 := $t20 25: goto 29 26: label L5 27: $t21 := borrow_local($t4) 28: $t5 := $t21 29: label L6 30: $t22 := move($t1) 31: $t23 := 1 32: $t24 := -($t22, $t23) 33: $t1 := $t24 34: goto 8 35: label L2 36: $t25 := move($t0) 37: if ($t25) goto 38 else goto 45 38: label L8 39: $t26 := move($t5) 40: destroy($t26) 41: $t27 := copy($t2) 42: $t28 := 0 43: TestEliminateMutRefs::test3($t27, $t28) 44: goto 51 45: label L10 46: $t29 := copy($t2) 47: destroy($t29) 48: $t30 := move($t5) 49: $t31 := 0 50: TestEliminateMutRefs::test3($t30, $t31) 51: label L11 52: trace_local[r_ref]($t2) 53: return () }