aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-03-19 14:11:05 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-03-19 14:11:05 +0000
commitbe742eb4d4a3295d6e07e4c8d66a5ab54a68ef2f (patch)
tree479d5e4e7e3568816973b2874c62f0be5fb17883 /gcc
parent68d93a19c4d764012d947ef7c0ab8abbb0d72775 (diff)
downloadgcc-be742eb4d4a3295d6e07e4c8d66a5ab54a68ef2f.zip
gcc-be742eb4d4a3295d6e07e4c8d66a5ab54a68ef2f.tar.gz
gcc-be742eb4d4a3295d6e07e4c8d66a5ab54a68ef2f.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/pr84933.C23
-rw-r--r--gcc/tree-vrp.c9
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)
{