diff --git a/compiler/forget/src/__tests__/fixtures/compiler/_bug.inner-memo-value-not-promoted-to-outer-scope-dynamic.expect.md b/compiler/forget/src/__tests__/fixtures/compiler/_bug.inner-memo-value-not-promoted-to-outer-scope-dynamic.expect.md
new file mode 100644
index 0000000000..03af913e61
--- /dev/null
+++ b/compiler/forget/src/__tests__/fixtures/compiler/_bug.inner-memo-value-not-promoted-to-outer-scope-dynamic.expect.md
@@ -0,0 +1,127 @@
+
+## Input
+
+```javascript
+function Component(props) {
+ const item = useFragment(FRAGMENT, props.item);
+ useFreeze(item);
+
+ const count = new MaybeMutable(item);
+ return (
+
+
+ {Text}
+ {{maybeMutate(count)}}
+
+
+ );
+}
+
+```
+
+## Code
+
+```javascript
+import * as React from "react";
+function Component(props) {
+ const $ = React.unstable_useMemoCache(21);
+ const item = useFragment(FRAGMENT, props.item);
+ useFreeze(item);
+ const c_0 = $[0] !== item;
+ let t1;
+ let t2;
+ let t3;
+ let t4;
+ let t5;
+ let t6;
+ let t7;
+ if (c_0) {
+ const count = new MaybeMutable(item);
+
+ t6 = View;
+ t7 = "\n ";
+ t3 = View;
+ t4 = "\n ";
+ let t0;
+ if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
+ t0 = Text;
+ $[8] = t0;
+ } else {
+ t0 = $[8];
+ }
+ t5 = "\n ";
+ t1 = "span";
+ t2 = maybeMutate(count);
+ $[0] = item;
+ $[1] = t1;
+ $[2] = t2;
+ $[3] = t3;
+ $[4] = t4;
+ $[5] = t5;
+ $[6] = t6;
+ $[7] = t7;
+ } else {
+ t1 = $[1];
+ t2 = $[2];
+ t3 = $[3];
+ t4 = $[4];
+ t5 = $[5];
+ t6 = $[6];
+ t7 = $[7];
+ }
+ const c_9 = $[9] !== t1;
+ const c_10 = $[10] !== t2;
+ let t8;
+ if (c_9 || c_10) {
+ t8 = {t2};
+ $[9] = t1;
+ $[10] = t2;
+ $[11] = t8;
+ } else {
+ t8 = $[11];
+ }
+ const c_12 = $[12] !== t3;
+ const c_13 = $[13] !== t4;
+ const c_14 = $[14] !== t5;
+ const c_15 = $[15] !== t8;
+ let t9;
+ if (c_12 || c_13 || c_14 || c_15) {
+ t9 = (
+
+ {t4}
+ {t0}
+ {t5}
+ {t8}
+
+ );
+ $[12] = t3;
+ $[13] = t4;
+ $[14] = t5;
+ $[15] = t8;
+ $[16] = t9;
+ } else {
+ t9 = $[16];
+ }
+ const c_17 = $[17] !== t6;
+ const c_18 = $[18] !== t7;
+ const c_19 = $[19] !== t9;
+ let t10;
+ if (c_17 || c_18 || c_19) {
+ t10 = (
+
+ {t7}
+ {t9}
+
+ );
+ $[17] = t6;
+ $[18] = t7;
+ $[19] = t9;
+ $[20] = t10;
+ } else {
+ t10 = $[20];
+ }
+ return t10;
+}
+
+```
+
\ No newline at end of file
diff --git a/compiler/forget/src/__tests__/fixtures/compiler/_bug.inner-memo-value-not-promoted-to-outer-scope-dynamic.js b/compiler/forget/src/__tests__/fixtures/compiler/_bug.inner-memo-value-not-promoted-to-outer-scope-dynamic.js
new file mode 100644
index 0000000000..dc36d75464
--- /dev/null
+++ b/compiler/forget/src/__tests__/fixtures/compiler/_bug.inner-memo-value-not-promoted-to-outer-scope-dynamic.js
@@ -0,0 +1,14 @@
+function Component(props) {
+ const item = useFragment(FRAGMENT, props.item);
+ useFreeze(item);
+
+ const count = new MaybeMutable(item);
+ return (
+
+
+ {Text}
+ {{maybeMutate(count)}}
+
+
+ );
+}
diff --git a/compiler/forget/src/__tests__/fixtures/compiler/_bug.inner-memo-value-not-promoted-to-outer-scope-static.expect.md b/compiler/forget/src/__tests__/fixtures/compiler/_bug.inner-memo-value-not-promoted-to-outer-scope-static.expect.md
new file mode 100644
index 0000000000..193962c826
--- /dev/null
+++ b/compiler/forget/src/__tests__/fixtures/compiler/_bug.inner-memo-value-not-promoted-to-outer-scope-static.expect.md
@@ -0,0 +1,102 @@
+
+## Input
+
+```javascript
+function Component(props) {
+ const count = new MaybeMutable();
+ return (
+
+
+ {Text}
+ {{maybeMutate(count)}}
+
+
+ );
+}
+
+```
+
+## Code
+
+```javascript
+import * as React from "react";
+function Component(props) {
+ const $ = React.unstable_useMemoCache(11);
+ let t1;
+ let t2;
+ let t3;
+ let t4;
+ let t5;
+ let t6;
+ let t7;
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
+ const count = new MaybeMutable();
+
+ t6 = View;
+ t7 = "\n ";
+ t3 = View;
+ t4 = "\n ";
+ let t0;
+ if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
+ t0 = Text;
+ $[7] = t0;
+ } else {
+ t0 = $[7];
+ }
+ t5 = "\n ";
+ t1 = "span";
+ t2 = maybeMutate(count);
+ $[0] = t1;
+ $[1] = t2;
+ $[2] = t3;
+ $[3] = t4;
+ $[4] = t5;
+ $[5] = t6;
+ $[6] = t7;
+ } else {
+ t1 = $[0];
+ t2 = $[1];
+ t3 = $[2];
+ t4 = $[3];
+ t5 = $[4];
+ t6 = $[5];
+ t7 = $[6];
+ }
+ let t8;
+ if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
+ t8 = {t2};
+ $[8] = t8;
+ } else {
+ t8 = $[8];
+ }
+ let t9;
+ if ($[9] === Symbol.for("react.memo_cache_sentinel")) {
+ t9 = (
+
+ {t4}
+ {t0}
+ {t5}
+ {t8}
+
+ );
+ $[9] = t9;
+ } else {
+ t9 = $[9];
+ }
+ let t10;
+ if ($[10] === Symbol.for("react.memo_cache_sentinel")) {
+ t10 = (
+
+ {t7}
+ {t9}
+
+ );
+ $[10] = t10;
+ } else {
+ t10 = $[10];
+ }
+ return t10;
+}
+
+```
+
\ No newline at end of file
diff --git a/compiler/forget/src/__tests__/fixtures/compiler/_bug.inner-memo-value-not-promoted-to-outer-scope-static.js b/compiler/forget/src/__tests__/fixtures/compiler/_bug.inner-memo-value-not-promoted-to-outer-scope-static.js
new file mode 100644
index 0000000000..5c92f8bcf5
--- /dev/null
+++ b/compiler/forget/src/__tests__/fixtures/compiler/_bug.inner-memo-value-not-promoted-to-outer-scope-static.js
@@ -0,0 +1,11 @@
+function Component(props) {
+ const count = new MaybeMutable();
+ return (
+
+
+ {Text}
+ {{maybeMutate(count)}}
+
+
+ );
+}