com php-src: Fixed tracing JIT support for aliasses (Zend/tests/bug75420.13.phpt and ext/standard/tests/streams/bug60106.phpt):
ext/opcache/jit/zend_jit_trace.c
| From: | Dmitry Stogov | Date: | Tue, 27 Oct 2020 20:44:29 +0000 |
| Subject: | com php-src: Fixed tracing JIT support for aliasses (Zend/tests/bug75420.13.phpt and ext/standard/tests/streams/bug60106.phpt): ext/opcache/jit/zend_jit_trace.c |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-113952@lists.php.net to get a copy of this message | ||
Commit: e6b51ccc58002a4cc3dd2eee22f1c03425480278
Author: Dmitry Stogov <dmitry@zend.com> Tue, 27 Oct 2020 23:44:29 +0300
Parents: 43e493884c022b5f639282ddb802624093dd9202
Branches: PHP-8.0 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=e6b51ccc58002a4cc3dd2eee22f1c03425480278
Log:
Fixed tracing JIT support for aliasses (Zend/tests/bug75420.13.phpt and
ext/standard/tests/streams/bug60106.phpt)
Bugs:
https://bugs.php.net/75420
https://bugs.php.net/60106
Changed paths:
M ext/opcache/jit/zend_jit_trace.c
Diff:
diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c
index 2a462b03e9a..a559b6fa290 100644
--- a/ext/opcache/jit/zend_jit_trace.c
+++ b/ext/opcache/jit/zend_jit_trace.c
@@ -372,10 +372,12 @@ static zend_always_inline void zend_jit_trace_add_op_guard(zend_ssa
{
zend_ssa_var_info *info = &tssa->var_info[ssa_var];
- if (tssa->vars[ssa_var].alias != NO_ALIAS) {
- info->type = MAY_BE_GUARD | zend_jit_trace_type_to_info(op_type);
- } else if ((info->type & (MAY_BE_ANY|MAY_BE_UNDEF)) != (1 << op_type)) {
- info->type = MAY_BE_GUARD | zend_jit_trace_type_to_info_ex(op_type, info->type);
+ if ((info->type & (MAY_BE_ANY|MAY_BE_UNDEF)) != (1 << op_type)) {
+ if (UNEXPECTED(tssa->vars[ssa_var].alias != NO_ALIAS)) {
+ info->type |= MAY_BE_GUARD;
+ } else {
+ info->type = MAY_BE_GUARD | zend_jit_trace_type_to_info_ex(op_type, info->type);
+ }
}
}
@@ -387,14 +389,13 @@ static zend_always_inline void zend_jit_trace_add_op_guard(zend_ssa
#define CHECK_OP_TRACE_TYPE(_var, _ssa_var, op_info, op_type) do { \
if (op_type != IS_UNKNOWN) { \
- if ((op_info & MAY_BE_GUARD) != 0 \
- && op_type != STACK_TYPE(stack, EX_VAR_TO_NUM(_var))) { \
+ if ((op_info & MAY_BE_GUARD) != 0) { \
if (!zend_jit_type_guard(&dasm_state, opline, _var, op_type)) { \
goto jit_failure; \
} \
if (ssa->vars[_ssa_var].alias != NO_ALIAS) { \
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(_var), IS_UNKNOWN, 1); \
- op_info &= ~MAY_BE_GUARD; \
+ op_info = zend_jit_trace_type_to_info(op_type); \
} else { \
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(_var), op_type, 1); \
op_info &= ~MAY_BE_GUARD; \
@@ -3615,6 +3616,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t
par
res_addr = 0;
}
op1_def_info = OP1_DEF_INFO();
+ if (op1_def_info & MAY_BE_GUARD
+ && !has_concrete_type(op1_def_info)) {
+ op1_def_info &= ~MAY_BE_GUARD;
+ }
if (!zend_jit_inc_dec(&dasm_state, opline,
op1_info, OP1_REG_ADDR(),
op1_def_info, OP1_DEF_REG_ADDR(),
@@ -3894,6 +3899,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t
par
}
}
op1_def_info = OP1_DEF_INFO();
+ if (op1_def_info & MAY_BE_GUARD
+ && !has_concrete_type(op1_def_info)) {
+ op1_def_info &= ~MAY_BE_GUARD;
+ }
if (!zend_jit_assign_op(&dasm_state, opline,
op1_info, op1_def_info, OP1_RANGE(),
op2_info, OP2_RANGE(),
@@ -5057,6 +5066,9 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t
par
}
} else {
CHECK_OP1_TRACE_TYPE();
+ if (!(op1_info & MAY_BE_OBJECT)) {
+ break;
+ }
}
if (ssa->var_info && ssa->ops) {
if (ssa_op->op1_use >= 0) {