Commit 4bf483fa881 for php
commit 4bf483fa8814984a7dee7df24ea77f87533e7808
Author: ndossche <7771979+ndossche@users.noreply.github.com>
Date: Tue Sep 29 00:02:52 2026 +0200
Fix property hook escape analysis causing misoptimization
Co-authored-by: Arnaud Le Blanc <365207+arnaud-lb@users.noreply.github.com>
diff --git a/Zend/Optimizer/escape_analysis.c b/Zend/Optimizer/escape_analysis.c
index 0287da7286f..3c2864d14fb 100644
--- a/Zend/Optimizer/escape_analysis.c
+++ b/Zend/Optimizer/escape_analysis.c
@@ -174,6 +174,7 @@ static bool is_allocation_def(zend_op_array *op_array, zend_ssa *ssa, int def, i
&& !ce->__get
&& !ce->__set
&& !ce->__isset
+ && !ce->num_hooked_props
&& !(ce->ce_flags & forbidden_flags)
&& (ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
return 1;
@@ -244,6 +245,7 @@ static bool is_local_def(zend_op_array *op_array, zend_ssa *ssa, int def, int va
&& !ce->__get
&& !ce->__set
&& !ce->__isset
+ && !ce->num_hooked_props
&& !ce->parent) {
return 1;
}
diff --git a/ext/opcache/tests/opt/dce_017.phpt b/ext/opcache/tests/opt/dce_017.phpt
new file mode 100644
index 00000000000..0cf8ad9bf36
--- /dev/null
+++ b/ext/opcache/tests/opt/dce_017.phpt
@@ -0,0 +1,55 @@
+--TEST--
+DCE must not remove assignments to properties of an object escaping through a property hook
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+opcache.file_update_protection=0
+--EXTENSIONS--
+opcache
+--FILE--
+<?php
+
+class D {
+ public $x = 0;
+ public $h {
+ get {
+ global $g;
+ $g = $this;
+ return 1;
+ }
+ }
+}
+
+function g() {
+ $o = new D;
+ $o->h;
+ $o->x = 42;
+}
+
+g();
+var_dump($g->x);
+
+class E {
+ public $x = 0;
+ public $h {
+ set {
+ global $g;
+ $g = $this;
+ }
+ }
+}
+
+function h() {
+ $o = new E;
+ $o->h = 1;
+ $o->x = 42;
+}
+
+h();
+var_dump($g->x);
+
+?>
+--EXPECT--
+int(42)
+int(42)