aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2012-08-22 14:29:23 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2012-08-22 12:29:23 +0000
commitd9c6ca8570b1982b383455aa5d315bcac049145d (patch)
tree8f08be5dd4e93dd2c8960068854763c63bfe24a4
parent6f723d3319d8a656079b0509be4a249c0fbd955c (diff)
downloadgcc-d9c6ca8570b1982b383455aa5d315bcac049145d.zip
gcc-d9c6ca8570b1982b383455aa5d315bcac049145d.tar.gz
gcc-d9c6ca8570b1982b383455aa5d315bcac049145d.tar.bz2
re PR tree-optimization/54317 (FAIL: c45532m c45532n c45532o c45532p)
2012-08-22 Marc Glisse <marc.glisse@inria.fr> PR tree-optimization/54317 gcc/ * tree-vrp.c (extract_range_from_binary_expr_1): Test for double_int overflow. Remove dead tests. gcc/testsuite/ * gcc.dg/tree-ssa/vrp79.c: New testcase. From-SVN: r190591
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp79.c23
-rw-r--r--gcc/tree-vrp.c9
4 files changed, 41 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 88ec752..c04f5cb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2012-08-22 Marc Glisse <marc.glisse@inria.fr>
+
+ PR tree-optimization/54317
+ * tree-vrp.c (extract_range_from_binary_expr_1): Test for
+ double_int overflow.
+ Remove dead tests.
+
2012-08-22 Jakub Jelinek <jakub@redhat.com>
* tree-vrp.c (find_assert_locations): Skip also edges
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6724380..049e2d1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-08-22 Marc Glisse <marc.glisse@inria.fr>
+
+ PR tree-optimization/54317
+ * gcc.dg/tree-ssa/vrp79.c: New testcase.
+
2012-08-21 Oleg Endo <olegendo@gcc.gnu.org>
PR target/39423
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp79.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp79.c
new file mode 100644
index 0000000..88c1bd8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp79.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+#ifdef __SIZEOF_INT128__
+typedef unsigned __int128 NT;
+#else
+typedef unsigned long long NT;
+#endif
+
+extern void do_not_go_away ();
+
+void f (NT x, NT y)
+{
+ NT n = 1;
+ n <<= (__CHAR_BIT__ * sizeof (NT) - 1);
+ if (x > n) return;
+ if (y > n) return;
+ NT z = x + y;
+ if (z == 42) do_not_go_away ();
+}
+
+/* { dg-final { scan-tree-dump "do_not_go_away" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 0aa1dc7..f949e8b 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -2474,18 +2474,21 @@ extract_range_from_binary_expr_1 (value_range_t *vr,
{
/* Min underflow or max overflow. The range kind
changes to VR_ANTI_RANGE. */
+ bool covers = false;
double_int tem = tmin;
gcc_assert ((min_ovf == -1 && max_ovf == 0)
|| (max_ovf == 1 && min_ovf == 0));
type = VR_ANTI_RANGE;
tmin = double_int_add (tmax, double_int_one);
+ if (double_int_cmp (tmin, tmax, uns) < 0)
+ covers = true;
tmax = double_int_add (tem, double_int_minus_one);
+ if (double_int_cmp (tmax, tem, uns) > 0)
+ covers = true;
/* If the anti-range would cover nothing, drop to varying.
Likewise if the anti-range bounds are outside of the
types values. */
- if (double_int_cmp (tmin, tmax, uns) > 0
- || double_int_cmp (tmin, type_min, uns) < 0
- || double_int_cmp (tmax, type_max, uns) > 0)
+ if (covers || double_int_cmp (tmin, tmax, uns) > 0)
{
set_value_range_to_varying (vr);
return;