Skip to content

Commit 92ad90a

Browse files
committed
JIT: Avoid ZEND_CALL_RELEASE_THIS checks
1 parent c23fa4a commit 92ad90a

File tree

4 files changed

+35
-16
lines changed

4 files changed

+35
-16
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10670,9 +10670,11 @@ static int zend_jit_leave_func(dasm_State **Dst,
1067010670
return 0;
1067110671
}
1067210672
}
10673-
| // if (call_info & ZEND_CALL_RELEASE_THIS)
10674-
| TST_32_WITH_CONST FCARG1w, ZEND_CALL_RELEASE_THIS, TMP1w
10675-
| beq >4
10673+
if (!JIT_G(current_frame) || !TRACE_FRAME_ALWAYS_RELEASE_THIS(JIT_G(current_frame))) {
10674+
| // if (call_info & ZEND_CALL_RELEASE_THIS)
10675+
| TST_32_WITH_CONST FCARG1w, ZEND_CALL_RELEASE_THIS, TMP1w
10676+
| beq >4
10677+
}
1067610678
| // zend_object *object = Z_OBJ(execute_data->This);
1067710679
| ldr FCARG1x, EX->This.value.obj
1067810680
| // OBJ_RELEASE(object);

ext/opcache/jit/zend_jit_internal.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,7 @@ struct _zend_jit_trace_stack_frame {
614614
#define TRACE_FRAME_MASK_NO_NEED_RELEASE_THIS 0x00000080
615615
#define TRACE_FRAME_MASK_THIS_CLASS_CHECKED 0x00000100
616616
#define TRACE_FRAME_MASK_CLOSURE_CALL 0x00000200
617+
#define TRACE_FRAME_MASK_ALWAYS_RELEASE_THIS 0x00000400
617618

618619

619620
#define TRACE_FRAME_INIT(frame, _func, _flags, num_args) do { \
@@ -651,6 +652,8 @@ struct _zend_jit_trace_stack_frame {
651652
((frame)->_info & TRACE_FRAME_MASK_THIS_CLASS_CHECKED)
652653
#define TRACE_FRAME_IS_CLOSURE_CALL(frame) \
653654
((frame)->_info & TRACE_FRAME_MASK_CLOSURE_CALL)
655+
#define TRACE_FRAME_ALWAYS_RELEASE_THIS(frame) \
656+
((frame)->_info & TRACE_FRAME_MASK_ALWAYS_RELEASE_THIS)
654657

655658
#define TRACE_FRAME_SET_UNKNOWN_NUM_ARGS(frame) do { \
656659
(frame)->_info |= (0xffffu << TRACE_FRAME_SHIFT_NUM_ARGS); \
@@ -690,6 +693,9 @@ struct _zend_jit_trace_stack_frame {
690693
#define TRACE_FRAME_SET_CLOSURE_CALL(frame) do { \
691694
(frame)->_info |= TRACE_FRAME_MASK_CLOSURE_CALL; \
692695
} while (0)
696+
#define TRACE_FRAME_SET_ALWAYS_RELEASE_THIS(frame) do { \
697+
(frame)->_info |= TRACE_FRAME_MASK_ALWAYS_RELEASE_THIS; \
698+
} while (0)
693699

694700
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_func_trace_helper(ZEND_OPCODE_HANDLER_ARGS);
695701
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_ret_trace_helper(ZEND_OPCODE_HANDLER_ARGS);

ext/opcache/jit/zend_jit_trace.c

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6498,16 +6498,25 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
64986498
TRACE_FRAME_SET_CLOSURE_CALL(call);
64996499
}
65006500
}
6501-
if (init_opline
6502-
&& init_opline->opcode != ZEND_NEW
6503-
&& (init_opline->opcode != ZEND_INIT_METHOD_CALL
6504-
|| init_opline->op1_type == IS_UNDEF)
6505-
&& (init_opline->opcode != ZEND_INIT_USER_CALL
6506-
|| (p->func && (!p->func->common.scope || (p->func->common.fn_flags & ZEND_ACC_STATIC))))
6507-
&& (init_opline->opcode != ZEND_INIT_DYNAMIC_CALL
6508-
|| (p->func && (!p->func->common.scope || (p->func->common.fn_flags & ZEND_ACC_STATIC))))
6509-
) {
6510-
TRACE_FRAME_SET_NO_NEED_RELEASE_THIS(call);
6501+
if (init_opline) {
6502+
if (init_opline->opcode != ZEND_NEW
6503+
&& (init_opline->opcode != ZEND_INIT_METHOD_CALL
6504+
|| init_opline->op1_type == IS_UNDEF
6505+
|| (!(p->info & ZEND_JIT_TRACE_FAKE_INIT_CALL)
6506+
&& (ssa_op-1)->op1_use >=0
6507+
&& ssa->var_info[(ssa_op-1)->op1_use].delayed_fetch_this))
6508+
&& (init_opline->opcode != ZEND_INIT_USER_CALL
6509+
|| (p->func && (!p->func->common.scope || (p->func->common.fn_flags & ZEND_ACC_STATIC))))
6510+
&& (init_opline->opcode != ZEND_INIT_DYNAMIC_CALL
6511+
|| (p->func && (!p->func->common.scope || (p->func->common.fn_flags & ZEND_ACC_STATIC))))
6512+
) {
6513+
TRACE_FRAME_SET_NO_NEED_RELEASE_THIS(call);
6514+
} else if (init_opline->opcode == ZEND_NEW
6515+
|| (init_opline->opcode == ZEND_INIT_METHOD_CALL
6516+
&& init_opline->op1_type != IS_UNDEF
6517+
&& p->func && p->func->common.scope && !(p->func->common.fn_flags & ZEND_ACC_STATIC))) {
6518+
TRACE_FRAME_SET_ALWAYS_RELEASE_THIS(call);
6519+
}
65116520
}
65126521
frame->call = call;
65136522
top = zend_jit_trace_call_frame(top, p->op_array);

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11298,9 +11298,11 @@ static int zend_jit_leave_func(dasm_State **Dst,
1129811298
return 0;
1129911299
}
1130011300
}
11301-
| // if (call_info & ZEND_CALL_RELEASE_THIS)
11302-
| test FCARG1d, ZEND_CALL_RELEASE_THIS
11303-
| je >4
11301+
if (!JIT_G(current_frame) || !TRACE_FRAME_ALWAYS_RELEASE_THIS(JIT_G(current_frame))) {
11302+
| // if (call_info & ZEND_CALL_RELEASE_THIS)
11303+
| test FCARG1d, ZEND_CALL_RELEASE_THIS
11304+
| je >4
11305+
}
1130411306
| // zend_object *object = Z_OBJ(execute_data->This);
1130511307
| mov FCARG1a, EX->This.value.obj
1130611308
| // OBJ_RELEASE(object);

0 commit comments

Comments
 (0)