Fix X - (X / Y) * Y in match.pd.
authorMarc Glisse <marc.glisse@inria.fr>
Thu, 29 Oct 2015 15:39:09 +0000 (16:39 +0100)
committerMarc Glisse <glisse@gcc.gnu.org>
Thu, 29 Oct 2015 15:39:09 +0000 (15:39 +0000)
2015-10-29  Marc Glisse  <marc.glisse@inria.fr>

* match.pd (X-(X/Y)*Y): Properly handle conversions and commutativity.

From-SVN: r229534

gcc/ChangeLog
gcc/match.pd

index ab1622c2da9d4eeb80ad983b544f8af1afe9dae8..3b723870b95d797a6a6fad38c8ae9936ce3c8673 100644 (file)
@@ -1,3 +1,7 @@
+2015-10-29  Marc Glisse  <marc.glisse@inria.fr>
+
+       * match.pd (X-(X/Y)*Y): Properly handle conversions and commutativity.
+
 2015-10-29  Richard Sandiford  <richard.sandiford@arm.com>
 
        * tree-call-cdce.c (shrink_wrap_one_built_in_call): Remove
index 1d6dde19f47deb2a15ede5205b32b88e64ec5856..f6c5c07b681ae546039b682363154bc1854621a7 100644 (file)
@@ -318,10 +318,12 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 
 /* X - (X / Y) * Y is the same as X % Y.  */
 (simplify
- (minus (convert1? @0) (convert2? (mult (trunc_div @0 @1) @1)))
- (if ((INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type))
-      && TYPE_UNSIGNED (TREE_TYPE (@0)) == TYPE_UNSIGNED (type))
-  (trunc_mod (convert @0) (convert @1))))
+ (minus (convert1? @2) (convert2? (mult:c (trunc_div @0 @1) @1)))
+ /* We cannot use matching captures here, since in the case of
+    constants we really want the type of @0, not @2.  */
+ (if (operand_equal_p (@0, @2, 0)
+      && (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.