diff --git a/ext/opcache/jit/zend_jit_ir.c b/ext/opcache/jit/zend_jit_ir.c index 92a068dbfaca..bbadfc62b76e 100644 --- a/ext/opcache/jit/zend_jit_ir.c +++ b/ext/opcache/jit/zend_jit_ir.c @@ -6276,6 +6276,13 @@ static int zend_jit_assign_op(zend_jit_ctx *jit, ir_ref if_op1_typed = IR_UNUSED; binary_op_type binary_op = get_binary_op(opline->extended_value); + if (Z_MODE(op2_addr) == IS_REG + && Z_LOAD(op2_addr) + && jit->ra[Z_SSA_VAR(op2_addr)].ref == IR_NULL) { + /* Force load, so that the register is defined on all paths */ + zend_jit_use_reg(jit, op2_addr); + } + ref = jit_ZVAL_ADDR(jit, op1_addr); if_op1_ref = jit_if_Z_TYPE_ref(jit, ref, ir_CONST_U8(IS_REFERENCE)); ir_IF_FALSE(if_op1_ref); diff --git a/ext/opcache/tests/jit/gh24386.phpt b/ext/opcache/tests/jit/gh24386.phpt new file mode 100644 index 000000000000..cbf540b6bab5 --- /dev/null +++ b/ext/opcache/tests/jit/gh24386.phpt @@ -0,0 +1,34 @@ +--TEST-- +GH-24386 (register operand must be loaded before the typed reference check) +--EXTENSIONS-- +opcache +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.jit=tracing +opcache.jit_hot_func=2 +--FILE-- +prop; +f(3); +var_dump($c->prop, $h); +?> +--EXPECT-- +int(2) +int(2) +int(3) +int(5)