Skip to content

Commit 95edb50

Browse files
committed
Fixed tracing jit for BIND_INIT_STATIC_OR_JMP
1 parent bb31a75 commit 95edb50

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

+11
Original file line numberDiff line numberDiff line change
@@ -3357,6 +3357,12 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
33573357
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), IS_UNKNOWN, 1);
33583358
}
33593359
break;
3360+
case ZEND_BIND_INIT_STATIC_OR_JMP:
3361+
if (opline->op1_type == IS_CV) {
3362+
old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var));
3363+
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op1.var), IS_UNKNOWN, 1);
3364+
}
3365+
break;
33603366
}
33613367

33623368
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
33763382
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op2.var), old_info);
33773383
}
33783384
break;
3385+
case ZEND_BIND_INIT_STATIC_OR_JMP:
3386+
if (opline->op1_type == IS_CV) {
3387+
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var), old_info);
3388+
}
3389+
break;
33793390
}
33803391

33813392
if (!exit_addr) {

ext/opcache/jit/zend_jit_x86.dasc

+11
Original file line numberDiff line numberDiff line change
@@ -3710,6 +3710,12 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
37103710
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), IS_UNKNOWN, 1);
37113711
}
37123712
break;
3713+
case ZEND_BIND_INIT_STATIC_OR_JMP:
3714+
if (opline->op1_type == IS_CV) {
3715+
old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var));
3716+
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op1.var), IS_UNKNOWN, 1);
3717+
}
3718+
break;
37133719
}
37143720

37153721
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
37293735
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op2.var), old_info);
37303736
}
37313737
break;
3738+
case ZEND_BIND_INIT_STATIC_OR_JMP:
3739+
if (opline->op1_type == IS_CV) {
3740+
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var), old_info);
3741+
}
3742+
break;
37323743
}
37333744

37343745
if (!exit_addr) {
+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
Bind static deoptimization
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.file_update_protection=0
7+
opcache.jit_buffer_size=1M
8+
--FILE--
9+
<?php
10+
function test($n) {
11+
static $x = array(A);
12+
return isset($x[$n]);
13+
}
14+
define("A", 42);
15+
for ($i = 0; $i < 5; $i++) {
16+
var_dump(test(0));
17+
}
18+
?>
19+
--EXPECT--
20+
bool(true)
21+
bool(true)
22+
bool(true)
23+
bool(true)
24+
bool(true)

0 commit comments

Comments
 (0)