match.pd (X - (X / Y) * Y): Use convert1 and convert2.
authorMarek Polacek <polacek@redhat.com>
Tue, 30 Jun 2015 16:35:16 +0000 (16:35 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Tue, 30 Jun 2015 16:35:16 +0000 (16:35 +0000)
* match.pd (X - (X / Y) * Y): Use convert1 and convert2.  Convert
both operands of the resulting expression.

* gcc.dg/fold-minus-6.c: New test.

From-SVN: r225195

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/fold-minus-6.c [new file with mode: 0644]

index 8ac39dc1930d7169c79baf2e42fba43b10d7d8d0..3dabe907a4425d50b302efd3183875478573c5fb 100644 (file)
@@ -1,3 +1,8 @@
+2015-06-30  Marek Polacek  <polacek@redhat.com>
+
+       * match.pd (X - (X / Y) * Y): Use convert1 and convert2.  Convert
+       both operands of the resulting expression.      
+
 2015-06-30  Richard Biener  <rguenther@suse.de>
 
        * fold-const.c (fold_binary_loc): Move ~x & ~y -> ~(x | y) and
index 682784b094b5e7b45b4bd6fe5396ef3af0888b74..e6728f470969ebcb85396c2c108409288df39acd 100644 (file)
@@ -240,9 +240,9 @@ along with GCC; see the file COPYING3.  If not see
 
 /* X - (X / Y) * Y is the same as X % Y.  */
 (simplify
- (minus (convert? @0) (convert? (mult (trunc_div @0 @1) @1)))
+ (minus (convert1? @0) (convert2? (mult (trunc_div @0 @1) @1)))
  (if (INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type))
-  (convert (trunc_mod @0 @1))))
+  (trunc_mod (convert @0) (convert @1))))
 
 /* Optimize TRUNC_MOD_EXPR by a power of two into a BIT_AND_EXPR,
    i.e. "X % C" into "X & (C - 1)", if X and C are positive.
index f766b0dcbb63cb0be192dfdbba6e45f8232c27bd..95a75e569ea3680e7979dcfdcb8cda164438a113 100644 (file)
@@ -1,3 +1,7 @@
+2015-06-30  Marek Polacek  <polacek@redhat.com>
+
+       * gcc.dg/fold-minus-6.c: New test.
+
 2015-06-30  Edward Smith-Rowland  <3dw4rd@verizon.net>
 
        Implement N4197 - Adding u8 character literals
diff --git a/gcc/testsuite/gcc.dg/fold-minus-6.c b/gcc/testsuite/gcc.dg/fold-minus-6.c
new file mode 100644 (file)
index 0000000..1c22c25
--- /dev/null
@@ -0,0 +1,42 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-cddce1" } */
+
+int
+fn1 (int x)
+{
+  return 42L - (42 / x) * x;
+}
+
+long
+fn2 (int x)
+{
+  return 42L - (42 / x) * x;
+}
+
+int
+fn3 (long int x)
+{
+  return 42L - (42 / x) * x;
+}
+
+int
+fn4 (int a, int b)
+{
+  return a - (unsigned) ((a / b) * b);
+}
+
+int
+fn5 (int a, unsigned int b)
+{
+  return a - ((a / b) * b);
+}
+
+unsigned int
+fn6 (int a, int b)
+{
+  return a - ((a / b) * b);
+}
+
+/* { dg-final { scan-tree-dump-not " / " "cddce1" } } */
+/* { dg-final { scan-tree-dump-not " - " "cddce1" } } */
+/* { dg-final { scan-tree-dump-not " \\+ " "cddce1" } } */