gcc/ * tree-vrp.c (vrp_finalize): Do not expose any useless range information. gcc/testsuite/ * gcc.dg/Walloca-14.c: Adapt test to recognize new complaint of unbounded use. diff --git a/gcc/testsuite/gcc.dg/Walloca-14.c b/gcc/testsuite/gcc.dg/Walloca-14.c index 723dbe5..f3e3f57 100644 --- a/gcc/testsuite/gcc.dg/Walloca-14.c +++ b/gcc/testsuite/gcc.dg/Walloca-14.c @@ -9,5 +9,6 @@ g (int *p) extern void f (void *); void *q = __builtin_alloca (p); /* { dg-warning "passing argument 1" } */ + /* { dg-warning "unbounded use of 'alloca'" "unbounded" { target *-*-* } 11 } */ f (q); } diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 716a7c2..8442b1f 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -10708,8 +10708,24 @@ vrp_finalize (bool warn_array_bounds_p) vr_value[i]->max) == 1))) set_ptr_nonnull (name); else if (!POINTER_TYPE_P (TREE_TYPE (name))) - set_range_info (name, vr_value[i]->type, vr_value[i]->min, - vr_value[i]->max); + { + range_info_def *ri = SSA_NAME_RANGE_INFO (name); + tree type = TREE_TYPE (name); + unsigned precision = TYPE_PRECISION (type); + /* If the range covers the entire domain and there is + nothing in the non-zero bits mask, there is no sense in + storing anything. */ + if (vr_value[i]->min == TYPE_MIN_VALUE (type) + && vr_value[i]->max == TYPE_MAX_VALUE (type) + && vr_value[i]->type == VR_RANGE + && (!ri + || ri->get_nonzero_bits () == wi::shwi (-1, precision))) + SSA_NAME_RANGE_INFO (name) = NULL; + else + set_range_info (name, vr_value[i]->type, vr_value[i]->min, + vr_value[i]->max); + } +} } substitute_and_fold (op_with_constant_singleton_value_range, vrp_fold_stmt);