Skip to content

Commit a9cbdaf

Browse files
committed
Support for ZEND_COMPILE_EXTENDED_STMT
1 parent a03c1ed commit a9cbdaf

File tree

4 files changed

+60
-17
lines changed

4 files changed

+60
-17
lines changed

ext/opcache/Optimizer/zend_cfg.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ static void zend_mark_reachable_blocks(const zend_op_array *op_array, zend_cfg *
112112
zend_basic_block *blocks = cfg->blocks;
113113

114114
blocks[start].flags = ZEND_BB_START;
115+
if (op_array->opcodes[0].opcode == ZEND_EXT_NOP
116+
&& (cfg->flags & ZEND_CFG_RECV_ENTRY)) {
117+
blocks[1].flags |= ZEND_BB_RECV_ENTRY;
118+
}
115119
zend_mark_reachable(op_array->opcodes, cfg, blocks + start);
116120

117121
if (op_array->last_try_catch) {
@@ -287,6 +291,10 @@ int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t b
287291

288292
/* Build CFG, Step 1: Find basic blocks starts, calculate number of blocks */
289293
BB_START(0);
294+
if (op_array->opcodes[0].opcode == ZEND_EXT_NOP
295+
&& (build_flags & ZEND_CFG_RECV_ENTRY)) {
296+
BB_START(1);
297+
}
290298
for (i = 0; i < op_array->last; i++) {
291299
zend_op *opline = op_array->opcodes + i;
292300
switch (opline->opcode) {

ext/opcache/jit/zend_jit.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2118,7 +2118,8 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
21182118
}
21192119
recv_emitted = 1;
21202120
} else if (opline->opcode == ZEND_RECV) {
2121-
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
2121+
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
2122+
&& op_array->opcodes[0].opcode != ZEND_EXT_NOP) {
21222123
/* skip */
21232124
continue;
21242125
} else if (recv_emitted) {
@@ -3539,6 +3540,9 @@ static void ZEND_FASTCALL zend_runtime_jit(void)
35393540

35403541
/* restore original opcode handlers */
35413542
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
3543+
if (opline->opcode == ZEND_EXT_NOP) {
3544+
opline++;
3545+
}
35423546
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
35433547
opline++;
35443548
}
@@ -3572,6 +3576,9 @@ void zend_jit_check_funcs(HashTable *function_table, zend_bool is_method) {
35723576
op_array = &func->op_array;
35733577
opline = op_array->opcodes;
35743578
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
3579+
if (opline->opcode == ZEND_EXT_NOP) {
3580+
opline++;
3581+
}
35753582
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
35763583
opline++;
35773584
}
@@ -3644,6 +3651,9 @@ static int zend_jit_setup_hot_counters(zend_op_array *op_array)
36443651

36453652
if (JIT_G(hot_func)) {
36463653
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
3654+
if (opline->opcode == ZEND_EXT_NOP) {
3655+
opline++;
3656+
}
36473657
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
36483658
opline++;
36493659
}
@@ -3682,6 +3692,9 @@ ZEND_EXT_API int zend_jit_op_array(zend_op_array *op_array, zend_script *script)
36823692
/* Set run-time JIT handler */
36833693
ZEND_ASSERT(zend_jit_runtime_jit_handler != NULL);
36843694
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
3695+
if (opline->opcode == ZEND_EXT_NOP) {
3696+
opline++;
3697+
}
36853698
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
36863699
opline++;
36873700
}
@@ -3701,6 +3714,9 @@ ZEND_EXT_API int zend_jit_op_array(zend_op_array *op_array, zend_script *script)
37013714
ZEND_ASSERT(zend_jit_profile_jit_handler != NULL);
37023715
if (op_array->function_name) {
37033716
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
3717+
if (opline->opcode == ZEND_EXT_NOP) {
3718+
opline++;
3719+
}
37043720
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
37053721
opline++;
37063722
}

ext/opcache/jit/zend_jit_trace.c

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1743,7 +1743,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
17431743
}
17441744
}
17451745
if (opline->opcode == ZEND_RECV_INIT
1746-
&& !(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
1746+
&& !(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
1747+
&& op_array->opcodes[0].opcode != ZEND_EXT_NOP) {
17471748
/* RECV_INIT always copy the constant */
17481749
ssa_var_info[ssa_ops[idx].result_def].type = _const_op_type(RT_CONSTANT(opline, opline->op2));
17491750
} else if ((opline->opcode == ZEND_FE_FETCH_R || opline->opcode == ZEND_FE_FETCH_RW)
@@ -1805,7 +1806,8 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
18051806
}
18061807
}
18071808
if (opline->opcode == ZEND_RECV_INIT
1808-
&& !(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
1809+
&& !(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
1810+
&& op_array->opcodes[0].opcode != ZEND_EXT_NOP) {
18091811
/* RECV_INIT always copy the constant */
18101812
ssa_var_info[ssa_ops[idx].result_def].type = _const_op_type(RT_CONSTANT(opline, opline->op2));
18111813
} else {
@@ -1885,6 +1887,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
18851887
ssa_var_info[v].type = MAY_BE_UNDEF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
18861888
}
18871889
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
1890+
&& op_array->opcodes[0].opcode != ZEND_EXT_NOP
18881891
&& i < op_array->num_args) {
18891892
/* Propagate argument type */
18901893
ssa_var_info[v].type &= STACK_INFO(frame->stack, i);
@@ -5309,17 +5312,24 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
53095312
frame->call_opline = opline;
53105313

53115314
/* Check if SEND_UNPACK/SEND_ARRAY may cause enter at different opline */
5312-
if (opline > op_array->opcodes
5313-
&& ((opline-1)->opcode == ZEND_SEND_ARRAY
5314-
|| (opline-1)->opcode == ZEND_SEND_UNPACK
5315-
|| (opline-1)->opcode == ZEND_CHECK_UNDEF_ARGS)
5316-
&& p->op_array->num_args
5317-
&& (p->op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) == 0
5318-
&& ((p+1)->op == ZEND_JIT_TRACE_VM
5319-
|| (p+1)->op == ZEND_JIT_TRACE_END)
5320-
&& TRACE_FRAME_NUM_ARGS(call) < p->op_array->num_args
5321-
&& !zend_jit_trace_opline_guard(&dasm_state, (p+1)->opline)) {
5322-
goto jit_failure;
5315+
if (opline > op_array->opcodes) {
5316+
const zend_op *prev_opline = opline - 1;
5317+
5318+
while (prev_opline->opcode == ZEND_EXT_FCALL_BEGIN || prev_opline->opcode == ZEND_TICKS) {
5319+
prev_opline--;
5320+
}
5321+
if ((prev_opline->opcode == ZEND_SEND_ARRAY
5322+
|| prev_opline->opcode == ZEND_SEND_UNPACK
5323+
|| prev_opline->opcode == ZEND_CHECK_UNDEF_ARGS)
5324+
&& p->op_array->num_args
5325+
&& (p->op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) == 0
5326+
&& (p->op_array->opcodes[0].opcode != ZEND_EXT_NOP)
5327+
&& ((p+1)->op == ZEND_JIT_TRACE_VM
5328+
|| (p+1)->op == ZEND_JIT_TRACE_END)
5329+
&& TRACE_FRAME_NUM_ARGS(call) < p->op_array->num_args
5330+
&& !zend_jit_trace_opline_guard(&dasm_state, (p+1)->opline)) {
5331+
goto jit_failure;
5332+
}
53235333
}
53245334
}
53255335

@@ -6804,6 +6814,9 @@ static int zend_jit_setup_hot_trace_counters(zend_op_array *op_array)
68046814
ZEND_ASSERT(zend_jit_func_trace_counter_handler != NULL);
68056815
opline = op_array->opcodes;
68066816
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
6817+
if (opline->opcode == ZEND_EXT_NOP) {
6818+
opline++;
6819+
}
68076820
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
68086821
opline++;
68096822
}

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9433,6 +9433,7 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
94339433
uint32_t call_num_args = 0;
94349434
zend_bool unknown_num_args = 0;
94359435
const void *exit_addr = NULL;
9436+
const zend_op *prev_opline;
94369437

94379438
if (RETURN_VALUE_USED(opline)) {
94389439
res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var);
@@ -9441,8 +9442,12 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
94419442
res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R4, TMP_ZVAL_OFFSET);
94429443
}
94439444

9444-
if ((opline-1)->opcode == ZEND_SEND_UNPACK || (opline-1)->opcode == ZEND_SEND_ARRAY ||
9445-
(opline-1)->opcode == ZEND_CHECK_UNDEF_ARGS) {
9445+
prev_opline = opline - 1;
9446+
while (prev_opline->opcode == ZEND_EXT_FCALL_BEGIN || prev_opline->opcode == ZEND_TICKS) {
9447+
prev_opline--;
9448+
}
9449+
if (prev_opline->opcode == ZEND_SEND_UNPACK || prev_opline->opcode == ZEND_SEND_ARRAY ||
9450+
prev_opline->opcode == ZEND_CHECK_UNDEF_ARGS) {
94469451
unknown_num_args = 1;
94479452
}
94489453

@@ -12194,7 +12199,8 @@ static int zend_jit_recv_init(dasm_State **Dst, const zend_op *opline, const zen
1219412199
zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var);
1219512200

1219612201
if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE ||
12197-
(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
12202+
(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) ||
12203+
op_array->opcodes[0].opcode == ZEND_EXT_NOP) {
1219812204
| cmp dword EX->This.u2.num_args, arg_num
1219912205
| jae >5
1220012206
}

0 commit comments

Comments
 (0)