aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2016-05-19 15:45:35 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2016-05-19 15:45:35 +0000
commit4177437ead62c0c74d560f3611b3583078f59688 (patch)
tree5200744a52d46eb0df44b3e719769f1f4e7cdaa1
parent00426f9a9e57175d6373359aec3e7956a6d2a1c1 (diff)
downloadgcc-4177437ead62c0c74d560f3611b3583078f59688.zip
gcc-4177437ead62c0c74d560f3611b3583078f59688.tar.gz
gcc-4177437ead62c0c74d560f3611b3583078f59688.tar.bz2
re PR tree-optimization/71031 (ICE in extract_range_from_binary_expr_1, at tree-vrp.c:2535 w/ -Os)
PR tree-optimization/71031 * tree-vrp.c (extract_range_from_binary_expr_1): Turn assert into a condition and adjust the code a bit. * gcc.dg/tree-ssa/vrp100.c: New test. From-SVN: r236477
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp100.c32
-rw-r--r--gcc/tree-vrp.c17
4 files changed, 51 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 883892b..4900c7e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-05-19 Marek Polacek <polacek@redhat.com>
+
+ PR tree-optimization/71031
+ * tree-vrp.c (extract_range_from_binary_expr_1): Turn assert into a
+ condition and adjust the code a bit.
+
2016-05-19 Martin Liska <mliska@suse.cz>
* tree-vect-stmts.c (vectorizable_simd_clone_call): Utilize
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b071e9f..f9ea240 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-05-19 Marek Polacek <polacek@redhat.com>
+
+ PR tree-optimization/71031
+ * gcc.dg/tree-ssa/vrp100.c: New test.
+
2016-05-19 Ilya Enkovich <ilya.enkovich@intel.com>
PR rtl-optimization/71148
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp100.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp100.c
new file mode 100644
index 0000000..c0fe4b5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp100.c
@@ -0,0 +1,32 @@
+/* PR tree-optimization/71031 */
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+
+int zj;
+int **yr;
+
+void
+nn (void)
+{
+ unsigned int od = 4;
+
+ for (;;)
+ {
+ int lk;
+
+ for (lk = 0; lk < 2; ++lk)
+ {
+ static int cm;
+
+ zj = 0;
+ if (od == 0)
+ return;
+ ++od;
+ for (cm = 0; cm < 2; ++cm)
+ {
+ --od;
+ **yr = 0;
+ }
+ }
+ }
+}
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 69e6248..92d889c 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -2519,20 +2519,13 @@ extract_range_from_binary_expr_1 (value_range *vr,
min = wide_int_to_tree (expr_type, tmin);
max = wide_int_to_tree (expr_type, tmax);
}
- else if (min_ovf == -1 && max_ovf == 1)
- {
- /* Underflow and overflow, drop to VR_VARYING. */
- set_value_range_to_varying (vr);
- return;
- }
- else
+ else if ((min_ovf == -1 && max_ovf == 0)
+ || (max_ovf == 1 && min_ovf == 0))
{
/* Min underflow or max overflow. The range kind
changes to VR_ANTI_RANGE. */
bool covers = false;
wide_int tem = tmin;
- gcc_assert ((min_ovf == -1 && max_ovf == 0)
- || (max_ovf == 1 && min_ovf == 0));
type = VR_ANTI_RANGE;
tmin = tmax + 1;
if (wi::cmp (tmin, tmax, sgn) < 0)
@@ -2551,6 +2544,12 @@ extract_range_from_binary_expr_1 (value_range *vr,
min = wide_int_to_tree (expr_type, tmin);
max = wide_int_to_tree (expr_type, tmax);
}
+ else
+ {
+ /* Other underflow and/or overflow, drop to VR_VARYING. */
+ set_value_range_to_varying (vr);
+ return;
+ }
}
else
{