summaryrefslogtreecommitdiff
path: root/ext/opcache/jit/zend_jit_trace.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2020-10-09 14:31:20 +0300
committerDmitry Stogov <dmitry@zend.com>2020-10-09 14:31:20 +0300
commit6f888b90c589cebaf6b5367ba59dabc65f1a18d8 (patch)
treedb2c4b17cc1ab2bdfb13fa722c5d62a13f9b65c7 /ext/opcache/jit/zend_jit_trace.c
parent503999910b186d11345a0277d1d34d4b30ed4e49 (diff)
downloadphp-git-6f888b90c589cebaf6b5367ba59dabc65f1a18d8.tar.gz
Eliminate more dead type stores
Diffstat (limited to 'ext/opcache/jit/zend_jit_trace.c')
-rw-r--r--ext/opcache/jit/zend_jit_trace.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c
index 93dd114818..f9c9a96192 100644
--- a/ext/opcache/jit/zend_jit_trace.c
+++ b/ext/opcache/jit/zend_jit_trace.c
@@ -3280,8 +3280,19 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
uint32_t info = ssa->var_info[i].type;
if (!(info & MAY_BE_GUARD) && has_concrete_type(info)) {
- SET_STACK_TYPE(stack, i, concrete_type(info),
- (i >= parent_vars_count || STACK_REG(parent_stack, i) >= ZREG_NUM));
+ uint8_t type, mem_type;
+
+ type = concrete_type(info);
+ if (i < parent_vars_count
+ && STACK_TYPE(parent_stack, i) == type) {
+ mem_type = STACK_MEM_TYPE(parent_stack, i);
+ if (mem_type != IS_UNKNOWN) {
+ SET_STACK_TYPE(stack, i, mem_type, 1);
+ }
+ SET_STACK_TYPE(stack, i, type, 0);
+ } else {
+ SET_STACK_TYPE(stack, i, type, 1);
+ }
} else if (zend_jit_var_may_alias(op_array, op_array_ssa, i) != NO_ALIAS) {
SET_STACK_TYPE(stack, i, IS_UNKNOWN, 1);
} else if (i < parent_vars_count