fold-const.c (fold_binary_loc): Move X - (X / Y) * Y -> X % Y to ...
authorMarek Polacek <polacek@redhat.com>
Mon, 29 Jun 2015 14:17:13 +0000 (14:17 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Mon, 29 Jun 2015 14:17:13 +0000 (14:17 +0000)
* fold-const.c (fold_binary_loc): Move X - (X / Y) * Y -> X % Y to ...
* match.pd: ... pattern here.

Co-Authored-By: Marc Glisse <marc.glisse@inria.fr>
From-SVN: r225120

gcc/ChangeLog
gcc/fold-const.c
gcc/match.pd

index 4427fd4870242c191f498d4323bb8203661ccbe1..3ce7acb0085c6a7bbb2bd10aaa497c0b69614723 100644 (file)
@@ -1,3 +1,9 @@
+2015-06-29  Marek Polacek  <polacek@redhat.com>
+           Marc Glisse  <marc.glisse@inria.fr>
+
+       * fold-const.c (fold_binary_loc): Move X - (X / Y) * Y -> X % Y to ...
+       * match.pd: ... pattern here.
+
 2015-06-29  Tom de Vries  <tom@codesourcery.com>
 
        * tree-parloops.c (try_transform_to_exit_first_loop_alt): Simplify
index 7b9502e2d38d56683c47137c06114bf52072457b..a447452193dbae7752de8448d51eb7aef8969f5b 100644 (file)
@@ -10509,19 +10509,6 @@ fold_binary_loc (location_t loc,
                            fold_convert_loc (loc, type,
                                              TREE_OPERAND (arg0, 0)));
 
-      /* X - (X / Y) * Y is X % Y.  */
-      if ((INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type))
-         && TREE_CODE (arg1) == MULT_EXPR
-         && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
-         && operand_equal_p (arg0,
-                             TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0)
-         && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg1, 0), 1),
-                             TREE_OPERAND (arg1, 1), 0))
-       return
-         fold_convert_loc (loc, type,
-                           fold_build2_loc (loc, TRUNC_MOD_EXPR, TREE_TYPE (arg0),
-                                        arg0, TREE_OPERAND (arg1, 1)));
-
       if (! FLOAT_TYPE_P (type))
        {
          /* Fold A - (A & B) into ~B & A.  */
index 0189a966bc8d5d57879319b7deccb39ae022db09..0cf3d21838953a2658416e83cf38035a64f0f35a 100644 (file)
@@ -238,6 +238,12 @@ along with GCC; see the file COPYING3.  If not see
       && tree_nop_conversion_p (type, TREE_TYPE (@1)))
   (trunc_mod @0 (convert @1))))
 
+/* X - (X / Y) * Y is the same as X % Y.  */
+(simplify
+ (minus (convert? @0) (convert? (mult (trunc_div @0 @1) @1)))
+ (if (INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type))
+  (convert (trunc_mod @0 @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.
    Also optimize A % (C << N)  where C is a power of 2,