aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>2005-11-18 13:32:05 +0000
committerRichard Kenner <kenner@gcc.gnu.org>2005-11-18 08:32:05 -0500
commit4d14c1f401e7c3204f2f2f5aab7492531e8c247c (patch)
treeb2b388d06c4605602ee74889020ecaa14aa865b1 /gcc
parente259b3c2b22e424c5814ba51f3373ff6da05dbd1 (diff)
downloadgcc-4d14c1f401e7c3204f2f2f5aab7492531e8c247c.zip
gcc-4d14c1f401e7c3204f2f2f5aab7492531e8c247c.tar.gz
gcc-4d14c1f401e7c3204f2f2f5aab7492531e8c247c.tar.bz2
tree-ssa-dom.c (extract_range_from_cond): Deal with variable bounds on types.
* tree-ssa-dom.c (extract_range_from_cond): Deal with variable bounds on types. From-SVN: r107182
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/tree-ssa-dom.c16
2 files changed, 15 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4234178..67eab96 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,8 @@
2005-11-18 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+ * tree-ssa-dom.c (extract_range_from_cond): Deal with variable bounds
+ on types.
+
* expr.c (expand_expr_real): Don't call record_block_change unless
ib_boundaries_block is non-null
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
index 1e0ebbc..a0d2f28 100644
--- a/gcc/tree-ssa-dom.c
+++ b/gcc/tree-ssa-dom.c
@@ -3203,10 +3203,7 @@ extract_range_from_cond (tree cond, tree *hi_p, tree *lo_p, int *inverted_p)
record ranges for enumerations. Presumably this is due to
the fact that they're rarely used directly. They are typically
cast into an integer type and used that way. */
- if (TREE_CODE (type) != INTEGER_TYPE
- /* We don't know how to deal with types with variable bounds. */
- || TREE_CODE (TYPE_MIN_VALUE (type)) != INTEGER_CST
- || TREE_CODE (TYPE_MAX_VALUE (type)) != INTEGER_CST)
+ if (TREE_CODE (type) != INTEGER_TYPE)
return 0;
switch (TREE_CODE (cond))
@@ -3223,12 +3220,19 @@ extract_range_from_cond (tree cond, tree *hi_p, tree *lo_p, int *inverted_p)
case GE_EXPR:
low = op1;
+
+ /* Get the highest value of the type. If not a constant, use that
+ of its base type, if it has one. */
high = TYPE_MAX_VALUE (type);
+ if (TREE_CODE (high) != INTEGER_CST && TREE_TYPE (type))
+ high = TYPE_MAX_VALUE (TREE_TYPE (type));
inverted = 0;
break;
case GT_EXPR:
high = TYPE_MAX_VALUE (type);
+ if (TREE_CODE (high) != INTEGER_CST && TREE_TYPE (type))
+ high = TYPE_MAX_VALUE (TREE_TYPE (type));
if (!tree_int_cst_lt (op1, high))
return 0;
low = int_const_binop (PLUS_EXPR, op1, integer_one_node, 1);
@@ -3238,11 +3242,15 @@ extract_range_from_cond (tree cond, tree *hi_p, tree *lo_p, int *inverted_p)
case LE_EXPR:
high = op1;
low = TYPE_MIN_VALUE (type);
+ if (TREE_CODE (low) != INTEGER_CST && TREE_TYPE (type))
+ low = TYPE_MIN_VALUE (TREE_TYPE (type));
inverted = 0;
break;
case LT_EXPR:
low = TYPE_MIN_VALUE (type);
+ if (TREE_CODE (low) != INTEGER_CST && TREE_TYPE (type))
+ low = TYPE_MIN_VALUE (TREE_TYPE (type));
if (!tree_int_cst_lt (low, op1))
return 0;
high = int_const_binop (MINUS_EXPR, op1, integer_one_node, 1);