re PR tree-optimization/84933 (ICE in set_value_range, at tree-vrp.c:288 since r257852)

2018-03-19  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/84933
	* tree-vrp.c (set_and_canonicalize_value_range): Treat out-of-bound
	values as -INF/INF when canonicalizing an ANTI_RANGE to a RANGE.

	* g++.dg/pr84933.C: New testcase.

From-SVN: r258646
This commit is contained in:
Richard Biener 2018-03-19 14:11:05 +00:00 committed by Richard Biener
parent 68d93a19c4
commit be742eb4d4
4 changed files with 41 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2018-03-19 Richard Biener <rguenther@suse.de>
PR tree-optimization/84933
* tree-vrp.c (set_and_canonicalize_value_range): Treat out-of-bound
values as -INF/INF when canonicalizing an ANTI_RANGE to a RANGE.
2018-03-19 Richard Biener <rguenther@suse.de>
PR tree-optimization/84859

View File

@ -1,3 +1,8 @@
2018-03-19 Richard Biener <rguenther@suse.de>
PR tree-optimization/84933
* g++.dg/pr84933.C: New testcase.
2018-03-19 Richard Biener <rguenther@suse.de>
PR tree-optimization/84859

View File

@ -0,0 +1,23 @@
/* { dg-do compile } */
/* { dg-options "-O3 -fstrict-enums -fno-inline" } */
enum a {};
int *d;
int b, e, f;
a c, g;
class h {
virtual unsigned i();
};
class j : h {
unsigned i() {
for (;;) {
b = c <= 0;
if (b)
e = *d;
b = g && c;
if (b)
f = *d;
}
}
};
void k() { new j; }

View File

@ -386,8 +386,13 @@ set_and_canonicalize_value_range (value_range *vr, enum value_range_type t,
/* Anti-ranges that can be represented as ranges should be so. */
if (t == VR_ANTI_RANGE)
{
bool is_min = vrp_val_is_min (min);
bool is_max = vrp_val_is_max (max);
/* For -fstrict-enums we may receive out-of-range ranges so consider
values < -INF and values > INF as -INF/INF as well. */
tree type = TREE_TYPE (min);
bool is_min = (INTEGRAL_TYPE_P (type)
&& tree_int_cst_compare (min, TYPE_MIN_VALUE (type)) <= 0);
bool is_max = (INTEGRAL_TYPE_P (type)
&& tree_int_cst_compare (max, TYPE_MAX_VALUE (type)) >= 0);
if (is_min && is_max)
{