diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/pr84933.C | 23 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 9 |
4 files changed, 41 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b27b28f..bc64367 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 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 * tree-ssa-phiopt.c (single_trailing_store_in_bb): New function. (cond_if_else_store_replacement): Perform sinking operation on diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9f46216..5fbedb4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 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 * gcc.dg/tree-ssa/pr84859.c: New testcase. * gcc.dg/tree-ssa/pr35286.c: Disable cselim. diff --git a/gcc/testsuite/g++.dg/pr84933.C b/gcc/testsuite/g++.dg/pr84933.C new file mode 100644 index 0000000..cbfeb11 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr84933.C @@ -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; } diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 625e65b..aa53db6 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -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) { |