com php-src: Fixed reference-counter inference: ext/opcache/Opt imizer/zend_dfg.c ext/opcache/Optimizer/zend_inference .c
ext/opcache/Optimizer/zend_ssa.c

From: Date: Mon, 31 Oct 2016 16:51:19 +0000
Subject: com php-src: Fixed reference-counter inference: ext/opcache/Opt imizer/zend_dfg.c ext/opcache/Optimizer/zend_inference .c
ext/opcache/Optimizer/zend_ssa.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-95367@lists.php.net to get a copy of this message
Commit: e696927e48b5433417a46a7377f2554d91755f89 Author: Dmitry Stogov <dmitry@zend.com> Mon, 31 Oct 2016 19:51:19 +0300 Parents: 1d1a7feecfab42bb3a0657ed684e11abeae45315 Branches: PHP-7.1 master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=e696927e48b5433417a46a7377f2554d91755f89 Log: Fixed reference-counter inference Changed paths: M ext/opcache/Optimizer/zend_dfg.c M ext/opcache/Optimizer/zend_inference.c M ext/opcache/Optimizer/zend_ssa.c Diff: diff --git a/ext/opcache/Optimizer/zend_dfg.c b/ext/opcache/Optimizer/zend_dfg.c index 693fcc8..6c52d6e 100644 --- a/ext/opcache/Optimizer/zend_dfg.c +++ b/ext/opcache/Optimizer/zend_dfg.c @@ -76,6 +76,9 @@ int zend_build_dfg(const zend_op_array *op_array, const zend_cfg *cfg, zend_dfg case ZEND_FE_RESET_R: case ZEND_SEND_VAR: case ZEND_CAST: + case ZEND_QM_ASSIGN: + case ZEND_JMP_SET: + case ZEND_COALESCE: if (build_flags & ZEND_SSA_RC_INFERENCE) { goto op1_def; } diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 0635cc5..1fff94e 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -1054,6 +1054,17 @@ int zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ssa, int case ZEND_QM_ASSIGN: case ZEND_JMP_SET: case ZEND_COALESCE: + if (ssa->ops[line].op1_def == var) { + if (ssa->ops[line].op1_def >= 0) { + if (OP1_HAS_RANGE()) { + tmp->underflow = OP1_RANGE_UNDERFLOW(); + tmp->min = OP1_MIN_RANGE(); + tmp->max = OP1_MAX_RANGE(); + tmp->overflow = OP1_RANGE_OVERFLOW(); + return 1; + } + } + } if (ssa->ops[line].result_def == var) { if (OP1_HAS_RANGE()) { tmp->min = OP1_MIN_RANGE(); @@ -2549,6 +2560,14 @@ static void zend_update_type_info(const zend_op_array *op_array, case ZEND_QM_ASSIGN: case ZEND_JMP_SET: case ZEND_COALESCE: + if (ssa_ops[i].op1_def >= 0) { + tmp = t1; + if ((t1 & (MAY_BE_RC1|MAY_BE_REF)) && (opline->op1_type == IS_CV)) { + tmp |= MAY_BE_RCN; + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); + COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); + } tmp = t1 & ~(MAY_BE_UNDEF|MAY_BE_REF); if (t1 & MAY_BE_UNDEF) { tmp |= MAY_BE_NULL; diff --git a/ext/opcache/Optimizer/zend_ssa.c b/ext/opcache/Optimizer/zend_ssa.c index a0a2df9..5372583 100644 --- a/ext/opcache/Optimizer/zend_ssa.c +++ b/ext/opcache/Optimizer/zend_ssa.c @@ -656,6 +656,9 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags, break; case ZEND_SEND_VAR: case ZEND_CAST: + case ZEND_QM_ASSIGN: + case ZEND_JMP_SET: + case ZEND_COALESCE: if ((build_flags & ZEND_SSA_RC_INFERENCE) && opline->op1_type == IS_CV) { ssa_ops[k].op1_def = ssa_vars_count; var[EX_VAR_TO_NUM(opline->op1.var)] = ssa_vars_count;

« previous php.cvs (#95367) next »