PR rtl-optimization/64957
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 6 Feb 2015 11:36:34 +0000 (11:36 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 6 Feb 2015 11:36:34 +0000 (11:36 +0000)
PR debug/64817
* simplify-rtx.c (simplify_binary_operation_1): Use ~cval for
IOR rather than for AND.

* gcc.c-torture/execute/pr64957.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@220475 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/simplify-rtx.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr64957.c [new file with mode: 0644]

index 7cf5049..3a5d7a2 100644 (file)
@@ -1,3 +1,10 @@
+2015-02-06  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/64957
+       PR debug/64817
+       * simplify-rtx.c (simplify_binary_operation_1): Use ~cval for
+       IOR rather than for AND.
+
 2015-02-06  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR target/62631
index 04452c6..a003b41 100644 (file)
@@ -2731,9 +2731,9 @@ simplify_binary_operation_1 (enum rtx_code code, machine_mode mode,
          HOST_WIDE_INT xcval;
 
          if (op == IOR)
-           xcval = cval;
-         else
            xcval = ~cval;
+         else
+           xcval = cval;
 
          return simplify_gen_binary (XOR, mode,
                                      simplify_gen_binary (op, mode, a, c),
index 55715ad..48a804f 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-06  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/64957
+       PR debug/64817
+       * gcc.c-torture/execute/pr64957.c: New test.
+
 2015-02-05  Jeff Law  <law@redhat.com>
 
        PR target/17306
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr64957.c b/gcc/testsuite/gcc.c-torture/execute/pr64957.c
new file mode 100644 (file)
index 0000000..2a70e17
--- /dev/null
@@ -0,0 +1,23 @@
+/* PR rtl-optimization/64957 */
+
+__attribute__((noinline, noclone)) int
+foo (int b)
+{
+  return (((b ^ 5) | 1) ^ 5) | 1;
+}
+
+__attribute__((noinline, noclone)) int
+bar (int b)
+{
+  return (((b ^ ~5) & ~1) ^ ~5) & ~1;
+}
+
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 16; i++)
+    if (foo (i) != (i | 1) || bar (i) != (i & ~1))
+      __builtin_abort ();
+  return 0;
+}