com php-src: Improved check to avoid removing of dead code that may throw exception.: ext/opcache/Optimizer/sccp.c

From: Date: Thu, 31 Aug 2017 15:53:28 +0000
Subject: com php-src: Improved check to avoid removing of dead code that may throw exception.: ext/opcache/Optimizer/sccp.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-99210@lists.php.net to get a copy of this message
Commit: 2f1c4717d3d13c787065e4d89dfb0328973eb83b Author: Dmitry Stogov <dmitry@zend.com> Thu, 31 Aug 2017 18:53:28 +0300 Parents: 6cc9e805cdbef0729f9b9316f9be6109a69db5e0 Branches: master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=2f1c4717d3d13c787065e4d89dfb0328973eb83b Log: Improved check to avoid removing of dead code that may throw exception. Changed paths: M ext/opcache/Optimizer/sccp.c Diff: diff --git a/ext/opcache/Optimizer/sccp.c b/ext/opcache/Optimizer/sccp.c index 8a08a48..a644a49 100644 --- a/ext/opcache/Optimizer/sccp.c +++ b/ext/opcache/Optimizer/sccp.c @@ -1987,32 +1987,42 @@ static int try_remove_definition(sccp_ctx *ctx, int var_num, zend_ssa_var *var, } else if (ssa_op->op1_def == var_num) { /* Compound assign or incdec -> convert to direct ASSIGN */ - switch (opline->opcode) { - case ZEND_ASSIGN_DIM: - case ZEND_ASSIGN_OBJ: - case ZEND_ASSIGN_ADD: - case ZEND_ASSIGN_SUB: - case ZEND_ASSIGN_MUL: - case ZEND_ASSIGN_DIV: - case ZEND_ASSIGN_MOD: - case ZEND_ASSIGN_SL: - case ZEND_ASSIGN_SR: - case ZEND_ASSIGN_CONCAT: - case ZEND_ASSIGN_BW_OR: - case ZEND_ASSIGN_BW_AND: - case ZEND_ASSIGN_BW_XOR: - case ZEND_ASSIGN_POW: - case ZEND_PRE_INC_OBJ: - case ZEND_PRE_DEC_OBJ: - case ZEND_POST_INC_OBJ: - case ZEND_POST_DEC_OBJ: - if (opline->op2_type == IS_CV) { - if (OP2_INFO() & MAY_BE_UNDEF) { + if (!value) { + /* In some cases zend_may_throw() may be avoided */ + switch (opline->opcode) { + case ZEND_ASSIGN_DIM: + case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_ADD: + case ZEND_ASSIGN_SUB: + case ZEND_ASSIGN_MUL: + case ZEND_ASSIGN_DIV: + case ZEND_ASSIGN_MOD: + case ZEND_ASSIGN_SL: + case ZEND_ASSIGN_SR: + case ZEND_ASSIGN_CONCAT: + case ZEND_ASSIGN_BW_OR: + case ZEND_ASSIGN_BW_AND: + case ZEND_ASSIGN_BW_XOR: + case ZEND_ASSIGN_POW: + if ((ssa_op->op2_use >= 0 && !value_known(&ctx->values[ssa_op->op2_use])) + || ((ssa_op+1)->op1_use >= 0 &&!value_known(&ctx->values[(ssa_op+1)->op1_use]))) { return 0; } - } - default: - break; + break; + case ZEND_PRE_INC_OBJ: + case ZEND_PRE_DEC_OBJ: + case ZEND_POST_INC_OBJ: + case ZEND_POST_DEC_OBJ: + if (ssa_op->op2_use >= 0 && !value_known(&ctx->values[ssa_op->op2_use])) { + return 0; + } + break; + default: + if (zend_may_throw(opline, op_array, ssa)) { + return 0; + } + break; + } } /* Mark result unused, if possible */

« previous php.cvs (#99210) next »