From 9319b15d3bc03258a81222a57acb8e21ad88b7ef Mon Sep 17 00:00:00 2001
From: Yury Gribov <tetra2005@gmail.com>
Date: Fri, 18 May 2018 14:05:16 +0200
Subject: [PATCH] 2018-05-20  Yury Gribov  <tetra2005@gmail.com>

	PR target/85698

gcc/
	* tree-vrp.c (is_masked_range_test): Fix handling of negative
	constants.

gcc/testsuite/
	* c-c++-common/pr85822.c: New test.
---
 gcc/testsuite/c-c++-common/pr85822.c | 27 +++++++++++++++++++++++++++
 gcc/tree-vrp.c                       |  3 ---
 2 files changed, 27 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/c-c++-common/pr85822.c

diff --git a/gcc/testsuite/c-c++-common/pr85822.c b/gcc/testsuite/c-c++-common/pr85822.c
new file mode 100644
index 0000000..3b09188
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr85822.c
@@ -0,0 +1,27 @@
+/* { dg-options "-O2" } */
+/* { dg-do run } */
+
+static const long long int TagTypeNumber = 0xffff000000000000ll;
+
+long long int x;
+
+void foo(void)
+{
+  x = TagTypeNumber + 1;
+}
+
+int main(int argc, char **argv)
+{
+  if (argc > 0)
+    foo ();
+
+  if ((x & TagTypeNumber) == TagTypeNumber)
+  {
+    unsigned y = (unsigned)x;
+    __builtin_printf ("v: %u\n", y);
+    if (y != 1)
+      __builtin_abort ();
+  }
+
+  return 0;
+}
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index aa53db6..3c45c7c 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -3907,9 +3907,6 @@ is_masked_range_test (tree name, tree valt, enum tree_code cond_code,
   *low = wide_int_to_tree (type, val);
   *high = wide_int_to_tree (type, val | inv_mask);
 
-  if (wi::neg_p (val, TYPE_SIGN (type)))
-    std::swap (*low, *high);
-
   return true;
 }
 
-- 
2.9.4

