aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
diff options
context:
space:
mode:
authorZdenek Dvorak <dvorakz@suse.cz>2006-05-19 15:24:42 +0200
committerZdenek Dvorak <rakdver@gcc.gnu.org>2006-05-19 13:24:42 +0000
commit04dce5a4f3ac2430bfa963586311561ef334c33f (patch)
treea6dc9b7cbb0c8a19f54212a3a908fc7cbcf5c7cb /gcc/tree-vrp.c
parentfa807ff666ce3d32cd2e175c7ea97fb9be15c8b2 (diff)
downloadgcc-04dce5a4f3ac2430bfa963586311561ef334c33f.zip
gcc-04dce5a4f3ac2430bfa963586311561ef334c33f.tar.gz
gcc-04dce5a4f3ac2430bfa963586311561ef334c33f.tar.bz2
tree-vrp.c (valid_value_p): New function.
* tree-vrp.c (valid_value_p): New function. (adjust_range_with_scev): Fail if the value of bound is not simple. From-SVN: r113907
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r--gcc/tree-vrp.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index d487df6..1734d44 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -409,6 +409,22 @@ vrp_expr_computes_nonzero (tree expr)
return false;
}
+/* Returns true if EXPR is a valid value (as expected by compare_values) --
+ a gimple invariant, or SSA_NAME +- CST. */
+
+static bool
+valid_value_p (tree expr)
+{
+ if (TREE_CODE (expr) == SSA_NAME)
+ return true;
+
+ if (TREE_CODE (expr) == PLUS_EXPR
+ || TREE_CODE (expr) == MINUS_EXPR)
+ return (TREE_CODE (TREE_OPERAND (expr, 0)) == SSA_NAME
+ && TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST);
+
+ return is_gimple_min_invariant (expr);
+}
/* Compare two values VAL1 and VAL2. Return
@@ -1974,9 +1990,12 @@ adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt,
step = evolution_part_in_loop_num (chrec, loop->num);
/* If STEP is symbolic, we can't know whether INIT will be the
- minimum or maximum value in the range. */
+ minimum or maximum value in the range. Also, unless INIT is
+ a simple expression, compare_values and possibly other functions
+ in tree-vrp won't be able to handle it. */
if (step == NULL_TREE
- || !is_gimple_min_invariant (step))
+ || !is_gimple_min_invariant (step)
+ || !valid_value_p (init))
return;
/* Do not adjust ranges when chrec may wrap. */