summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-03-13 11:03:57 +0300
committerDmitry Stogov <dmitry@zend.com>2018-03-13 11:03:57 +0300
commit5574562f8f9f01d8690887206a21e533939593b6 (patch)
tree8fc36adc529caa18ffc8f33ccb127f521959f4c2
parent575f5002c023c0bf95b86941bb796c080580f770 (diff)
parent0643c7ab4d28fc489802bb03f325964c5f8e13d3 (diff)
downloadphp-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.c31
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 {