re PR middle-end/71762 (~X & Y to X < Y doesn't work for uninitialized values)
authorRichard Biener <rguenther@suse.de>
Wed, 23 Nov 2016 11:33:03 +0000 (11:33 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 23 Nov 2016 11:33:03 +0000 (11:33 +0000)
2016-11-23  Richard Biener  <rguenther@suse.de>

PR middle-end/71762
* match.pd ((~X & Y) -> X < Y, (X & ~Y) -> Y < X,
(~X | Y) -> X <= Y, (X | ~Y) -> Y <= X): Remove.

* gcc.dg/torture/pr71762-1.c: New testcase.
* gcc.dg/torture/pr71762-2.c: Likewise.
* gcc.dg/torture/pr71762-3.c: Likewise.
* gcc.dg/tree-ssa/forwprop-28.c: XFAIL.

From-SVN: r242747

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr71762-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr71762-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr71762-3.c [new file with mode: 0644]

index c0c529f5faa3807b74007f5fa91bb7dc63706fa0..192d6e4ae15addff87adeea9de0a54254039d242 100644 (file)
@@ -1,3 +1,9 @@
+2016-11-23  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/71762
+       * match.pd ((~X & Y) -> X < Y, (X & ~Y) -> Y < X,
+       (~X | Y) -> X <= Y, (X | ~Y) -> Y <= X): Remove.
+
 2016-11-23  Richard Biener  <rguenther@suse.de>
 
        PR lto/78472
index 3fece351022bdb2f2260d07fcd782087829c842b..6665412a4af76a1a4ff44fb42985400d7e92b03e 100644 (file)
@@ -963,33 +963,6 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
   (op:c truth_valued_p@0 (logical_inverted_value @0))
   { constant_boolean_node (op == NE_EXPR ? true : false, type); }))
 
-/* If arg1 and arg2 are booleans (or any single bit type)
-   then try to simplify:
-
-   (~X & Y) -> X < Y
-   (X & ~Y) -> Y < X
-   (~X | Y) -> X <= Y
-   (X | ~Y) -> Y <= X
-
-   But only do this if our result feeds into a comparison as
-   this transformation is not always a win, particularly on
-   targets with and-not instructions.
-   -> simplify_bitwise_binary_boolean */
-(simplify
-  (ne (bit_and:c (bit_not @0) @1) integer_zerop)
-  (if (INTEGRAL_TYPE_P (TREE_TYPE (@1))
-       && TYPE_PRECISION (TREE_TYPE (@1)) == 1)
-   (if (TYPE_UNSIGNED (TREE_TYPE (@1)))
-    (lt @0 @1)
-    (gt @0 @1))))
-(simplify
-  (ne (bit_ior:c (bit_not @0) @1) integer_zerop)
-  (if (INTEGRAL_TYPE_P (TREE_TYPE (@1))
-       && TYPE_PRECISION (TREE_TYPE (@1)) == 1)
-   (if (TYPE_UNSIGNED (TREE_TYPE (@1)))
-    (le @0 @1)
-    (ge @0 @1))))
-
 /* ~~x -> x */
 (simplify
   (bit_not (bit_not @0))
index f4306f02b69bc53377c559214d4d70c8c9ae18d0..64fbed77e896587b2fad5fa3b56649fdc064df37 100644 (file)
@@ -1,3 +1,11 @@
+2016-11-23  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/71762
+       * gcc.dg/torture/pr71762-1.c: New testcase.
+       * gcc.dg/torture/pr71762-2.c: Likewise.
+       * gcc.dg/torture/pr71762-3.c: Likewise.
+       * gcc.dg/tree-ssa/forwprop-28.c: XFAIL.
+
 2016-11-23  Richard Biener  <rguenther@suse.de>
 
        PR lto/78472
diff --git a/gcc/testsuite/gcc.dg/torture/pr71762-1.c b/gcc/testsuite/gcc.dg/torture/pr71762-1.c
new file mode 100644 (file)
index 0000000..d20cbc3
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do run } */
+/* { dg-additional-options "-fdisable-rtl-init-regs" } */
+
+static _Bool
+foo (_Bool a, _Bool b)
+{
+  int x = a && ! b;
+  return x != 0;
+}
+
+int y = 1;
+int main()
+{
+  _Bool x;
+  if (foo (x, y))
+    __builtin_abort ();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr71762-2.c b/gcc/testsuite/gcc.dg/torture/pr71762-2.c
new file mode 100644 (file)
index 0000000..65047cb
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do run } */
+
+static _Bool
+foo (_Bool a, _Bool b)
+{
+  int x = a && ! b;
+  return x != 0;
+}
+
+int y = 1;
+int main()
+{
+  _Bool x[32];
+  if (foo (x[1], y))
+    __builtin_abort ();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr71762-3.c b/gcc/testsuite/gcc.dg/torture/pr71762-3.c
new file mode 100644 (file)
index 0000000..4fd5f98
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do run } */
+
+static _Bool
+foo (_Bool a, _Bool b)
+{
+  int x = a && ! b;
+  return x != 0;
+}
+
+int y = 1;
+int main()
+{
+  register _Bool x
+  /* Add register spec for the argv parameter to main.  */
+#if __i386__ || __x86_64__
+      __asm__("%esi")
+#endif
+    ;
+  if (foo (x, y))
+    __builtin_abort ();
+  return 0;
+}