From fba46f0328cd540880eafe802b0f54ee5690d493 Mon Sep 17 00:00:00 2001 From: Marc Glisse Date: Thu, 29 Oct 2015 16:39:09 +0100 Subject: [PATCH] Fix X - (X / Y) * Y in match.pd. 2015-10-29 Marc Glisse * match.pd (X-(X/Y)*Y): Properly handle conversions and commutativity. From-SVN: r229534 --- gcc/ChangeLog | 4 ++++ gcc/match.pd | 10 ++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ab1622c2da9..3b723870b95 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2015-10-29 Marc Glisse + + * match.pd (X-(X/Y)*Y): Properly handle conversions and commutativity. + 2015-10-29 Richard Sandiford * tree-call-cdce.c (shrink_wrap_one_built_in_call): Remove diff --git a/gcc/match.pd b/gcc/match.pd index 1d6dde19f47..f6c5c07b681 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -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. -- 2.11.4.GIT