Skip to content

Commit 4b13985

Browse files
committed
Keep CPU regesters used by deoptimizer
1 parent 2b7035e commit 4b13985

File tree

2 files changed

+50
-14
lines changed

2 files changed

+50
-14
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: 48 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -176,38 +176,38 @@ static void* dasm_labels[zend_lb_MAX];
176176
| .if X64WIN
177177
| gs
178178
| mov reg, aword [0x58]
179-
| mov reg, aword [reg + tsrm_tls_index]
180-
| mov reg, aword [reg + tsrm_tls_offset]
179+
| mov reg, aword [reg+tsrm_tls_index]
180+
| mov reg, aword [reg+tsrm_tls_offset]
181181
| .elif WIN
182182
| fs
183183
| mov reg, aword [0x2c]
184-
| mov reg, aword [reg + tsrm_tls_index]
185-
| mov reg, aword [reg + tsrm_tls_offset]
184+
| mov reg, aword [reg+tsrm_tls_index]
185+
| mov reg, aword [reg+tsrm_tls_offset]
186186
| .elif X64APPLE
187187
| gs
188188
|| if (tsrm_ls_cache_tcb_offset) {
189189
| mov reg, aword [tsrm_ls_cache_tcb_offset]
190190
|| } else {
191191
| mov reg, aword [tsrm_tls_index]
192-
| mov reg, aword [reg + tsrm_tls_offset]
192+
| mov reg, aword [reg+tsrm_tls_offset]
193193
|| }
194194
| .elif X64
195195
| fs
196196
|| if (tsrm_ls_cache_tcb_offset) {
197197
| mov reg, aword [tsrm_ls_cache_tcb_offset]
198198
|| } else {
199199
| mov reg, [0x8]
200-
| mov reg, aword [reg + tsrm_tls_index]
201-
| mov reg, aword [reg + tsrm_tls_offset]
200+
| mov reg, aword [reg+tsrm_tls_index]
201+
| mov reg, aword [reg+tsrm_tls_offset]
202202
|| }
203203
| .else
204204
| gs
205205
|| if (tsrm_ls_cache_tcb_offset) {
206206
| mov reg, aword [tsrm_ls_cache_tcb_offset]
207207
|| } else {
208208
| mov reg, [0x4]
209-
| mov reg, aword [reg + tsrm_tls_index]
210-
| mov reg, aword [reg + tsrm_tls_offset]
209+
| mov reg, aword [reg+tsrm_tls_index]
210+
| mov reg, aword [reg+tsrm_tls_offset]
211211
|| }
212212
| .endif
213213
|.endmacro
@@ -377,7 +377,7 @@ static void* dasm_labels[zend_lb_MAX];
377377
|.macro MEM_OP2_1_ZTS, mem_ins, prefix, struct, field, op2, tmp_reg
378378
| .if ZTS
379379
| LOAD_TSRM_CACHE tmp_reg
380-
| mem_ins prefix [tmp_reg + (struct.._offset + offsetof(zend_..struct, field))], op2
380+
| mem_ins prefix [tmp_reg+(struct.._offset+offsetof(zend_..struct, field))], op2
381381
| .else
382382
| MEM_OP2_1 mem_ins, prefix, &struct.field, op2, tmp_reg
383383
| .endif
@@ -386,7 +386,7 @@ static void* dasm_labels[zend_lb_MAX];
386386
|.macro MEM_OP2_2_ZTS, mem_ins, op1, prefix, struct, field, tmp_reg
387387
| .if ZTS
388388
| LOAD_TSRM_CACHE tmp_reg
389-
| mem_ins op1, prefix [tmp_reg + (struct.._offset + offsetof(zend_..struct, field))]
389+
| mem_ins op1, prefix [tmp_reg+(struct.._offset+offsetof(zend_..struct, field))]
390390
| .else
391391
| MEM_OP2_2 mem_ins, op1, prefix, &struct.field, tmp_reg
392392
| .endif
@@ -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)