aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2015-10-29 16:39:09 +0100
committerMarc Glisse <glisse@gcc.gnu.org>2015-10-29 15:39:09 +0000
commitfba46f0328cd540880eafe802b0f54ee5690d493 (patch)
tree32b708b45bfab7f43eefe48927f0bf1bd5176759 /gcc
parent2adfab879c7aa3a78bb78efa09f9ca41603b0f99 (diff)
downloadgcc-fba46f0328cd540880eafe802b0f54ee5690d493.zip
gcc-fba46f0328cd540880eafe802b0f54ee5690d493.tar.gz
gcc-fba46f0328cd540880eafe802b0f54ee5690d493.tar.bz2
Fix X - (X / Y) * Y in match.pd.
2015-10-29 Marc Glisse <marc.glisse@inria.fr> * match.pd (X-(X/Y)*Y): Properly handle conversions and commutativity. From-SVN: r229534
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/match.pd10
2 files changed, 10 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ab1622c..3b72387 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/match.pd b/gcc/match.pd
index 1d6dde1..f6c5c07 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.