aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr97457.c15
-rw-r--r--gcc/value-range.cc30
2 files changed, 20 insertions, 25 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/pr97457.c b/gcc/testsuite/gcc.dg/vect/pr97457.c
new file mode 100644
index 0000000..506ba24
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr97457.c
@@ -0,0 +1,15 @@
+/* { dg-additional-options "-O3" } */
+
+int a;
+long c;
+signed char d(char e, char f) { return e + f; }
+int main(void) {
+ for (; a <= 1; a++) {
+ c = -8;
+ for (; c != 3; c = d(c, 1))
+ ;
+ }
+ char b = c;
+ if (b != 3)
+ __builtin_abort();
+}
diff --git a/gcc/value-range.cc b/gcc/value-range.cc
index 0e633c1..5827e81 100644
--- a/gcc/value-range.cc
+++ b/gcc/value-range.cc
@@ -248,31 +248,11 @@ irange::set (tree min, tree max, value_range_kind kind)
set_undefined ();
return;
}
- if (kind == VR_RANGE)
- {
- /* Convert POLY_INT_CST bounds into worst-case INTEGER_CST bounds. */
- if (POLY_INT_CST_P (min))
- {
- tree type_min = vrp_val_min (TREE_TYPE (min));
- widest_int lb
- = constant_lower_bound_with_limit (wi::to_poly_widest (min),
- wi::to_widest (type_min));
- min = wide_int_to_tree (TREE_TYPE (min), lb);
- }
- if (POLY_INT_CST_P (max))
- {
- tree type_max = vrp_val_max (TREE_TYPE (max));
- widest_int ub
- = constant_upper_bound_with_limit (wi::to_poly_widest (max),
- wi::to_widest (type_max));
- max = wide_int_to_tree (TREE_TYPE (max), ub);
- }
- }
- else if (kind != VR_VARYING)
- {
- if (POLY_INT_CST_P (min) || POLY_INT_CST_P (max))
- kind = VR_VARYING;
- }
+
+ if (kind != VR_VARYING
+ && (POLY_INT_CST_P (min) || POLY_INT_CST_P (max)))
+ kind = VR_VARYING;
+
if (kind == VR_VARYING)
{
set_varying (TREE_TYPE (min));