aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>2005-11-18 13:07:06 +0000
committerRichard Kenner <kenner@gcc.gnu.org>2005-11-18 08:07:06 -0500
commit438090c3723d1d050bbc31a891e86db520bbd9f1 (patch)
tree26844d91ee0e0cb507b8e1d46555bb252b31b8d7 /gcc
parent7697e6c66a562e9bf4ef55898934079137197e2e (diff)
downloadgcc-438090c3723d1d050bbc31a891e86db520bbd9f1.zip
gcc-438090c3723d1d050bbc31a891e86db520bbd9f1.tar.gz
gcc-438090c3723d1d050bbc31a891e86db520bbd9f1.tar.bz2
fold-const.c (build_range_check): Use proper type for subtraction when merging lower bound.
* fold-const.c (build_range_check): Use proper type for subtraction when merging lower bound. From-SVN: r107178
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/fold-const.c20
2 files changed, 21 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9a0a77c..ad2c25a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2005-11-18 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * fold-const.c (build_range_check): Use proper type for subtraction
+ when merging lower bound.
+
2005-11-18 Zdenek Dvorak <dvorakz@suse.cz>
PR rtl-optimization/24497
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 343cfae..abaac75 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -4062,10 +4062,22 @@ build_range_check (tree type, tree exp, int in_p, tree low, tree high)
}
if (value != 0 && ! TREE_OVERFLOW (value))
- return build_range_check (type,
- fold_build2 (MINUS_EXPR, etype, exp, low),
- 1, fold_convert (etype, integer_zero_node),
- value);
+ {
+ /* There is no requirement that LOW be within the range of ETYPE
+ if the latter is a subtype. It must, however, be within the base
+ type of ETYPE. So be sure we do the subtraction in that type. */
+ if (INTEGRAL_TYPE_P (etype) && TREE_TYPE (etype))
+ {
+ etype = TREE_TYPE (etype);
+ exp = fold_convert (etype, exp);
+ low = fold_convert (etype, low);
+ value = fold_convert (etype, value);
+ }
+
+ return build_range_check (type,
+ fold_build2 (MINUS_EXPR, etype, exp, low),
+ 1, build_int_cst (etype, 0), value);
+ }
return 0;
}