diff --git a/Zend/Optimizer/block_pass.c b/Zend/Optimizer/block_pass.c index 52375c252fe..ccdaeafe76b 100644 --- a/Zend/Optimizer/block_pass.c +++ b/Zend/Optimizer/block_pass.c @@ -174,8 +174,10 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array && opline->opcode != ZEND_MATCH && zend_optimizer_update_op1_const(op_array, opline, &c)) { VAR_SOURCE(op1) = NULL; - literal_dtor(&ZEND_OP1_LITERAL(src)); - MAKE_NOP(src); + if (!zend_bitset_in(used_ext, VAR_NUM(src->result.var))) { + literal_dtor(&ZEND_OP1_LITERAL(src)); + MAKE_NOP(src); + } ++(*opt_count); } else { zval_ptr_dtor_nogc(&c); @@ -197,8 +199,10 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array ZVAL_COPY(&c, &ZEND_OP1_LITERAL(src)); if (zend_optimizer_update_op2_const(op_array, opline, &c)) { VAR_SOURCE(op2) = NULL; - literal_dtor(&ZEND_OP1_LITERAL(src)); - MAKE_NOP(src); + if (!zend_bitset_in(used_ext, VAR_NUM(src->result.var))) { + literal_dtor(&ZEND_OP1_LITERAL(src)); + MAKE_NOP(src); + } ++(*opt_count); } else { zval_ptr_dtor_nogc(&c); diff --git a/ext/opcache/tests/opt/block_pass_004.phpt b/ext/opcache/tests/opt/block_pass_004.phpt new file mode 100644 index 00000000000..6557d508372 --- /dev/null +++ b/ext/opcache/tests/opt/block_pass_004.phpt @@ -0,0 +1,16 @@ +--TEST-- +Block Pass 004: Inorrect QM_ASSIGN elimination +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.optimization_level=-1 +--EXTENSIONS-- +opcache +--FILE-- +y; +?> +DONE +--EXPECTF-- +Warning: Attempt to read property "y" on int in %sblock_pass_004.php on line 2 +DONE