Skip to content

Commit 5e8c1ff

Browse files
committed
Keep CPU regesters used by deoptimizer
1 parent cde417a commit 5e8c1ff

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

ext/opcache/jit/zend_jit_trace.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2752,7 +2752,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
27522752
if (!parent_trace) {
27532753
zend_jit_prologue(&dasm_state);
27542754
}
2755-
zend_jit_trace_begin(&dasm_state, ZEND_JIT_TRACE_NUM);
2755+
zend_jit_trace_begin(&dasm_state, ZEND_JIT_TRACE_NUM,
2756+
parent_trace ? &zend_jit_traces[parent_trace] : NULL, exit_num);
27562757

27572758
if (!parent_trace) {
27582759
zend_jit_set_opline(&dasm_state, opline);

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2867,12 +2867,47 @@ static int zend_jit_check_exception_undef_result(dasm_State **Dst, const zend_op
28672867
return zend_jit_check_exception(Dst);
28682868
}
28692869

2870-
static int zend_jit_trace_begin(dasm_State **Dst, uint32_t trace_num)
2870+
static int zend_jit_trace_begin(dasm_State **Dst, uint32_t trace_num, zend_jit_trace_info *parent, uint32_t exit_num)
28712871
{
2872+
zend_regset regset = ZEND_REGSET_SCRATCH;
2873+
2874+
#if ZTS
2875+
if (1) {
2876+
#else
2877+
if ((sizeof(void*) == 8 && !IS_32BIT(&EG(jit_trace_num)))) {
2878+
#endif
2879+
/* assignment to EG(jit_trace_num) shouldn't clober CPU register used by deoptimizer */
2880+
if (parent) {
2881+
int i;
2882+
int parent_vars_count = parent->exit_info[exit_num].stack_size;
2883+
zend_jit_trace_stack *parent_stack =
2884+
parent->stack_map +
2885+
parent->exit_info[exit_num].stack_offset;
2886+
2887+
for (i = 0; i < parent_vars_count; i++) {
2888+
if (STACK_REG(parent_stack, i) != ZREG_NONE) {
2889+
if (STACK_REG(parent_stack, i) < ZREG_NUM) {
2890+
ZEND_REGSET_EXCL(regset, STACK_REG(parent_stack, i));
2891+
} else if (STACK_REG(parent_stack, i) == ZREG_ZVAL_COPY_R0) {
2892+
ZEND_REGSET_EXCL(regset, ZREG_R0);
2893+
}
2894+
}
2895+
}
2896+
}
2897+
}
2898+
28722899
current_trace_num = trace_num;
28732900

28742901
| // EG(jit_trace_num) = trace_num;
2875-
| MEM_OP2_1_ZTS mov, dword, executor_globals, jit_trace_num, trace_num, r0
2902+
if (regset == ZEND_REGSET_EMPTY) {
2903+
| push r0
2904+
| MEM_OP2_1_ZTS mov, dword, executor_globals, jit_trace_num, trace_num, r0
2905+
| pop r0
2906+
} else {
2907+
zend_reg tmp = ZEND_REGSET_FIRST(regset);
2908+
2909+
| MEM_OP2_1_ZTS mov, dword, executor_globals, jit_trace_num, trace_num, Ra(tmp)
2910+
}
28762911

28772912
return 1;
28782913
}

0 commit comments

Comments
 (0)