re PR rtl-optimization/78546 (wrong code at -O2 and above)
authorRichard Biener <rguenther@suse.de>
Tue, 29 Nov 2016 07:48:43 +0000 (07:48 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 29 Nov 2016 07:48:43 +0000 (07:48 +0000)
2016-11-29  Richard Biener  <rguenther@suse.de>

PR middle-end/78546
* match.pd: Add CST1 - (CST2 - A) -> CST3 + A missing case.

* gcc.dg/tree-ssa/forwprop-36.c: New testcase.

From-SVN: r242953

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/forwprop-36.c [new file with mode: 0644]

index fb25f75f23b61e2cad5191623136c2a6f9fed4ce..c1dd877bd3d70f896d885e709741ca1198c72ea3 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-29  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/78546
+       * match.pd: Add CST1 - (CST2 - A) -> CST3 + A missing case.
+
 2016-11-29  Janus Weil  <janus@gcc.gnu.org>
 
        * doc/contrib.texi: Add a few missing gfortran contributors.
index 2d4e0197c190b61995f4fcad87592f1d61d5a420..bc8a5e74d2d2116c7abc95378a0ad57e34fec2a4 100644 (file)
@@ -1195,7 +1195,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
    (minus @0 (minus @0 @1))
    @1)
 
-  /* (A +- CST) +- CST -> A + CST  */
+  /* (A +- CST1) +- CST2 -> A + CST3  */
   (for outer_op (plus minus)
    (for inner_op (plus minus)
     (simplify
@@ -1208,7 +1208,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
       (if (cst && !TREE_OVERFLOW (cst))
        (inner_op @0 { cst; } ))))))
 
-  /* (CST - A) +- CST -> CST - A  */
+  /* (CST1 - A) +- CST2 -> CST3 - A  */
   (for outer_op (plus minus)
    (simplify
     (outer_op (minus CONSTANT_CLASS_P@1 @0) CONSTANT_CLASS_P@2)
@@ -1216,6 +1216,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
      (if (cst && !TREE_OVERFLOW (cst))
       (minus { cst; } @0)))))
 
+  /* CST1 - (CST2 - A) -> CST3 + A  */
+  (simplify
+   (minus CONSTANT_CLASS_P@1 (minus CONSTANT_CLASS_P@2 @0))
+   (with { tree cst = const_binop (MINUS_EXPR, type, @1, @2); }
+    (if (cst && !TREE_OVERFLOW (cst))
+     (plus { cst; } @0))))
+
   /* ~A + A -> -1 */
   (simplify
    (plus:c (bit_not @0) @0)
index b325e2c9d58cee53501cc4e77bedd536159c1f99..d209fcbbce81835a573fa9418c91b46deaee8efc 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-29  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/78546
+       * gcc.dg/tree-ssa/forwprop-36.c: New testcase.
+
 2016-11-29  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * gcc.target/powerpc/rldic-0.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-36.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-36.c
new file mode 100644 (file)
index 0000000..9de73ff
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do compile { target int128 } } */
+/* { dg-options "-O -fdump-tree-cddce1" } */
+
+typedef unsigned __int128 u128;
+
+u128 a, b;
+
+static inline u128
+foo (u128 p1)
+{
+  p1 += ~b;
+  return -p1;
+}
+
+int
+main ()
+{
+  u128 x = foo (~0x7fffffffffffffff);
+  if (x != 0x8000000000000001)
+    __builtin_abort();
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump "if \\(b.0_\[0-9\]+ != 0\\)" "cddce1" } } */