From be742eb4d4a3295d6e07e4c8d66a5ab54a68ef2f Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 19 Mar 2018 14:11:05 +0000 Subject: [PATCH] re PR tree-optimization/84933 (ICE in set_value_range, at tree-vrp.c:288 since r257852) 2018-03-19 Richard Biener 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 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/pr84933.C | 23 +++++++++++++++++++++++ gcc/tree-vrp.c | 9 +++++++-- 4 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/pr84933.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b27b28f44ff..bc643674863 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-03-19 Richard Biener + + 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 PR tree-optimization/84859 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9f462160a61..5fbedb4e460 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-03-19 Richard Biener + + PR tree-optimization/84933 + * g++.dg/pr84933.C: New testcase. + 2018-03-19 Richard Biener PR tree-optimization/84859 diff --git a/gcc/testsuite/g++.dg/pr84933.C b/gcc/testsuite/g++.dg/pr84933.C new file mode 100644 index 00000000000..cbfeb11ebf3 --- /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 625e65b1184..aa53db65576 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) {