Skip to content

Commit 27d7671

Browse files
committed
Avoid generation of rarely used specialized handler
1 parent 23da83c commit 27d7671

File tree

2 files changed

+10
-97
lines changed

2 files changed

+10
-97
lines changed

Zend/zend_vm_def.h

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8926,19 +8926,14 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SEND_VAR, (op1_info & (MAY_BE_UNDEF|MAY_BE_RE
89268926
ZEND_VM_NEXT_OPCODE();
89278927
}
89288928

8929-
ZEND_VM_HOT_SEND_TYPE_SPEC_HANDLER(ZEND_SEND_VAR_EX, (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0, ZEND_SEND_VAR_EX_SIMPLE, CV|VAR, NUM, SPEC(QUICK_ARG))
8929+
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SEND_VAR_EX, op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0, ZEND_SEND_VAR_EX_SIMPLE, CV|VAR, NUM)
89308930
{
89318931
USE_OPLINE
89328932
zval *varptr, *arg;
89338933
zend_free_op free_op1;
89348934
uint32_t arg_num = opline->op2.num;
89358935

8936-
if (EXPECTED(arg_num <= MAX_ARG_FLAG_NUM)) {
8937-
if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
8938-
ZEND_VM_C_GOTO(send_var_by_ref_simple);
8939-
}
8940-
} else if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
8941-
ZEND_VM_C_LABEL(send_var_by_ref_simple):
8936+
if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
89428937
ZEND_VM_DISPATCH_TO_HANDLER(ZEND_SEND_REF);
89438938
}
89448939

Zend/zend_vm_execute.h

Lines changed: 8 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -22903,47 +22903,14 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SIMPLE_SP
2290322903
ZEND_VM_NEXT_OPCODE();
2290422904
}
2290522905

22906-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22906+
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2290722907
{
2290822908
USE_OPLINE
2290922909
zval *varptr, *arg;
2291022910
zend_free_op free_op1;
2291122911
uint32_t arg_num = opline->op2.num;
2291222912

22913-
if (EXPECTED(0)) {
22914-
if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
22915-
goto send_var_by_ref_simple;
22916-
}
22917-
} else if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
22918-
send_var_by_ref_simple:
22919-
ZEND_VM_TAIL_CALL(ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
22920-
}
22921-
22922-
varptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
22923-
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
22924-
22925-
if (IS_VAR == IS_CV) {
22926-
ZVAL_COPY(arg, varptr);
22927-
} else /* if (IS_VAR == IS_VAR) */ {
22928-
ZVAL_COPY_VALUE(arg, varptr);
22929-
}
22930-
22931-
ZEND_VM_NEXT_OPCODE();
22932-
}
22933-
22934-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_QUICK_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22935-
{
22936-
USE_OPLINE
22937-
zval *varptr, *arg;
22938-
zend_free_op free_op1;
22939-
uint32_t arg_num = opline->op2.num;
22940-
22941-
if (EXPECTED(1)) {
22942-
if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
22943-
goto send_var_by_ref_simple;
22944-
}
22945-
} else if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
22946-
send_var_by_ref_simple:
22913+
if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
2294722914
ZEND_VM_TAIL_CALL(ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
2294822915
}
2294922916

@@ -39888,47 +39855,14 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SIMPLE_SP
3988839855
ZEND_VM_NEXT_OPCODE();
3988939856
}
3989039857

39891-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
39858+
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3989239859
{
3989339860
USE_OPLINE
3989439861
zval *varptr, *arg;
3989539862

3989639863
uint32_t arg_num = opline->op2.num;
3989739864

39898-
if (EXPECTED(0)) {
39899-
if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
39900-
goto send_var_by_ref_simple;
39901-
}
39902-
} else if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
39903-
send_var_by_ref_simple:
39904-
ZEND_VM_TAIL_CALL(ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
39905-
}
39906-
39907-
varptr = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
39908-
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
39909-
39910-
if (IS_CV == IS_CV) {
39911-
ZVAL_COPY(arg, varptr);
39912-
} else /* if (IS_CV == IS_VAR) */ {
39913-
ZVAL_COPY_VALUE(arg, varptr);
39914-
}
39915-
39916-
ZEND_VM_NEXT_OPCODE();
39917-
}
39918-
39919-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_QUICK_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
39920-
{
39921-
USE_OPLINE
39922-
zval *varptr, *arg;
39923-
39924-
uint32_t arg_num = opline->op2.num;
39925-
39926-
if (EXPECTED(1)) {
39927-
if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
39928-
goto send_var_by_ref_simple;
39929-
}
39930-
} else if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
39931-
send_var_by_ref_simple:
39865+
if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
3993239866
ZEND_VM_TAIL_CALL(ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
3993339867
}
3993439868

@@ -57363,14 +57297,9 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5736357297
(void*)&&ZEND_SEND_VAR_SIMPLE_SPEC_CV_LABEL,
5736457298
(void*)&&ZEND_NULL_LABEL,
5736557299
(void*)&&ZEND_NULL_LABEL,
57366-
(void*)&&ZEND_NULL_LABEL,
57367-
(void*)&&ZEND_NULL_LABEL,
5736857300
(void*)&&ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_LABEL,
57369-
(void*)&&ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_QUICK_LABEL,
57370-
(void*)&&ZEND_NULL_LABEL,
5737157301
(void*)&&ZEND_NULL_LABEL,
5737257302
(void*)&&ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_LABEL,
57373-
(void*)&&ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_QUICK_LABEL,
5737457303
(void*)&&ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED_LABEL,
5737557304
(void*)&&ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED_LABEL,
5737657305
(void*)&&ZEND_NULL_LABEL
@@ -59015,9 +58944,6 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5901558944
HYBRID_CASE(ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR):
5901658945
ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
5901758946
HYBRID_BREAK();
59018-
HYBRID_CASE(ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_QUICK):
59019-
ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_QUICK_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
59020-
HYBRID_BREAK();
5902158947
HYBRID_CASE(ZEND_IS_IDENTICAL_SPEC_VAR_CONST):
5902258948
ZEND_IS_IDENTICAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
5902358949
HYBRID_BREAK();
@@ -60206,9 +60132,6 @@ ZEND_API void execute_ex(zend_execute_data *ex)
6020660132
HYBRID_CASE(ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV):
6020760133
ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
6020860134
HYBRID_BREAK();
60209-
HYBRID_CASE(ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_QUICK):
60210-
ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_QUICK_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
60211-
HYBRID_BREAK();
6021260135
HYBRID_CASE(ZEND_ADD_SPEC_CV_CONST):
6021360136
ZEND_ADD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
6021460137
HYBRID_BREAK();
@@ -65260,14 +65183,9 @@ void zend_init_opcodes_handlers(void)
6526065183
ZEND_SEND_VAR_SIMPLE_SPEC_CV_HANDLER,
6526165184
ZEND_NULL_HANDLER,
6526265185
ZEND_NULL_HANDLER,
65263-
ZEND_NULL_HANDLER,
65264-
ZEND_NULL_HANDLER,
6526565186
ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_HANDLER,
65266-
ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_QUICK_HANDLER,
65267-
ZEND_NULL_HANDLER,
6526865187
ZEND_NULL_HANDLER,
6526965188
ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_HANDLER,
65270-
ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_QUICK_HANDLER,
6527165189
ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED_HANDLER,
6527265190
ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED_HANDLER,
6527365191
ZEND_NULL_HANDLER
@@ -65472,7 +65390,7 @@ void zend_init_opcodes_handlers(void)
6547265390
3019,
6547365391
3020,
6547465392
3021 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
65475-
3942
65393+
3937
6547665394
};
6547765395
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
6547865396
zend_opcode_handler_funcs = labels;
@@ -65828,13 +65746,13 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
6582865746
}
6582965747
break;
6583065748
case ZEND_SEND_VAR_EX:
65831-
if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
65832-
spec = 3930 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG;
65749+
if (op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
65750+
spec = 3930 | SPEC_RULE_OP1;
6583365751
}
6583465752
break;
6583565753
case ZEND_FE_FETCH_R:
6583665754
if (op->op2_type == IS_CV && (op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) {
65837-
spec = 3940 | SPEC_RULE_RETVAL;
65755+
spec = 3935 | SPEC_RULE_RETVAL;
6583865756
}
6583965757
break;
6584065758
case ZEND_FETCH_DIM_R:

0 commit comments

Comments
 (0)