summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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