aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-11-28 13:04:27 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-11-28 13:04:27 +0000
commita257ad466894df673adc46865d763ee4324d9e17 (patch)
treebb9217b9fbab81210da2036428065e73b22e1fa1
parent20f65b5607d4cf5b4b61e8d1923bb922abadf1ba (diff)
downloadgcc-a257ad466894df673adc46865d763ee4324d9e17.zip
gcc-a257ad466894df673adc46865d763ee4324d9e17.tar.gz
gcc-a257ad466894df673adc46865d763ee4324d9e17.tar.bz2
re PR tree-optimization/88217 (Compile time and memory hog w/ -O2 -fstrict-enums -fno-tree-forwprop -fno-tree-fre)
2018-11-28 Richard Biener <rguenther@suse.de> PR tree-optimization/88217 * vr-values.c (vr_values::extract_range_from_phi_node): Make sure to handle results > +INF and < -INF correctly when trying to drop down to +INF - 1 or -INF + 1. * g++.dg/pr88217.C: New testcase. From-SVN: r266557
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/pr88217.C18
-rw-r--r--gcc/vr-values.c6
4 files changed, 34 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 33739ad..2c5bfff 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2018-11-28 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/88217
+ * vr-values.c (vr_values::extract_range_from_phi_node): Make
+ sure to handle results > +INF and < -INF correctly when
+ trying to drop down to +INF - 1 or -INF + 1.
+
2018-11-28 Alan Modra <amodra@gmail.com>
* xcoffout.c (do_block): Signed/unsigned warning fix.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4c9a77e..9f2383a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2018-11-28 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/88217
+ * g++.dg/pr88217.C: New testcase.
+
+2018-11-28 Richard Biener <rguenther@suse.de>
+
PR tree-optimization/79351
* gcc.dg/torture/pr79351.c: New testcase.
diff --git a/gcc/testsuite/g++.dg/pr88217.C b/gcc/testsuite/g++.dg/pr88217.C
new file mode 100644
index 0000000..b0506ac
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr88217.C
@@ -0,0 +1,18 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-O2 -fstrict-enums -fno-tree-forwprop -fno-tree-fre" }
+
+extern "C" int printf (const char *, ...);
+
+enum E { e1, e2, e3, X };
+E operator*(E e) { return e; }
+E begin(E e) { return e; }
+E end(E e) { return X; }
+E operator++(E& e) { return e = E(e+1); }
+
+int main()
+{
+ for (auto e: e1)
+ {
+ printf ("%d ", e);
+ }
+}
diff --git a/gcc/vr-values.c b/gcc/vr-values.c
index 41862b9..a0027c0 100644
--- a/gcc/vr-values.c
+++ b/gcc/vr-values.c
@@ -2857,7 +2857,8 @@ vr_values::extract_range_from_phi_node (gphi *phi, value_range *vr_result)
if (cmp_min < 0)
new_min = lhs_vr->min ();
else if (cmp_min > 0
- && !vrp_val_is_min (vr_result->min ()))
+ && tree_int_cst_lt (vrp_val_min (vr_result->type ()),
+ vr_result->min ()))
new_min = int_const_binop (PLUS_EXPR,
vrp_val_min (vr_result->type ()),
build_int_cst (vr_result->type (), 1));
@@ -2866,7 +2867,8 @@ vr_values::extract_range_from_phi_node (gphi *phi, value_range *vr_result)
if (cmp_max > 0)
new_max = lhs_vr->max ();
else if (cmp_max < 0
- && !vrp_val_is_max (vr_result->max ()))
+ && tree_int_cst_lt (vr_result->max (),
+ vrp_val_max (vr_result->type ())))
new_max = int_const_binop (MINUS_EXPR,
vrp_val_max (vr_result->type ()),
build_int_cst (vr_result->type (), 1));