diff --git a/Zend/Optimizer/block_pass.c b/Zend/Optimizer/block_pass.c index 61c8f420aa43f..c43d597dc2164 100644 --- a/Zend/Optimizer/block_pass.c +++ b/Zend/Optimizer/block_pass.c @@ -503,6 +503,19 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array MAKE_NOP(opline); ++(*opt_count); break; + case ZEND_TYPE_CHECK: + if (opline->opcode == ZEND_BOOL_NOT) { + if (src->extended_value == MAY_BE_RESOURCE || src->extended_value == (MAY_BE_ANY - MAY_BE_RESOURCE)) { + /* is_resource() is a special case - it returns false if the resource is closed. Don't convert to/from it. */ + break; + } + src->extended_value = MAY_BE_ANY - src->extended_value; + } + COPY_NODE(src->result, opline->result); + SET_VAR_SOURCE(src); + MAKE_NOP(opline); + ++(*opt_count); + break; case ZEND_IS_SMALLER: if (opline->opcode == ZEND_BOOL_NOT) { zend_uchar tmp_type; @@ -545,7 +558,6 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array case ZEND_ISSET_ISEMPTY_PROP_OBJ: case ZEND_ISSET_ISEMPTY_STATIC_PROP: case ZEND_INSTANCEOF: - case ZEND_TYPE_CHECK: case ZEND_DEFINED: case ZEND_IN_ARRAY: case ZEND_ARRAY_KEY_EXISTS: diff --git a/Zend/Optimizer/sccp.c b/Zend/Optimizer/sccp.c index f85f7c6ae39ec..7fb532a15fc0a 100644 --- a/Zend/Optimizer/sccp.c +++ b/Zend/Optimizer/sccp.c @@ -1003,7 +1003,7 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o SET_RESULT(result, &zv); return; } else if (!(type & ((MAY_BE_ANY|MAY_BE_UNDEF) - expected_type_mask)) - && !(expected_type_mask & MAY_BE_RESOURCE)) { + && !(type & expected_type_mask & MAY_BE_RESOURCE)) { ZVAL_TRUE(&zv); SET_RESULT(result, &zv); return; diff --git a/ext/opcache/tests/opt/sccp_026.phpt b/ext/opcache/tests/opt/sccp_026.phpt index 6d2108409b07f..8092714420fa1 100644 --- a/ext/opcache/tests/opt/sccp_026.phpt +++ b/ext/opcache/tests/opt/sccp_026.phpt @@ -30,8 +30,8 @@ test: ; (after optimizer) ; %s:2-8 0000 CV0($var) = RECV 1 -0001 T2 = TYPE_CHECK (string) CV0($var) -0002 JMPZ T2 0004 +0001 T2 = TYPE_CHECK TYPE [null, bool, long, double, array, object, resource] CV0($var) +0002 JMPNZ T2 0004 0003 JMP 0005 0004 RETURN null 0005 INIT_FCALL 1 %d string("var_dump")