diff options
author | Richard Kenner <kenner@vlsi1.ultra.nyu.edu> | 2005-11-18 13:32:05 +0000 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 2005-11-18 08:32:05 -0500 |
commit | 4d14c1f401e7c3204f2f2f5aab7492531e8c247c (patch) | |
tree | b2b388d06c4605602ee74889020ecaa14aa865b1 /gcc/tree-ssa-dom.c | |
parent | e259b3c2b22e424c5814ba51f3373ff6da05dbd1 (diff) | |
download | gcc-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/tree-ssa-dom.c')
-rw-r--r-- | gcc/tree-ssa-dom.c | 16 |
1 files changed, 12 insertions, 4 deletions
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); |