@@ -3148,18 +3148,24 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
3148
3148
zend_jit_check_exception(Dst);
3149
3149
}
3150
3150
3151
- if (!GCC_GLOBAL_REGS) {
3151
+ while (trace->op != ZEND_JIT_TRACE_VM && trace->op != ZEND_JIT_TRACE_END) {
3152
+ trace++;
3153
+ }
3154
+
3155
+ if (!GCC_GLOBAL_REGS
3156
+ && (trace->op != ZEND_JIT_TRACE_END || trace->stop != ZEND_JIT_TRACE_STOP_RETURN)) {
3152
3157
if (opline->opcode == ZEND_RETURN ||
3158
+ opline->opcode == ZEND_RETURN_BY_REF ||
3153
3159
opline->opcode == ZEND_DO_UCALL ||
3154
3160
opline->opcode == ZEND_DO_FCALL_BY_NAME ||
3155
3161
opline->opcode == ZEND_DO_FCALL) {
3156
3162
| MEM_OP2_2_ZTS mov, FP, aword, executor_globals, current_execute_data, r0
3157
3163
}
3158
3164
}
3159
3165
3160
- if (zend_jit_trace_may_exit(op_array, opline, trace )) {
3166
+ if (zend_jit_trace_may_exit(op_array, opline)) {
3161
3167
// TODO: try to avoid this check ???
3162
- if (opline->opcode == ZEND_RETURN) {
3168
+ if (opline->opcode == ZEND_RETURN || opline->opcode == ZEND_RETURN_BY_REF ) {
3163
3169
if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) {
3164
3170
| cmp IP, zend_jit_halt_op
3165
3171
| je ->trace_halt
@@ -3171,9 +3177,6 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
3171
3177
| jl ->trace_halt
3172
3178
}
3173
3179
}
3174
- while (trace->op != ZEND_JIT_TRACE_VM && trace->op != ZEND_JIT_TRACE_END) {
3175
- trace++;
3176
- }
3177
3180
if (trace->op != ZEND_JIT_TRACE_END || trace->stop != ZEND_JIT_TRACE_STOP_RETURN) {
3178
3181
const zend_op *next_opline = trace->opline;
3179
3182
const zend_op *exit_opline = NULL;
@@ -3221,25 +3224,6 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
3221
3224
| CMP_IP next_opline
3222
3225
| jne &exit_addr
3223
3226
}
3224
- } else {
3225
- while (trace->op != ZEND_JIT_TRACE_VM && trace->op != ZEND_JIT_TRACE_END) {
3226
- trace++;
3227
- }
3228
- // TODO: remove this ???
3229
- if (opline->opcode == ZEND_RETURN
3230
- && trace->op == ZEND_JIT_TRACE_END
3231
- && trace->stop == ZEND_JIT_TRACE_STOP_RETURN) {
3232
- if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) {
3233
- | cmp IP, zend_jit_halt_op
3234
- | je ->trace_halt
3235
- } else if (GCC_GLOBAL_REGS) {
3236
- | test IP, IP
3237
- | je ->trace_halt
3238
- } else {
3239
- | test eax, eax
3240
- | jl ->trace_halt
3241
- }
3242
- }
3243
3227
}
3244
3228
3245
3229
last_valid_opline = trace->opline;
0 commit comments