summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2020-11-16 16:11:25 +0300
committerDmitry Stogov <dmitry@zend.com>2020-11-16 16:11:25 +0300
commite3c63de05b938c1adedbcfe169abc1b46f7f1e93 (patch)
tree6a00af85a0f278d3c134a7eec08699ccf9e6ebec
parenteb6d496a93b66b51476e6d26921036440bab82b6 (diff)
downloadphp-git-e3c63de05b938c1adedbcfe169abc1b46f7f1e93.tar.gz
Fixed alias handling
-rw-r--r--ext/opcache/jit/zend_jit_trace.c35
1 files changed, 24 insertions, 11 deletions
diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c
index 9acb47b3fe..d57f0d9407 100644
--- a/ext/opcache/jit/zend_jit_trace.c
+++ b/ext/opcache/jit/zend_jit_trace.c
@@ -1940,6 +1940,16 @@ propagate_arg:
if (ssa_ops[idx].result_def >= 0) {
zend_jit_trace_copy_ssa_var_range(op_array, ssa, ssa_opcodes, tssa, ssa_ops[idx].result_def);
}
+ } else {
+ if (ssa_ops[idx].op1_def >= 0) {
+ ssa_vars[ssa_ops[idx].op1_def].alias = zend_jit_var_may_alias(op_array, ssa, EX_VAR_TO_NUM(opline->op1.var));
+ }
+ if (ssa_ops[idx].op2_def >= 0) {
+ ssa_vars[ssa_ops[idx].op2_def].alias = zend_jit_var_may_alias(op_array, ssa, EX_VAR_TO_NUM(opline->op2.var));
+ }
+ if (ssa_ops[idx].result_def >= 0) {
+ ssa_vars[ssa_ops[idx].result_def].alias = zend_jit_var_may_alias(op_array, ssa, EX_VAR_TO_NUM(opline->result.var));
+ }
}
if (opline->opcode == ZEND_RECV_INIT
&& !(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
@@ -2001,19 +2011,22 @@ propagate_arg:
if (ssa->var_info
&& zend_jit_trace_copy_ssa_var_info(op_array, ssa, ssa_opcodes, tssa, v)) {
/* pass */
- } else if (op_array->arg_info) {
- zend_arg_info *arg_info = &op_array->arg_info[i];
- zend_class_entry *ce;
- uint32_t tmp = zend_fetch_arg_info_type(script, arg_info, &ce);
+ } else {
+ ssa_vars[v].alias = zend_jit_var_may_alias(op_array, ssa, i);
+ if (op_array->arg_info) {
+ zend_arg_info *arg_info = &op_array->arg_info[i];
+ zend_class_entry *ce;
+ uint32_t tmp = zend_fetch_arg_info_type(script, arg_info, &ce);
- if (ZEND_ARG_SEND_MODE(arg_info)) {
- tmp |= MAY_BE_REF;
+ if (ZEND_ARG_SEND_MODE(arg_info)) {
+ tmp |= MAY_BE_REF;
+ }
+ ssa_var_info[v].type = tmp;
+ ssa_var_info[v].ce = ce;
+ ssa_var_info[v].is_instanceof = 1;
+ } else {
+ 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;
}
- ssa_var_info[v].type = tmp;
- ssa_var_info[v].ce = ce;
- ssa_var_info[v].is_instanceof = 1;
- } else {
- 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;
}
} else {
if (ssa->vars) {