]> granicus.if.org Git - php/commitdiff
Optimized conditions order
authorDmitry Stogov <dmitry@zend.com>
Tue, 3 Jun 2014 05:45:09 +0000 (09:45 +0400)
committerDmitry Stogov <dmitry@zend.com>
Tue, 3 Jun 2014 05:45:09 +0000 (09:45 +0400)
Zend/zend_execute.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index b3b7c0a0018eac4bf5ddaded74216766047bff4e..a9b9c92b0e55c3d06c587ccd06b9af7b240baebd 100644 (file)
@@ -1122,7 +1122,12 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *
 
        ZVAL_DEREF(container);
        if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
-               SEPARATE_ZVAL(container);
+               if (Z_IMMUTABLE_P(container)) {
+                       zval_copy_ctor_func(container);
+               } else if (Z_REFCOUNT_P(container) > 1) {
+                       Z_DELREF_P(container);
+                       zval_copy_ctor_func(container);
+               }
 fetch_from_array:
                if (dim == NULL) {
                        retval = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval));
index f41803bfaedf21feff2fa20364fa5d324898c7e1..3329b14949189f8c559a74dc7164ab93d3b10acc 100644 (file)
@@ -456,8 +456,11 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_dim_helper, VAR|UNUSED|CV, CONST|TMP|VAR
                ZEND_VM_C_GOTO(assign_op_dim_exit);
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -508,8 +511,11 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_helper, VAR|UNUSED|CV, CONST|TMP|VAR|UNU
                ZEND_VM_C_GOTO(assign_op_exit);
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -3660,7 +3666,7 @@ ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, VAR|CONST|UNUSED, CONST)
                                value = CACHED_PTR(Z_CACHE_SLOT_P(opline->op2.zv));
                                ZVAL_DEREF(value);
                                ZVAL_DUP(EX_VAR(opline->result.var), value);
-                               goto constant_fetch_end;
+                               ZEND_VM_C_GOTO(constant_fetch_end);
                        } else if (CACHED_PTR(Z_CACHE_SLOT_P(opline->op1.zv))) {
                                ce = CACHED_PTR(Z_CACHE_SLOT_P(opline->op1.zv));
                        } else {
@@ -3678,7 +3684,7 @@ ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, VAR|CONST|UNUSED, CONST)
                        if ((value = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(opline->op2.zv), ce)) != NULL) {
                                ZVAL_DEREF(value);
                                ZVAL_DUP(EX_VAR(opline->result.var), value);
-                               goto constant_fetch_end;
+                               ZEND_VM_C_GOTO(constant_fetch_end);
                        }
                }
 
@@ -3705,7 +3711,7 @@ ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, VAR|CONST|UNUSED, CONST)
                        zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(opline->op2.zv));
                }
        }
-constant_fetch_end:
+ZEND_VM_C_LABEL(constant_fetch_end):
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
index c156748d279188bc9a7c364b0a4061aa947fc513..316011fef84d3f5d6fc84a0a6aee0c5e5a5eba0d 100644 (file)
@@ -14219,8 +14219,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(int (*b
                goto assign_op_dim_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -14271,8 +14274,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CONST(int (*binar
                goto assign_op_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -16582,8 +16588,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_TMP(int (*bin
                goto assign_op_dim_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -16634,8 +16643,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_TMP(int (*binary_
                goto assign_op_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -18563,8 +18575,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_VAR(int (*bin
                goto assign_op_dim_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -18615,8 +18630,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_VAR(int (*binary_
                goto assign_op_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -20631,8 +20649,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(int (*
                goto assign_op_dim_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -20683,8 +20704,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_UNUSED(int (*bina
                goto assign_op_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -22084,8 +22108,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_CV(int (*bina
                goto assign_op_dim_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -22136,8 +22163,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CV(int (*binary_o
                goto assign_op_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -23921,8 +23951,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_CONST(int
                goto assign_op_dim_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -23973,8 +24006,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_CONST(int (*bi
                goto assign_op_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -25278,8 +25314,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_TMP(int (*
                goto assign_op_dim_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -25330,8 +25369,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_TMP(int (*bina
                goto assign_op_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -26556,8 +26598,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_VAR(int (*
                goto assign_op_dim_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -26608,8 +26653,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_VAR(int (*bina
                goto assign_op_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -27833,8 +27881,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_UNUSED(int
                goto assign_op_dim_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -27885,8 +27936,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(int (*b
                goto assign_op_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -28349,8 +28403,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_CV(int (*b
                goto assign_op_dim_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -28401,8 +28458,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_CV(int (*binar
                goto assign_op_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -31166,8 +31226,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_CONST(int (*bi
                goto assign_op_dim_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -31218,8 +31281,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_CONST(int (*binary
                goto assign_op_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -33320,8 +33386,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_TMP(int (*bina
                goto assign_op_dim_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -33372,8 +33441,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_TMP(int (*binary_o
                goto assign_op_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -35184,8 +35256,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_VAR(int (*bina
                goto assign_op_dim_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -35236,8 +35311,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_VAR(int (*binary_o
                goto assign_op_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -37134,8 +37212,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(int (*b
                goto assign_op_dim_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -37186,8 +37267,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_UNUSED(int (*binar
                goto assign_op_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -38453,8 +38537,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_CV(int (*binar
                goto assign_op_dim_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
@@ -38505,8 +38592,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_CV(int (*binary_op
                goto assign_op_exit;
        }
 
-       SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
-       ZVAL_DEREF(var_ptr);
+       if (EXPECTED(!Z_ISREF_P(var_ptr))) {
+               SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
+       } else {
+               ZVAL_DEREF(var_ptr);
+       }
 
        if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
            UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {