summaryrefslogtreecommitdiff
path: root/ext/opcache/jit/zend_jit_trace.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2021-02-17 11:51:13 +0300
committerDmitry Stogov <dmitry@zend.com>2021-02-17 11:51:13 +0300
commit7f68a7afe625ffdc485a05d417197bc30cbb1513 (patch)
tree5ff2216db2e21ac84c512effda87ac3b78043ed0 /ext/opcache/jit/zend_jit_trace.c
parent408272b8d9d08ebdb31cea43535006fef28f9c1f (diff)
downloadphp-git-7f68a7afe625ffdc485a05d417197bc30cbb1513.tar.gz
Fixed bug #80745 (JIT produces Assert failure and UNKNOWN:0 var_dumps in code involving bitshifts)
Diffstat (limited to 'ext/opcache/jit/zend_jit_trace.c')
-rw-r--r--ext/opcache/jit/zend_jit_trace.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c
index 69c4f79fa8..8353c3cec0 100644
--- a/ext/opcache/jit/zend_jit_trace.c
+++ b/ext/opcache/jit/zend_jit_trace.c
@@ -3878,10 +3878,15 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
STACK_MEM_TYPE(stack, EX_VAR_TO_NUM(opline->result.var)))
& (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE);
#else
+ res_use_info = -1;
if (opline->result_type == IS_CV) {
- res_use_info = RES_USE_INFO();
- } else {
- res_use_info = MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE;
+ zend_jit_addr res_use_addr = RES_USE_REG_ADDR();
+
+ if (Z_MODE(res_use_addr) != IS_REG
+ || Z_LOAD(res_use_addr)
+ || Z_STORE(res_use_addr)) {
+ res_use_info = RES_USE_INFO();
+ }
}
#endif
res_info = RES_INFO();
@@ -3973,10 +3978,15 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
STACK_MEM_TYPE(stack, EX_VAR_TO_NUM(opline->result.var)))
& (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE);
#else
+ res_use_info = -1;
if (opline->result_type == IS_CV) {
- res_use_info = RES_USE_INFO();
- } else {
- res_use_info = MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE;
+ zend_jit_addr res_use_addr = RES_USE_REG_ADDR();
+
+ if (Z_MODE(res_use_addr) != IS_REG
+ || Z_LOAD(res_use_addr)
+ || Z_STORE(res_use_addr)) {
+ res_use_info = RES_USE_INFO();
+ }
}
#endif
}
@@ -4050,10 +4060,15 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
STACK_MEM_TYPE(stack, EX_VAR_TO_NUM(opline->result.var)))
& (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE);
#else
+ res_use_info = -1;
if (opline->result_type == IS_CV) {
- res_use_info = RES_USE_INFO();
- } else {
- res_use_info = MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE;
+ zend_jit_addr res_use_addr = RES_USE_REG_ADDR();
+
+ if (Z_MODE(res_use_addr) != IS_REG
+ || Z_LOAD(res_use_addr)
+ || Z_STORE(res_use_addr)) {
+ res_use_info = RES_USE_INFO();
+ }
}
#endif
}