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:
parent
68d93a19c4
commit
be742eb4d4
@ -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
|
||||
|
@ -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
|
||||
|
23
gcc/testsuite/g++.dg/pr84933.C
Normal file
23
gcc/testsuite/g++.dg/pr84933.C
Normal 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; }
|
@ -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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user