summaryrefslogtreecommitdiff
path: root/testsuite/tests/asmcomp/lift_mutable_let_flambda.ml
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/asmcomp/lift_mutable_let_flambda.ml')
-rw-r--r--testsuite/tests/asmcomp/lift_mutable_let_flambda.ml29
1 files changed, 29 insertions, 0 deletions
diff --git a/testsuite/tests/asmcomp/lift_mutable_let_flambda.ml b/testsuite/tests/asmcomp/lift_mutable_let_flambda.ml
new file mode 100644
index 0000000000..8c8b017d49
--- /dev/null
+++ b/testsuite/tests/asmcomp/lift_mutable_let_flambda.ml
@@ -0,0 +1,29 @@
+(* TEST
+ * flambda
+ ** native
+*)
+
+type t = T of { pos : int }
+
+let[@inline always] find_pos i =
+ let i = ref i in
+ let pos = !i in
+ T {pos}
+
+let[@inline always] use_pos i =
+ let (T {pos}) = find_pos i in
+ pos * 2
+
+
+let f () =
+ let x0 = Gc.allocated_bytes () in
+ let x1 = Gc.allocated_bytes () in
+
+ let n : int = (Sys.opaque_identity use_pos) 10 in
+
+ let x2 = Gc.allocated_bytes () in
+ assert (n = 20);
+ assert(x1 -. x0 = x2 -. x1) (* check no allocation between x1 and x2 *)
+ [@@inline never]
+
+let () = f ()