]> granicus.if.org Git - php/commitdiff
Micro optimizations for isset/empty
authorDmitry Stogov <dmitry@zend.com>
Thu, 16 Oct 2014 20:17:13 +0000 (00:17 +0400)
committerDmitry Stogov <dmitry@zend.com>
Thu, 16 Oct 2014 20:17:13 +0000 (00:17 +0400)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index ae2f0e716140bb088e5788dcd96ff16c740480ab..fad4d5b99cfa01b563f77e3320501f6337d75f9d 100644 (file)
@@ -4848,18 +4848,22 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
 {
        USE_OPLINE
        zval *value;
-       zend_bool isset = 1;
 
        SAVE_OPLINE();
        if (OP1_TYPE == IS_CV &&
            OP2_TYPE == IS_UNUSED &&
            (opline->extended_value & ZEND_QUICK_SET)) {
-               if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
-                       value = EX_VAR(opline->op1.var);
-                       ZVAL_DEREF(value);
-               } else {
-                       isset = 0;
+               value = EX_VAR(opline->op1.var);
+               if (opline->extended_value & ZEND_ISSET) {              
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !i_zend_is_true(value TSRMLS_CC));
+                       CHECK_EXCEPTION();
                }
+               ZEND_VM_NEXT_OPCODE();
        } else {
                zend_free_op free_op1;
                zval tmp, *varname = GET_OP1_ZVAL_PTR(BP_VAR_IS);
@@ -4887,40 +4891,28 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
                                ce = Z_CE_P(EX_VAR(opline->op2.var));
                        }
                        value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((OP1_TYPE == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
-                       if (!value) {
-                               isset = 0;
-                       }
                } else {
                        HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
-                       if (!value || Z_ISUNDEF_P(value)) {
-                               isset = 0;
-                       }
                }
 
                if (OP1_TYPE != IS_CONST && varname == &tmp) {
                        zval_dtor(&tmp);
                }
                FREE_OP1();
-       }
 
-       if (opline->extended_value & ZEND_ISSET) {              
-               if (isset && Z_TYPE_P(value) != IS_NULL &&
-                   (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
-               }
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
-               if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+               if (opline->extended_value & ZEND_ISSET) {              
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               value && Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !value || !i_zend_is_true(value TSRMLS_CC));
                }
-       }
 
-       CHECK_EXCEPTION();
-       ZEND_VM_NEXT_OPCODE();
+               CHECK_EXCEPTION();
+               ZEND_VM_NEXT_OPCODE();
+       }
 }
 
 ZEND_VM_HANDLER(115, ZEND_ISSET_ISEMPTY_DIM_OBJ, CONST|TMP|VAR|UNUSED|CV, CONST|TMP|VAR|CV)
@@ -4936,7 +4928,7 @@ ZEND_VM_HANDLER(115, ZEND_ISSET_ISEMPTY_DIM_OBJ, CONST|TMP|VAR|UNUSED|CV, CONST|
        container = GET_OP1_OBJ_ZVAL_PTR_DEREF(BP_VAR_IS);
        offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
 
-       if (OP1_TYPE != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (OP1_TYPE != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -4989,8 +4981,8 @@ ZEND_VM_C_LABEL(num_index_prop):
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (OP1_TYPE == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (OP1_TYPE == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -4999,7 +4991,7 @@ ZEND_VM_C_LABEL(num_index_prop):
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -5015,7 +5007,7 @@ ZEND_VM_C_LABEL(num_index_prop):
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -5049,8 +5041,8 @@ ZEND_VM_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, CONST|TMP|VAR|UNUSED|CV, CONST
        container = GET_OP1_OBJ_ZVAL_PTR_DEREF(BP_VAR_IS);
        offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
 
-       if (OP1_TYPE == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (OP1_TYPE == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((OP2_TYPE == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
index 5d448c34d48bfdda3a973af4a3bc6b2aff900f85..4b58d9561878c88e488c2ec81ee3eaad04055988 100644 (file)
@@ -4565,18 +4565,22 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER(ZEND_O
 {
        USE_OPLINE
        zval *value;
-       zend_bool isset = 1;
 
        SAVE_OPLINE();
        if (IS_CONST == IS_CV &&
            IS_CONST == IS_UNUSED &&
            (opline->extended_value & ZEND_QUICK_SET)) {
-               if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
-                       value = EX_VAR(opline->op1.var);
-                       ZVAL_DEREF(value);
-               } else {
-                       isset = 0;
+               value = EX_VAR(opline->op1.var);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !i_zend_is_true(value TSRMLS_CC));
+                       CHECK_EXCEPTION();
                }
+               ZEND_VM_NEXT_OPCODE();
        } else {
 
                zval tmp, *varname = opline->op1.zv;
@@ -4604,40 +4608,27 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER(ZEND_O
                                ce = Z_CE_P(EX_VAR(opline->op2.var));
                        }
                        value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
-                       if (!value) {
-                               isset = 0;
-                       }
                } else {
                        HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
-                       if (!value || Z_ISUNDEF_P(value)) {
-                               isset = 0;
-                       }
                }
 
                if (IS_CONST != IS_CONST && varname == &tmp) {
                        zval_dtor(&tmp);
                }
 
-       }
-
-       if (opline->extended_value & ZEND_ISSET) {
-               if (isset && Z_TYPE_P(value) != IS_NULL &&
-                   (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
-               }
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
-               if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               value && Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !value || !i_zend_is_true(value TSRMLS_CC));
                }
-       }
 
-       CHECK_EXCEPTION();
-       ZEND_VM_NEXT_OPCODE();
+               CHECK_EXCEPTION();
+               ZEND_VM_NEXT_OPCODE();
+       }
 }
 
 static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -4653,7 +4644,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST_HANDLER(ZE
        container = opline->op1.zv;
        offset = opline->op2.zv;
 
-       if (IS_CONST != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_CONST != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -4706,8 +4697,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_CONST == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_CONST == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -4716,7 +4707,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -4732,7 +4723,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -4765,8 +4756,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST_HANDLER(Z
        container = opline->op1.zv;
        offset = opline->op2.zv;
 
-       if (IS_CONST == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_CONST == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -5727,7 +5718,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMP_HANDLER(ZEND
        container = opline->op1.zv;
        offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_CONST != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_CONST != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -5780,8 +5771,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_CONST == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_CONST == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -5790,7 +5781,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -5806,7 +5797,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -5840,8 +5831,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMP_HANDLER(ZEN
        container = opline->op1.zv;
        offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_CONST == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_CONST == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -6987,18 +6978,22 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPC
 {
        USE_OPLINE
        zval *value;
-       zend_bool isset = 1;
 
        SAVE_OPLINE();
        if (IS_CONST == IS_CV &&
            IS_VAR == IS_UNUSED &&
            (opline->extended_value & ZEND_QUICK_SET)) {
-               if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
-                       value = EX_VAR(opline->op1.var);
-                       ZVAL_DEREF(value);
-               } else {
-                       isset = 0;
+               value = EX_VAR(opline->op1.var);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !i_zend_is_true(value TSRMLS_CC));
+                       CHECK_EXCEPTION();
                }
+               ZEND_VM_NEXT_OPCODE();
        } else {
 
                zval tmp, *varname = opline->op1.zv;
@@ -7026,40 +7021,27 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPC
                                ce = Z_CE_P(EX_VAR(opline->op2.var));
                        }
                        value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
-                       if (!value) {
-                               isset = 0;
-                       }
                } else {
                        HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
-                       if (!value || Z_ISUNDEF_P(value)) {
-                               isset = 0;
-                       }
                }
 
                if (IS_CONST != IS_CONST && varname == &tmp) {
                        zval_dtor(&tmp);
                }
 
-       }
-
-       if (opline->extended_value & ZEND_ISSET) {
-               if (isset && Z_TYPE_P(value) != IS_NULL &&
-                   (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
-               }
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
-               if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               value && Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !value || !i_zend_is_true(value TSRMLS_CC));
                }
-       }
 
-       CHECK_EXCEPTION();
-       ZEND_VM_NEXT_OPCODE();
+               CHECK_EXCEPTION();
+               ZEND_VM_NEXT_OPCODE();
+       }
 }
 
 static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -7075,7 +7057,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_VAR_HANDLER(ZEND
        container = opline->op1.zv;
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_CONST != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_CONST != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -7128,8 +7110,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_CONST == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_CONST == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -7138,7 +7120,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -7154,7 +7136,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -7188,8 +7170,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_VAR_HANDLER(ZEN
        container = opline->op1.zv;
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_CONST == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_CONST == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -7862,18 +7844,22 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_
 {
        USE_OPLINE
        zval *value;
-       zend_bool isset = 1;
 
        SAVE_OPLINE();
        if (IS_CONST == IS_CV &&
            IS_UNUSED == IS_UNUSED &&
            (opline->extended_value & ZEND_QUICK_SET)) {
-               if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
-                       value = EX_VAR(opline->op1.var);
-                       ZVAL_DEREF(value);
-               } else {
-                       isset = 0;
+               value = EX_VAR(opline->op1.var);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !i_zend_is_true(value TSRMLS_CC));
+                       CHECK_EXCEPTION();
                }
+               ZEND_VM_NEXT_OPCODE();
        } else {
 
                zval tmp, *varname = opline->op1.zv;
@@ -7901,40 +7887,27 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_
                                ce = Z_CE_P(EX_VAR(opline->op2.var));
                        }
                        value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
-                       if (!value) {
-                               isset = 0;
-                       }
                } else {
                        HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
-                       if (!value || Z_ISUNDEF_P(value)) {
-                               isset = 0;
-                       }
                }
 
                if (IS_CONST != IS_CONST && varname == &tmp) {
                        zval_dtor(&tmp);
                }
 
-       }
-
-       if (opline->extended_value & ZEND_ISSET) {
-               if (isset && Z_TYPE_P(value) != IS_NULL &&
-                   (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
-               }
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
-               if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               value && Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !value || !i_zend_is_true(value TSRMLS_CC));
                }
-       }
 
-       CHECK_EXCEPTION();
-       ZEND_VM_NEXT_OPCODE();
+               CHECK_EXCEPTION();
+               ZEND_VM_NEXT_OPCODE();
+       }
 }
 
 static int ZEND_FASTCALL  ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -8905,7 +8878,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CV_HANDLER(ZEND_
        container = opline->op1.zv;
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
 
-       if (IS_CONST != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_CONST != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -8958,8 +8931,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_CONST == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_CONST == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -8968,7 +8941,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -8984,7 +8957,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -9017,8 +8990,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV_HANDLER(ZEND
        container = opline->op1.zv;
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
 
-       if (IS_CONST == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_CONST == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -11266,18 +11239,22 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPC
 {
        USE_OPLINE
        zval *value;
-       zend_bool isset = 1;
 
        SAVE_OPLINE();
        if (IS_TMP_VAR == IS_CV &&
            IS_CONST == IS_UNUSED &&
            (opline->extended_value & ZEND_QUICK_SET)) {
-               if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
-                       value = EX_VAR(opline->op1.var);
-                       ZVAL_DEREF(value);
-               } else {
-                       isset = 0;
+               value = EX_VAR(opline->op1.var);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !i_zend_is_true(value TSRMLS_CC));
+                       CHECK_EXCEPTION();
                }
+               ZEND_VM_NEXT_OPCODE();
        } else {
                zend_free_op free_op1;
                zval tmp, *varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
@@ -11305,40 +11282,28 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPC
                                ce = Z_CE_P(EX_VAR(opline->op2.var));
                        }
                        value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
-                       if (!value) {
-                               isset = 0;
-                       }
                } else {
                        HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
-                       if (!value || Z_ISUNDEF_P(value)) {
-                               isset = 0;
-                       }
                }
 
                if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
                        zval_dtor(&tmp);
                }
                zval_ptr_dtor_nogc(free_op1.var);
-       }
 
-       if (opline->extended_value & ZEND_ISSET) {
-               if (isset && Z_TYPE_P(value) != IS_NULL &&
-                   (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
-               }
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
-               if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               value && Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !value || !i_zend_is_true(value TSRMLS_CC));
                }
-       }
 
-       CHECK_EXCEPTION();
-       ZEND_VM_NEXT_OPCODE();
+               CHECK_EXCEPTION();
+               ZEND_VM_NEXT_OPCODE();
+       }
 }
 
 static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -11354,7 +11319,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_CONST_HANDLER(ZEND
        container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        offset = opline->op2.zv;
 
-       if (IS_TMP_VAR != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_TMP_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -11407,8 +11372,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_TMP_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_TMP_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -11417,7 +11382,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -11433,7 +11398,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -11466,8 +11431,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMP_CONST_HANDLER(ZEN
        container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        offset = opline->op2.zv;
 
-       if (IS_TMP_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_TMP_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -12368,7 +12333,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_TMP_HANDLER(ZEND_O
        container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_TMP_VAR != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_TMP_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -12421,8 +12386,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_TMP_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_TMP_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -12431,7 +12396,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -12447,7 +12412,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -12481,8 +12446,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMP_TMP_HANDLER(ZEND_
        container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_TMP_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_TMP_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -13601,18 +13566,22 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD
 {
        USE_OPLINE
        zval *value;
-       zend_bool isset = 1;
 
        SAVE_OPLINE();
        if (IS_TMP_VAR == IS_CV &&
            IS_VAR == IS_UNUSED &&
            (opline->extended_value & ZEND_QUICK_SET)) {
-               if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
-                       value = EX_VAR(opline->op1.var);
-                       ZVAL_DEREF(value);
-               } else {
-                       isset = 0;
+               value = EX_VAR(opline->op1.var);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !i_zend_is_true(value TSRMLS_CC));
+                       CHECK_EXCEPTION();
                }
+               ZEND_VM_NEXT_OPCODE();
        } else {
                zend_free_op free_op1;
                zval tmp, *varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
@@ -13640,40 +13609,28 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD
                                ce = Z_CE_P(EX_VAR(opline->op2.var));
                        }
                        value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
-                       if (!value) {
-                               isset = 0;
-                       }
                } else {
                        HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
-                       if (!value || Z_ISUNDEF_P(value)) {
-                               isset = 0;
-                       }
                }
 
                if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
                        zval_dtor(&tmp);
                }
                zval_ptr_dtor_nogc(free_op1.var);
-       }
 
-       if (opline->extended_value & ZEND_ISSET) {
-               if (isset && Z_TYPE_P(value) != IS_NULL &&
-                   (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
-               }
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
-               if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               value && Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !value || !i_zend_is_true(value TSRMLS_CC));
                }
-       }
 
-       CHECK_EXCEPTION();
-       ZEND_VM_NEXT_OPCODE();
+               CHECK_EXCEPTION();
+               ZEND_VM_NEXT_OPCODE();
+       }
 }
 
 static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -13689,7 +13646,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_VAR_HANDLER(ZEND_O
        container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_TMP_VAR != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_TMP_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -13742,8 +13699,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_TMP_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_TMP_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -13752,7 +13709,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -13768,7 +13725,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -13802,8 +13759,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMP_VAR_HANDLER(ZEND_
        container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_TMP_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_TMP_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -14352,18 +14309,22 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OP
 {
        USE_OPLINE
        zval *value;
-       zend_bool isset = 1;
 
        SAVE_OPLINE();
        if (IS_TMP_VAR == IS_CV &&
            IS_UNUSED == IS_UNUSED &&
            (opline->extended_value & ZEND_QUICK_SET)) {
-               if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
-                       value = EX_VAR(opline->op1.var);
-                       ZVAL_DEREF(value);
-               } else {
-                       isset = 0;
+               value = EX_VAR(opline->op1.var);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !i_zend_is_true(value TSRMLS_CC));
+                       CHECK_EXCEPTION();
                }
+               ZEND_VM_NEXT_OPCODE();
        } else {
                zend_free_op free_op1;
                zval tmp, *varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
@@ -14391,40 +14352,28 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OP
                                ce = Z_CE_P(EX_VAR(opline->op2.var));
                        }
                        value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
-                       if (!value) {
-                               isset = 0;
-                       }
                } else {
                        HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
-                       if (!value || Z_ISUNDEF_P(value)) {
-                               isset = 0;
-                       }
                }
 
                if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
                        zval_dtor(&tmp);
                }
                zval_ptr_dtor_nogc(free_op1.var);
-       }
 
-       if (opline->extended_value & ZEND_ISSET) {
-               if (isset && Z_TYPE_P(value) != IS_NULL &&
-                   (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
-               }
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
-               if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               value && Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !value || !i_zend_is_true(value TSRMLS_CC));
                }
-       }
 
-       CHECK_EXCEPTION();
-       ZEND_VM_NEXT_OPCODE();
+               CHECK_EXCEPTION();
+               ZEND_VM_NEXT_OPCODE();
+       }
 }
 
 static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -15289,7 +15238,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_CV_HANDLER(ZEND_OP
        container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
 
-       if (IS_TMP_VAR != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_TMP_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -15342,8 +15291,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_TMP_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_TMP_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -15352,7 +15301,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -15368,7 +15317,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -15401,8 +15350,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMP_CV_HANDLER(ZEND_O
        container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
 
-       if (IS_TMP_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_TMP_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -19307,18 +19256,22 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPC
 {
        USE_OPLINE
        zval *value;
-       zend_bool isset = 1;
 
        SAVE_OPLINE();
        if (IS_VAR == IS_CV &&
            IS_CONST == IS_UNUSED &&
            (opline->extended_value & ZEND_QUICK_SET)) {
-               if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
-                       value = EX_VAR(opline->op1.var);
-                       ZVAL_DEREF(value);
-               } else {
-                       isset = 0;
+               value = EX_VAR(opline->op1.var);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !i_zend_is_true(value TSRMLS_CC));
+                       CHECK_EXCEPTION();
                }
+               ZEND_VM_NEXT_OPCODE();
        } else {
                zend_free_op free_op1;
                zval tmp, *varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
@@ -19346,40 +19299,28 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPC
                                ce = Z_CE_P(EX_VAR(opline->op2.var));
                        }
                        value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
-                       if (!value) {
-                               isset = 0;
-                       }
                } else {
                        HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
-                       if (!value || Z_ISUNDEF_P(value)) {
-                               isset = 0;
-                       }
                }
 
                if (IS_VAR != IS_CONST && varname == &tmp) {
                        zval_dtor(&tmp);
                }
                zval_ptr_dtor_nogc(free_op1.var);
-       }
 
-       if (opline->extended_value & ZEND_ISSET) {
-               if (isset && Z_TYPE_P(value) != IS_NULL &&
-                   (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
-               }
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
-               if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               value && Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !value || !i_zend_is_true(value TSRMLS_CC));
                }
-       }
 
-       CHECK_EXCEPTION();
-       ZEND_VM_NEXT_OPCODE();
+               CHECK_EXCEPTION();
+               ZEND_VM_NEXT_OPCODE();
+       }
 }
 
 static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -19395,7 +19336,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_CONST_HANDLER(ZEND
        container = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        offset = opline->op2.zv;
 
-       if (IS_VAR != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -19448,8 +19389,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -19458,7 +19399,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -19474,7 +19415,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -19507,8 +19448,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_CONST_HANDLER(ZEN
        container = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        offset = opline->op2.zv;
 
-       if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -21405,7 +21346,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_O
        container = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_VAR != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -21458,8 +21399,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -21468,7 +21409,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -21484,7 +21425,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -21518,8 +21459,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_
        container = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -23698,18 +23639,22 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD
 {
        USE_OPLINE
        zval *value;
-       zend_bool isset = 1;
 
        SAVE_OPLINE();
        if (IS_VAR == IS_CV &&
            IS_VAR == IS_UNUSED &&
            (opline->extended_value & ZEND_QUICK_SET)) {
-               if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
-                       value = EX_VAR(opline->op1.var);
-                       ZVAL_DEREF(value);
-               } else {
-                       isset = 0;
+               value = EX_VAR(opline->op1.var);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !i_zend_is_true(value TSRMLS_CC));
+                       CHECK_EXCEPTION();
                }
+               ZEND_VM_NEXT_OPCODE();
        } else {
                zend_free_op free_op1;
                zval tmp, *varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
@@ -23737,40 +23682,28 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD
                                ce = Z_CE_P(EX_VAR(opline->op2.var));
                        }
                        value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
-                       if (!value) {
-                               isset = 0;
-                       }
                } else {
                        HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
-                       if (!value || Z_ISUNDEF_P(value)) {
-                               isset = 0;
-                       }
                }
 
                if (IS_VAR != IS_CONST && varname == &tmp) {
                        zval_dtor(&tmp);
                }
                zval_ptr_dtor_nogc(free_op1.var);
-       }
 
-       if (opline->extended_value & ZEND_ISSET) {
-               if (isset && Z_TYPE_P(value) != IS_NULL &&
-                   (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
-               }
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
-               if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               value && Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !value || !i_zend_is_true(value TSRMLS_CC));
                }
-       }
 
-       CHECK_EXCEPTION();
-       ZEND_VM_NEXT_OPCODE();
+               CHECK_EXCEPTION();
+               ZEND_VM_NEXT_OPCODE();
+       }
 }
 
 static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -23786,7 +23719,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_O
        container = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_VAR != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -23839,8 +23772,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -23849,7 +23782,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -23865,7 +23798,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -23899,8 +23832,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_
        container = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -25040,18 +24973,22 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OP
 {
        USE_OPLINE
        zval *value;
-       zend_bool isset = 1;
 
        SAVE_OPLINE();
        if (IS_VAR == IS_CV &&
            IS_UNUSED == IS_UNUSED &&
            (opline->extended_value & ZEND_QUICK_SET)) {
-               if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
-                       value = EX_VAR(opline->op1.var);
-                       ZVAL_DEREF(value);
-               } else {
-                       isset = 0;
+               value = EX_VAR(opline->op1.var);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !i_zend_is_true(value TSRMLS_CC));
+                       CHECK_EXCEPTION();
                }
+               ZEND_VM_NEXT_OPCODE();
        } else {
                zend_free_op free_op1;
                zval tmp, *varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
@@ -25079,40 +25016,28 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OP
                                ce = Z_CE_P(EX_VAR(opline->op2.var));
                        }
                        value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
-                       if (!value) {
-                               isset = 0;
-                       }
                } else {
                        HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
-                       if (!value || Z_ISUNDEF_P(value)) {
-                               isset = 0;
-                       }
                }
 
                if (IS_VAR != IS_CONST && varname == &tmp) {
                        zval_dtor(&tmp);
                }
                zval_ptr_dtor_nogc(free_op1.var);
-       }
 
-       if (opline->extended_value & ZEND_ISSET) {
-               if (isset && Z_TYPE_P(value) != IS_NULL &&
-                   (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
-               }
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
-               if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               value && Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !value || !i_zend_is_true(value TSRMLS_CC));
                }
-       }
 
-       CHECK_EXCEPTION();
-       ZEND_VM_NEXT_OPCODE();
+               CHECK_EXCEPTION();
+               ZEND_VM_NEXT_OPCODE();
+       }
 }
 
 static int ZEND_FASTCALL  ZEND_SEPARATE_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -27051,7 +26976,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OP
        container = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
 
-       if (IS_VAR != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -27104,8 +27029,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -27114,7 +27039,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -27130,7 +27055,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -27163,8 +27088,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_CV_HANDLER(ZEND_O
        container = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
 
-       if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -28537,7 +28462,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_CONST_HANDLER(Z
        container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
        offset = opline->op2.zv;
 
-       if (IS_UNUSED != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_UNUSED != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -28590,8 +28515,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -28600,7 +28525,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -28616,7 +28541,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -28649,8 +28574,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST_HANDLER(
        container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
        offset = opline->op2.zv;
 
-       if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -29843,7 +29768,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEN
        container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
        offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_UNUSED != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_UNUSED != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -29896,8 +29821,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -29906,7 +29831,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -29922,7 +29847,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -29956,8 +29881,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMP_HANDLER(ZE
        container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
        offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -31151,7 +31076,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEN
        container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_UNUSED != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_UNUSED != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -31204,8 +31129,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -31214,7 +31139,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -31230,7 +31155,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -31264,8 +31189,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_VAR_HANDLER(ZE
        container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -32971,7 +32896,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND
        container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
 
-       if (IS_UNUSED != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_UNUSED != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -33024,8 +32949,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -33034,7 +32959,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -33050,7 +32975,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -33083,8 +33008,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV_HANDLER(ZEN
        container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
 
-       if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -36482,18 +36407,22 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCO
 {
        USE_OPLINE
        zval *value;
-       zend_bool isset = 1;
 
        SAVE_OPLINE();
        if (IS_CV == IS_CV &&
            IS_CONST == IS_UNUSED &&
            (opline->extended_value & ZEND_QUICK_SET)) {
-               if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
-                       value = EX_VAR(opline->op1.var);
-                       ZVAL_DEREF(value);
-               } else {
-                       isset = 0;
+               value = EX_VAR(opline->op1.var);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !i_zend_is_true(value TSRMLS_CC));
+                       CHECK_EXCEPTION();
                }
+               ZEND_VM_NEXT_OPCODE();
        } else {
 
                zval tmp, *varname = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
@@ -36521,40 +36450,27 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCO
                                ce = Z_CE_P(EX_VAR(opline->op2.var));
                        }
                        value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
-                       if (!value) {
-                               isset = 0;
-                       }
                } else {
                        HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
-                       if (!value || Z_ISUNDEF_P(value)) {
-                               isset = 0;
-                       }
                }
 
                if (IS_CV != IS_CONST && varname == &tmp) {
                        zval_dtor(&tmp);
                }
 
-       }
-
-       if (opline->extended_value & ZEND_ISSET) {
-               if (isset && Z_TYPE_P(value) != IS_NULL &&
-                   (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
-               }
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
-               if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               value && Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !value || !i_zend_is_true(value TSRMLS_CC));
                }
-       }
 
-       CHECK_EXCEPTION();
-       ZEND_VM_NEXT_OPCODE();
+               CHECK_EXCEPTION();
+               ZEND_VM_NEXT_OPCODE();
+       }
 }
 
 static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -36570,7 +36486,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST_HANDLER(ZEND_
        container = _get_zval_ptr_cv_deref_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
        offset = opline->op2.zv;
 
-       if (IS_CV != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_CV != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -36623,8 +36539,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -36633,7 +36549,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -36649,7 +36565,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -36682,8 +36598,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST_HANDLER(ZEND
        container = _get_zval_ptr_cv_deref_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
        offset = opline->op2.zv;
 
-       if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -38509,7 +38425,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OP
        container = _get_zval_ptr_cv_deref_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
        offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_CV != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_CV != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -38562,8 +38478,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -38572,7 +38488,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -38588,7 +38504,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -38622,8 +38538,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMP_HANDLER(ZEND_O
        container = _get_zval_ptr_cv_deref_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
        offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -40673,18 +40589,22 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE
 {
        USE_OPLINE
        zval *value;
-       zend_bool isset = 1;
 
        SAVE_OPLINE();
        if (IS_CV == IS_CV &&
            IS_VAR == IS_UNUSED &&
            (opline->extended_value & ZEND_QUICK_SET)) {
-               if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
-                       value = EX_VAR(opline->op1.var);
-                       ZVAL_DEREF(value);
-               } else {
-                       isset = 0;
+               value = EX_VAR(opline->op1.var);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !i_zend_is_true(value TSRMLS_CC));
+                       CHECK_EXCEPTION();
                }
+               ZEND_VM_NEXT_OPCODE();
        } else {
 
                zval tmp, *varname = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
@@ -40712,40 +40632,27 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE
                                ce = Z_CE_P(EX_VAR(opline->op2.var));
                        }
                        value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
-                       if (!value) {
-                               isset = 0;
-                       }
                } else {
                        HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
-                       if (!value || Z_ISUNDEF_P(value)) {
-                               isset = 0;
-                       }
                }
 
                if (IS_CV != IS_CONST && varname == &tmp) {
                        zval_dtor(&tmp);
                }
 
-       }
-
-       if (opline->extended_value & ZEND_ISSET) {
-               if (isset && Z_TYPE_P(value) != IS_NULL &&
-                   (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
-               }
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
-               if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               value && Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !value || !i_zend_is_true(value TSRMLS_CC));
                }
-       }
 
-       CHECK_EXCEPTION();
-       ZEND_VM_NEXT_OPCODE();
+               CHECK_EXCEPTION();
+               ZEND_VM_NEXT_OPCODE();
+       }
 }
 
 static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -40761,7 +40668,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OP
        container = _get_zval_ptr_cv_deref_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_CV != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_CV != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -40814,8 +40721,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -40824,7 +40731,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -40840,7 +40747,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -40874,8 +40781,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_VAR_HANDLER(ZEND_O
        container = _get_zval_ptr_cv_deref_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
 
-       if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -41889,18 +41796,22 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPC
 {
        USE_OPLINE
        zval *value;
-       zend_bool isset = 1;
 
        SAVE_OPLINE();
        if (IS_CV == IS_CV &&
            IS_UNUSED == IS_UNUSED &&
            (opline->extended_value & ZEND_QUICK_SET)) {
-               if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
-                       value = EX_VAR(opline->op1.var);
-                       ZVAL_DEREF(value);
-               } else {
-                       isset = 0;
+               value = EX_VAR(opline->op1.var);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !i_zend_is_true(value TSRMLS_CC));
+                       CHECK_EXCEPTION();
                }
+               ZEND_VM_NEXT_OPCODE();
        } else {
 
                zval tmp, *varname = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
@@ -41928,40 +41839,27 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPC
                                ce = Z_CE_P(EX_VAR(opline->op2.var));
                        }
                        value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
-                       if (!value) {
-                               isset = 0;
-                       }
                } else {
                        HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
                        value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
-                       if (!value || Z_ISUNDEF_P(value)) {
-                               isset = 0;
-                       }
                }
 
                if (IS_CV != IS_CONST && varname == &tmp) {
                        zval_dtor(&tmp);
                }
 
-       }
-
-       if (opline->extended_value & ZEND_ISSET) {
-               if (isset && Z_TYPE_P(value) != IS_NULL &&
-                   (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
-               }
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
-               if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 1);
-               } else {
-                       ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+               if (opline->extended_value & ZEND_ISSET) {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               value && Z_TYPE_P(value) > IS_NULL &&
+                           (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL));
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       ZVAL_BOOL(EX_VAR(opline->result.var),
+                               !value || !i_zend_is_true(value TSRMLS_CC));
                }
-       }
 
-       CHECK_EXCEPTION();
-       ZEND_VM_NEXT_OPCODE();
+               CHECK_EXCEPTION();
+               ZEND_VM_NEXT_OPCODE();
+       }
 }
 
 static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -43753,7 +43651,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPC
        container = _get_zval_ptr_cv_deref_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
 
-       if (IS_CV != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+       if (IS_CV != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
                HashTable *ht = Z_ARRVAL_P(container);
                zval *value;
                zend_string *str;
@@ -43806,8 +43704,8 @@ num_index_prop:
                } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
                        result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
                }
-       } else if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_dimension) {
+       } else if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
                        result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -43816,7 +43714,7 @@ num_index_prop:
                if ((opline->extended_value & ZEND_ISSET) == 0) {
                        result = !result;
                }
-       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+       } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
                zval tmp;
 
                result = 0;
@@ -43832,7 +43730,7 @@ num_index_prop:
                                offset = &tmp;
                        }
                }
-               if (Z_TYPE_P(offset) == IS_LONG) {
+               if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
                        if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
                                if ((opline->extended_value & ZEND_ISSET) ||
                                    Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -43865,8 +43763,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV_HANDLER(ZEND_OP
        container = _get_zval_ptr_cv_deref_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
 
-       if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
-               if (Z_OBJ_HT_P(container)->has_property) {
+       if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+               if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
                        result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
                } else {
                        zend_error(E_NOTICE, "Trying to check property of non-object");