diff options
author | Dmitry Stogov <dmitry@zend.com> | 2018-03-13 11:03:57 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2018-03-13 11:03:57 +0300 |
commit | 5574562f8f9f01d8690887206a21e533939593b6 (patch) | |
tree | 8fc36adc529caa18ffc8f33ccb127f521959f4c2 | |
parent | 575f5002c023c0bf95b86941bb796c080580f770 (diff) | |
parent | 0643c7ab4d28fc489802bb03f325964c5f8e13d3 (diff) | |
download | php-git-5574562f8f9f01d8690887206a21e533939593b6.tar.gz |
Merge branch 'PHP-7.1' into PHP-7.2
* PHP-7.1:
Revert "More accurate symbolic constraints oferflow/unserflow handling (better fix for bug #76074)."
-rw-r--r-- | ext/opcache/Optimizer/zend_inference.c | 31 |
1 files changed, 12 insertions, 19 deletions
diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index c9ffd86c83..facfc6bede 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -159,12 +159,15 @@ } while (0) static inline zend_bool add_will_overflow(zend_long a, zend_long b) { - return (b > 0 && a > ZEND_LONG_MAX - b); + return (b > 0 && a > ZEND_LONG_MAX - b) + || (b < 0 && a < ZEND_LONG_MIN - b); } - -static inline zend_bool add_will_underflow(zend_long a, zend_long b) { - return (b < 0 && a < ZEND_LONG_MIN - b); +#if 0 +static inline zend_bool sub_will_overflow(zend_long a, zend_long b) { + return (b > 0 && a < ZEND_LONG_MIN + b) + || (b < 0 && a > ZEND_LONG_MAX + b); } +#endif static void zend_ssa_check_scc_var(const zend_op_array *op_array, zend_ssa *ssa, int var, int *index, int *dfs, int *root, zend_worklist_stack *stack) /* {{{ */ { @@ -901,13 +904,8 @@ int zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ssa, int tmp->min = MAX(constraint->range.min, tmp->min); #ifdef SYM_RANGE } else if (narrowing && ssa->var_info[constraint->min_ssa_var].has_range) { - if ((ssa->var_info[constraint->min_ssa_var].range.underflow - || add_will_underflow(ssa->var_info[constraint->min_ssa_var].range.min, constraint->range.min)) - && tmp->underflow) { - tmp->underflow = 1; - tmp->min = ZEND_LONG_MIN; - } else { - tmp->underflow = 0; + tmp->underflow = ssa->var_info[constraint->min_ssa_var].range.underflow && tmp->underflow; + if (!add_will_overflow(ssa->var_info[constraint->min_ssa_var].range.min, constraint->range.min)) { tmp->min = MAX(ssa->var_info[constraint->min_ssa_var].range.min + constraint->range.min, tmp->min); } #endif @@ -917,15 +915,10 @@ int zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ssa, int tmp->overflow = constraint->range.overflow && tmp->overflow; #ifdef SYM_RANGE } else if (narrowing && ssa->var_info[constraint->max_ssa_var].has_range) { - if ((ssa->var_info[constraint->min_ssa_var].range.overflow - || add_will_overflow(ssa->var_info[constraint->min_ssa_var].range.max, constraint->range.max)) - && tmp->overflow) { - tmp->overflow = 1; - tmp->max = ZEND_LONG_MAX; - } else { - tmp->overflow = 0; + if (!add_will_overflow(ssa->var_info[constraint->max_ssa_var].range.max, constraint->range.max)) { tmp->max = MIN(ssa->var_info[constraint->max_ssa_var].range.max + constraint->range.max, tmp->max); } + tmp->overflow = ssa->var_info[constraint->max_ssa_var].range.overflow && tmp->overflow; #endif } } else if (narrowing) { @@ -934,7 +927,7 @@ int zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ssa, int tmp->min = constraint->range.min; #ifdef SYM_RANGE } else if (narrowing && ssa->var_info[constraint->min_ssa_var].has_range) { - if (add_will_underflow(ssa->var_info[constraint->min_ssa_var].range.min, constraint->range.min)) { + if (add_will_overflow(ssa->var_info[constraint->min_ssa_var].range.min, constraint->range.min)) { tmp->underflow = 1; tmp->min = ZEND_LONG_MIN; } else { |