Skip to content

Commit 30c0557

Browse files
committed
Optimized conditions order
1 parent af78ea1 commit 30c0557

File tree

4 files changed

+105
-100
lines changed

4 files changed

+105
-100
lines changed

Zend/zend_variables.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,28 @@ static zend_always_inline void _zval_opt_copy_ctor(zval *zvalue ZEND_FILE_LINE_D
6262
}
6363
}
6464

65+
static zend_always_inline void _zval_copy_ctor_no_imm(zval *zvalue ZEND_FILE_LINE_DC)
66+
{
67+
if (Z_REFCOUNTED_P(zvalue)) {
68+
if (Z_COPYABLE_P(zvalue)) {
69+
_zval_copy_ctor_func(zvalue ZEND_FILE_LINE_RELAY_CC);
70+
} else {
71+
Z_ADDREF_P(zvalue);
72+
}
73+
}
74+
}
75+
76+
static zend_always_inline void _zval_opt_copy_ctor_no_imm(zval *zvalue ZEND_FILE_LINE_DC)
77+
{
78+
if (Z_OPT_REFCOUNTED_P(zvalue)) {
79+
if (Z_OPT_COPYABLE_P(zvalue)) {
80+
_zval_copy_ctor_func(zvalue ZEND_FILE_LINE_RELAY_CC);
81+
} else {
82+
Z_ADDREF_P(zvalue);
83+
}
84+
}
85+
}
86+
6587
ZEND_API int zval_copy_static_var(zval *p TSRMLS_DC, int num_args, va_list args, zend_hash_key *key);
6688

6789
ZEND_API int zend_print_variable(zval *var TSRMLS_DC);
@@ -72,6 +94,8 @@ ZEND_API void _zval_internal_ptr_dtor(zval *zvalue ZEND_FILE_LINE_DC);
7294
ZEND_API void _zval_dtor_wrapper(zval *zvalue);
7395
#define zval_copy_ctor(zvalue) _zval_copy_ctor((zvalue) ZEND_FILE_LINE_CC)
7496
#define zval_opt_copy_ctor(zvalue) _zval_opt_copy_ctor((zvalue) ZEND_FILE_LINE_CC)
97+
#define zval_copy_ctor_no_imm(zvalue) _zval_copy_ctor_no_imm((zvalue) ZEND_FILE_LINE_CC)
98+
#define zval_opt_copy_ctor_no_imm(zvalue) _zval_opt_copy_ctor_no_imm((zvalue) ZEND_FILE_LINE_CC)
7599
#define zval_dtor(zvalue) _zval_dtor((zvalue) ZEND_FILE_LINE_CC)
76100
#define zval_ptr_dtor(zval_ptr) _zval_ptr_dtor((zval_ptr) ZEND_FILE_LINE_CC)
77101
#define zval_internal_dtor(zvalue) _zval_internal_dtor((zvalue) ZEND_FILE_LINE_CC)

Zend/zend_vm_def.h

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2823,8 +2823,8 @@ ZEND_VM_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
28232823
} else {
28242824
if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_TMP_VAR) {
28252825
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
2826-
if (OP1_TYPE == IS_CONST && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
2827-
zval_opt_copy_ctor(EX(return_value));
2826+
if (OP1_TYPE == IS_CONST) {
2827+
zval_opt_copy_ctor_no_imm(EX(return_value));
28282828
}
28292829
} else if (Z_ISREF_P(retval_ptr)) {
28302830
ZVAL_DUP(EX(return_value), Z_REFVAL_P(retval_ptr));
@@ -2860,8 +2860,8 @@ ZEND_VM_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY)
28602860
}
28612861
} else {
28622862
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
2863-
if (OP1_TYPE != IS_TMP_VAR && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
2864-
zval_opt_copy_ctor(EX(return_value));
2863+
if (OP1_TYPE != IS_TMP_VAR) {
2864+
zval_opt_copy_ctor_no_imm(EX(return_value));
28652865
}
28662866
}
28672867
break;
@@ -3008,9 +3008,7 @@ ZEND_VM_HANDLER(65, ZEND_SEND_VAL, CONST|TMP, ANY)
30083008
if (OP1_TYPE == IS_CONST) {
30093009
/* Immutable arrays may be passed without copying ??? */
30103010
/* some internal functions may try to modify them !!! */
3011-
if (!Z_OPT_IMMUTABLE_P(top)) {
3012-
zval_opt_copy_ctor(top);
3013-
}
3011+
zval_opt_copy_ctor_no_imm(top);
30143012
}
30153013
ZEND_VM_NEXT_OPCODE();
30163014
}
@@ -3027,9 +3025,7 @@ ZEND_VM_HELPER(zend_send_by_var_helper, VAR|CV, ANY)
30273025
ZVAL_COPY_VALUE(top, Z_REFVAL_P(varptr));
30283026
/* Immutable arrays may be passed without copying ??? */
30293027
/* some internal functions may try to modify them !!! */
3030-
if (!Z_OPT_IMMUTABLE_P(top)) {
3031-
zval_opt_copy_ctor(top);
3032-
}
3028+
zval_opt_copy_ctor_no_imm(top);
30333029
FREE_OP1();
30343030
} else {
30353031
ZVAL_COPY_VALUE(top, varptr);
@@ -3153,9 +3149,7 @@ ZEND_VM_HANDLER(66, ZEND_SEND_VAR, VAR|CV, ANY)
31533149
ZVAL_COPY_VALUE(top, Z_REFVAL_P(varptr));
31543150
/* Immutable arrays may be passed without copying ??? */
31553151
/* some internal functions may try to modify them !!! */
3156-
if (!Z_OPT_IMMUTABLE_P(top)) {
3157-
zval_opt_copy_ctor(top);
3158-
}
3152+
zval_opt_copy_ctor_no_imm(top);
31593153
FREE_OP1();
31603154
} else {
31613155
ZVAL_COPY_VALUE(top, varptr);
@@ -4935,9 +4929,7 @@ ZEND_VM_HANDLER(22, ZEND_QM_ASSIGN, CONST|TMP|VAR|CV, ANY)
49354929

49364930
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
49374931
if (!IS_OP1_TMP_FREE()) {
4938-
if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
4939-
zval_opt_copy_ctor(EX_VAR(opline->result.var));
4940-
}
4932+
zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
49414933
}
49424934
FREE_OP1_IF_VAR();
49434935
CHECK_EXCEPTION();
@@ -4958,9 +4950,7 @@ ZEND_VM_HANDLER(157, ZEND_QM_ASSIGN_VAR, CONST|TMP|VAR|CV, ANY)
49584950
} else {
49594951
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
49604952
if (!IS_OP1_TMP_FREE()) {
4961-
if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
4962-
zval_opt_copy_ctor(EX_VAR(opline->result.var));
4963-
}
4953+
zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
49644954
}
49654955
}
49664956

Zend/zend_vm_execute.h

Lines changed: 30 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -2605,8 +2605,8 @@ static int ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARG
26052605
} else {
26062606
if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
26072607
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
2608-
if (IS_CONST == IS_CONST && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
2609-
zval_opt_copy_ctor(EX(return_value));
2608+
if (IS_CONST == IS_CONST) {
2609+
zval_opt_copy_ctor_no_imm(EX(return_value));
26102610
}
26112611
} else if (Z_ISREF_P(retval_ptr)) {
26122612
ZVAL_DUP(EX(return_value), Z_REFVAL_P(retval_ptr));
@@ -2642,8 +2642,8 @@ static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER(ZEND_OPCODE_HAND
26422642
}
26432643
} else {
26442644
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
2645-
if (IS_CONST != IS_TMP_VAR && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
2646-
zval_opt_copy_ctor(EX(return_value));
2645+
if (IS_CONST != IS_TMP_VAR) {
2646+
zval_opt_copy_ctor_no_imm(EX(return_value));
26472647
}
26482648
}
26492649
break;
@@ -2724,9 +2724,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
27242724
if (IS_CONST == IS_CONST) {
27252725
/* Immutable arrays may be passed without copying ??? */
27262726
/* some internal functions may try to modify them !!! */
2727-
if (!Z_OPT_IMMUTABLE_P(top)) {
2728-
zval_opt_copy_ctor(top);
2729-
}
2727+
zval_opt_copy_ctor_no_imm(top);
27302728
}
27312729
ZEND_VM_NEXT_OPCODE();
27322730
}
@@ -3263,9 +3261,7 @@ static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_
32633261

32643262
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
32653263
if (!0) {
3266-
if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
3267-
zval_opt_copy_ctor(EX_VAR(opline->result.var));
3268-
}
3264+
zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
32693265
}
32703266

32713267
CHECK_EXCEPTION();
@@ -3286,9 +3282,7 @@ static int ZEND_FASTCALL ZEND_QM_ASSIGN_VAR_SPEC_CONST_HANDLER(ZEND_OPCODE_HAND
32863282
} else {
32873283
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
32883284
if (!0) {
3289-
if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
3290-
zval_opt_copy_ctor(EX_VAR(opline->result.var));
3291-
}
3285+
zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
32923286
}
32933287
}
32943288

@@ -7746,8 +7740,8 @@ static int ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
77467740
} else {
77477741
if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
77487742
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
7749-
if (IS_TMP_VAR == IS_CONST && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
7750-
zval_opt_copy_ctor(EX(return_value));
7743+
if (IS_TMP_VAR == IS_CONST) {
7744+
zval_opt_copy_ctor_no_imm(EX(return_value));
77517745
}
77527746
} else if (Z_ISREF_P(retval_ptr)) {
77537747
ZVAL_DUP(EX(return_value), Z_REFVAL_P(retval_ptr));
@@ -7783,8 +7777,8 @@ static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLE
77837777
}
77847778
} else {
77857779
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
7786-
if (IS_TMP_VAR != IS_TMP_VAR && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
7787-
zval_opt_copy_ctor(EX(return_value));
7780+
if (IS_TMP_VAR != IS_TMP_VAR) {
7781+
zval_opt_copy_ctor_no_imm(EX(return_value));
77887782
}
77897783
}
77907784
break;
@@ -7865,9 +7859,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
78657859
if (IS_TMP_VAR == IS_CONST) {
78667860
/* Immutable arrays may be passed without copying ??? */
78677861
/* some internal functions may try to modify them !!! */
7868-
if (!Z_OPT_IMMUTABLE_P(top)) {
7869-
zval_opt_copy_ctor(top);
7870-
}
7862+
zval_opt_copy_ctor_no_imm(top);
78717863
}
78727864
ZEND_VM_NEXT_OPCODE();
78737865
}
@@ -8434,9 +8426,7 @@ static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
84348426

84358427
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
84368428
if (!1) {
8437-
if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
8438-
zval_opt_copy_ctor(EX_VAR(opline->result.var));
8439-
}
8429+
zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
84408430
}
84418431

84428432
CHECK_EXCEPTION();
@@ -8457,9 +8447,7 @@ static int ZEND_FASTCALL ZEND_QM_ASSIGN_VAR_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLE
84578447
} else {
84588448
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
84598449
if (!1) {
8460-
if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
8461-
zval_opt_copy_ctor(EX_VAR(opline->result.var));
8462-
}
8450+
zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
84638451
}
84648452
}
84658453

@@ -12843,8 +12831,8 @@ static int ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1284312831
} else {
1284412832
if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
1284512833
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
12846-
if (IS_VAR == IS_CONST && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
12847-
zval_opt_copy_ctor(EX(return_value));
12834+
if (IS_VAR == IS_CONST) {
12835+
zval_opt_copy_ctor_no_imm(EX(return_value));
1284812836
}
1284912837
} else if (Z_ISREF_P(retval_ptr)) {
1285012838
ZVAL_DUP(EX(return_value), Z_REFVAL_P(retval_ptr));
@@ -12880,8 +12868,8 @@ static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLE
1288012868
}
1288112869
} else {
1288212870
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
12883-
if (IS_VAR != IS_TMP_VAR && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
12884-
zval_opt_copy_ctor(EX(return_value));
12871+
if (IS_VAR != IS_TMP_VAR) {
12872+
zval_opt_copy_ctor_no_imm(EX(return_value));
1288512873
}
1288612874
}
1288712875
break;
@@ -12956,9 +12944,7 @@ static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_AR
1295612944
ZVAL_COPY_VALUE(top, Z_REFVAL_P(varptr));
1295712945
/* Immutable arrays may be passed without copying ??? */
1295812946
/* some internal functions may try to modify them !!! */
12959-
if (!Z_OPT_IMMUTABLE_P(top)) {
12960-
zval_opt_copy_ctor(top);
12961-
}
12947+
zval_opt_copy_ctor_no_imm(top);
1296212948
zval_ptr_dtor_nogc(free_op1.var);
1296312949
} else {
1296412950
ZVAL_COPY_VALUE(top, varptr);
@@ -13082,9 +13068,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
1308213068
ZVAL_COPY_VALUE(top, Z_REFVAL_P(varptr));
1308313069
/* Immutable arrays may be passed without copying ??? */
1308413070
/* some internal functions may try to modify them !!! */
13085-
if (!Z_OPT_IMMUTABLE_P(top)) {
13086-
zval_opt_copy_ctor(top);
13087-
}
13071+
zval_opt_copy_ctor_no_imm(top);
1308813072
zval_ptr_dtor_nogc(free_op1.var);
1308913073
} else {
1309013074
ZVAL_COPY_VALUE(top, varptr);
@@ -13780,9 +13764,7 @@ static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
1378013764

1378113765
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
1378213766
if (!0) {
13783-
if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
13784-
zval_opt_copy_ctor(EX_VAR(opline->result.var));
13785-
}
13767+
zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
1378613768
}
1378713769
zval_ptr_dtor_nogc(free_op1.var);
1378813770
CHECK_EXCEPTION();
@@ -13803,9 +13785,7 @@ static int ZEND_FASTCALL ZEND_QM_ASSIGN_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLE
1380313785
} else {
1380413786
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
1380513787
if (!0) {
13806-
if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
13807-
zval_opt_copy_ctor(EX_VAR(opline->result.var));
13808-
}
13788+
zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
1380913789
}
1381013790
}
1381113791

@@ -29955,8 +29935,8 @@ static int ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2995529935
} else {
2995629936
if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
2995729937
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
29958-
if (IS_CV == IS_CONST && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
29959-
zval_opt_copy_ctor(EX(return_value));
29938+
if (IS_CV == IS_CONST) {
29939+
zval_opt_copy_ctor_no_imm(EX(return_value));
2996029940
}
2996129941
} else if (Z_ISREF_P(retval_ptr)) {
2996229942
ZVAL_DUP(EX(return_value), Z_REFVAL_P(retval_ptr));
@@ -29992,8 +29972,8 @@ static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER
2999229972
}
2999329973
} else {
2999429974
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
29995-
if (IS_CV != IS_TMP_VAR && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
29996-
zval_opt_copy_ctor(EX(return_value));
29975+
if (IS_CV != IS_TMP_VAR) {
29976+
zval_opt_copy_ctor_no_imm(EX(return_value));
2999729977
}
2999829978
}
2999929979
break;
@@ -30067,9 +30047,7 @@ static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARG
3006730047
ZVAL_COPY_VALUE(top, Z_REFVAL_P(varptr));
3006830048
/* Immutable arrays may be passed without copying ??? */
3006930049
/* some internal functions may try to modify them !!! */
30070-
if (!Z_OPT_IMMUTABLE_P(top)) {
30071-
zval_opt_copy_ctor(top);
30072-
}
30050+
zval_opt_copy_ctor_no_imm(top);
3007330051

3007430052
} else {
3007530053
ZVAL_COPY_VALUE(top, varptr);
@@ -30192,9 +30170,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
3019230170
ZVAL_COPY_VALUE(top, Z_REFVAL_P(varptr));
3019330171
/* Immutable arrays may be passed without copying ??? */
3019430172
/* some internal functions may try to modify them !!! */
30195-
if (!Z_OPT_IMMUTABLE_P(top)) {
30196-
zval_opt_copy_ctor(top);
30197-
}
30173+
zval_opt_copy_ctor_no_imm(top);
3019830174

3019930175
} else {
3020030176
ZVAL_COPY_VALUE(top, varptr);
@@ -30737,9 +30713,7 @@ static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
3073730713

3073830714
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
3073930715
if (!0) {
30740-
if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
30741-
zval_opt_copy_ctor(EX_VAR(opline->result.var));
30742-
}
30716+
zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
3074330717
}
3074430718

3074530719
CHECK_EXCEPTION();
@@ -30760,9 +30734,7 @@ static int ZEND_FASTCALL ZEND_QM_ASSIGN_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER
3076030734
} else {
3076130735
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
3076230736
if (!0) {
30763-
if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
30764-
zval_opt_copy_ctor(EX_VAR(opline->result.var));
30765-
}
30737+
zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
3076630738
}
3076730739
}
3076830740

0 commit comments

Comments
 (0)