Skip to content

Commit 968c31a

Browse files
committed
Better handling of IS_UNDEF variables
1 parent 3c04ce4 commit 968c31a

File tree

1 file changed

+35
-34
lines changed

1 file changed

+35
-34
lines changed

ext/opcache/jit/zend_jit_trace.c

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1167,26 +1167,27 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
11671167
if (trace_buffer->start == ZEND_JIT_TRACE_START_ENTER) {
11681168
i = 0;
11691169
while (i < op_array->last_var) {
1170-
if (!ssa->var_info
1171-
|| !zend_jit_trace_copy_ssa_var_info(op_array, ssa, ssa_opcodes, tssa, i)) {
1172-
if (i < op_array->num_args) {
1173-
if (op_array->arg_info) {
1174-
zend_arg_info *arg_info = &op_array->arg_info[i];
1175-
zend_class_entry *ce;
1176-
uint32_t tmp = zend_fetch_arg_info_type(script, arg_info, &ce);
1170+
if (i < op_array->num_args) {
1171+
if (ssa->var_info
1172+
&& zend_jit_trace_copy_ssa_var_info(op_array, ssa, ssa_opcodes, tssa, i)) {
1173+
/* pass */
1174+
} else if (op_array->arg_info) {
1175+
zend_arg_info *arg_info = &op_array->arg_info[i];
1176+
zend_class_entry *ce;
1177+
uint32_t tmp = zend_fetch_arg_info_type(script, arg_info, &ce);
11771178

1178-
if (ZEND_ARG_SEND_MODE(arg_info)) {
1179-
tmp |= MAY_BE_REF;
1180-
}
1181-
ssa_var_info[i].type = tmp;
1182-
ssa_var_info[i].ce = ce;
1183-
ssa_var_info[i].is_instanceof = 1;
1184-
} else {
1185-
ssa_var_info[i].type = MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
1179+
if (ZEND_ARG_SEND_MODE(arg_info)) {
1180+
tmp |= MAY_BE_REF;
11861181
}
1182+
ssa_var_info[i].type = tmp;
1183+
ssa_var_info[i].ce = ce;
1184+
ssa_var_info[i].is_instanceof = 1;
11871185
} else {
1188-
ssa_var_info[i].type = MAY_BE_UNDEF;
1186+
ssa_var_info[i].type = MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
11891187
}
1188+
} else {
1189+
ssa_vars[i].no_val = ssa->vars ? ssa->vars[i].no_val : 0;
1190+
ssa_var_info[i].type = MAY_BE_UNDEF;
11901191
}
11911192
i++;
11921193
}
@@ -1563,26 +1564,27 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
15631564
v = p->first_ssa_var;
15641565
while (i < op_array->last_var) {
15651566
ssa_vars[v].var = i;
1566-
if (!ssa->var_info
1567-
|| !zend_jit_trace_copy_ssa_var_info(op_array, ssa, ssa_opcodes, tssa, v)) {
1568-
if (i < op_array->num_args) {
1569-
if (op_array->arg_info) {
1570-
zend_arg_info *arg_info = &op_array->arg_info[i];
1571-
zend_class_entry *ce;
1572-
uint32_t tmp = zend_fetch_arg_info_type(script, arg_info, &ce);
1573-
1574-
if (ZEND_ARG_SEND_MODE(arg_info)) {
1575-
tmp |= MAY_BE_REF;
1576-
}
1577-
ssa_var_info[v].type = tmp;
1578-
ssa_var_info[i].ce = ce;
1579-
ssa_var_info[i].is_instanceof = 1;
1580-
} else {
1581-
ssa_var_info[v].type = MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
1567+
if (i < op_array->num_args) {
1568+
if (ssa->var_info
1569+
&& zend_jit_trace_copy_ssa_var_info(op_array, ssa, ssa_opcodes, tssa, v)) {
1570+
/* pass */
1571+
} else if (op_array->arg_info) {
1572+
zend_arg_info *arg_info = &op_array->arg_info[i];
1573+
zend_class_entry *ce;
1574+
uint32_t tmp = zend_fetch_arg_info_type(script, arg_info, &ce);
1575+
1576+
if (ZEND_ARG_SEND_MODE(arg_info)) {
1577+
tmp |= MAY_BE_REF;
15821578
}
1579+
ssa_var_info[v].type = tmp;
1580+
ssa_var_info[i].ce = ce;
1581+
ssa_var_info[i].is_instanceof = 1;
15831582
} else {
1584-
ssa_var_info[v].type = MAY_BE_UNDEF;
1583+
ssa_var_info[v].type = MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
15851584
}
1585+
} else {
1586+
ssa_vars[v].no_val = ssa->vars ? ssa->vars[i].no_val : 0;
1587+
ssa_var_info[v].type = MAY_BE_UNDEF;
15861588
}
15871589
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
15881590
&& i < op_array->num_args) {
@@ -1592,7 +1594,6 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
15921594
i++;
15931595
v++;
15941596
}
1595-
15961597
} else if (p->op == ZEND_JIT_TRACE_BACK) {
15971598
op_array = p->op_array;
15981599
jit_extension =

0 commit comments

Comments
 (0)