On Wed, 1 Jun 2016, Richard Biener wrote: > > On Wed, 1 Jun 2016, Richard Biener wrote: > > > 2016-06-01 Richard Biener <rguent...@suse.de> > > > > > > * match.pd ((A & B) - (A & ~B) -> B - (A ^ B)): Add missing :c. > > > (relational patterns): Use :c to avoid pattern duplications. > > > > Should the same treatment be applied to recently added IFN_MUL_OVERFLOW > > patterns (lines 2625-2643 in current match.pd)? > > Ah, yeah - I missed those appearantly.
Here's a patch. Bootstrapped/regtested on x86_64, OK to apply? Thanks. Alexander * match.pd (-1 / B < A): Use :c to avoid pattern duplication. diff --git a/gcc/match.pd b/gcc/match.pd index fe71115..7d4beea 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -2626,22 +2626,12 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) && types_match (TREE_TYPE (@0), TREE_TYPE (@1))) (out (imagpart @2) { build_zero_cst (TREE_TYPE (@0)); })))) -/* For unsigned operands, A > -1 / B checks whether A * B would overflow. +/* For unsigned operands, -1 / B < A checks whether A * B would overflow. Simplify it to __builtin_mul_overflow (A, B, <unused>). */ -/* -1 / B < A */ (for cmp (lt ge) out (ne eq) (simplify - (cmp (trunc_div:s integer_all_onesp @1) @0) - (if (TYPE_UNSIGNED (TREE_TYPE (@0)) && !VECTOR_TYPE_P (TREE_TYPE (@0))) - (with { tree t = TREE_TYPE (@0), cpx = build_complex_type (t); } - (out (imagpart (IFN_MUL_OVERFLOW:cpx @0 @1)) { build_zero_cst (t); }))))) - -/* A > -1 / B */ -(for cmp (gt le) - out (ne eq) - (simplify - (cmp @0 (trunc_div:s integer_all_onesp @1)) + (cmp:c (trunc_div:s integer_all_onesp @1) @0) (if (TYPE_UNSIGNED (TREE_TYPE (@0)) && !VECTOR_TYPE_P (TREE_TYPE (@0))) (with { tree t = TREE_TYPE (@0), cpx = build_complex_type (t); } (out (imagpart (IFN_MUL_OVERFLOW:cpx @0 @1)) { build_zero_cst (t); })))))