Fixed tracing jit for BIND_INIT_STATIC_OR_JMP

This commit is contained in:
Dmitry Stogov 2023-09-05 23:57:38 +03:00
parent bb31a75321
commit 95edb50b58
3 changed files with 46 additions and 0 deletions

View file

@ -3357,6 +3357,12 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), IS_UNKNOWN, 1); SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), IS_UNKNOWN, 1);
} }
break; break;
case ZEND_BIND_INIT_STATIC_OR_JMP:
if (opline->op1_type == IS_CV) {
old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var));
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op1.var), IS_UNKNOWN, 1);
}
break;
} }
if (opline->result_type == IS_VAR || opline->result_type == IS_TMP_VAR) { if (opline->result_type == IS_VAR || opline->result_type == IS_TMP_VAR) {
@ -3376,6 +3382,11 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op2.var), old_info); SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op2.var), old_info);
} }
break; break;
case ZEND_BIND_INIT_STATIC_OR_JMP:
if (opline->op1_type == IS_CV) {
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var), old_info);
}
break;
} }
if (!exit_addr) { if (!exit_addr) {

View file

@ -3710,6 +3710,12 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), IS_UNKNOWN, 1); SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), IS_UNKNOWN, 1);
} }
break; break;
case ZEND_BIND_INIT_STATIC_OR_JMP:
if (opline->op1_type == IS_CV) {
old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var));
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op1.var), IS_UNKNOWN, 1);
}
break;
} }
if (opline->result_type == IS_VAR || opline->result_type == IS_TMP_VAR) { if (opline->result_type == IS_VAR || opline->result_type == IS_TMP_VAR) {
@ -3729,6 +3735,11 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op2.var), old_info); SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op2.var), old_info);
} }
break; break;
case ZEND_BIND_INIT_STATIC_OR_JMP:
if (opline->op1_type == IS_CV) {
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var), old_info);
}
break;
} }
if (!exit_addr) { if (!exit_addr) {

View file

@ -0,0 +1,24 @@
--TEST--
Bind static deoptimization
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.file_update_protection=0
opcache.jit_buffer_size=1M
--FILE--
<?php
function test($n) {
static $x = array(A);
return isset($x[$n]);
}
define("A", 42);
for ($i = 0; $i < 5; $i++) {
var_dump(test(0));
}
?>
--EXPECT--
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)