On Wed, Sep 20, 2017 at 2:18 PM, Richard Sandiford
<richard.sandif...@linaro.org> wrote:
> natch.pd tries to reassociate two bit operations if both of them have
> constant operands.  However, with the polynomial integers added later,
> there's no guarantee that a bit operation on two integers can be folded
> at compile time.  This means that the pattern can trigger for operations
> on three constants, and as things stood could endlessly oscillate
> between the two associations.
>
> This patch keeps the existing pattern for the normal case of a
> non-constant first operand.  When all three operands are constant it
> tries to find a pair of constants that do fold.  If none do, it keeps
> the original expression as-was.
>
> Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linus-gnu.
> OK to install?

Hmm, is the complication with trying variants necessary or could we simply do

 if (!CONSTANT_CLASS_P (@0))
  (bitop @0 (bitop @1 @2))

and be done with it?

> Richard
>
>
> 2017-09-20  Richard Sandiford  <richard.sandif...@linaro.org>
>             Alan Hayward  <alan.hayw...@arm.com>
>             David Sherwood  <david.sherw...@arm.com>
>
> gcc/
>         * match.pd: Handle bit operations involving three constants
>         and try to fold one pair.
>
> Index: gcc/match.pd
> ===================================================================
> --- gcc/match.pd        2017-09-16 21:38:21.106513157 +0100
> +++ gcc/match.pd        2017-09-20 13:17:10.552389270 +0100
> @@ -1017,7 +1017,14 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>  (for bitop (bit_and bit_ior bit_xor)
>   (simplify
>    (bitop (bitop @0 CONSTANT_CLASS_P@1) CONSTANT_CLASS_P@2)
> -  (bitop @0 (bitop @1 @2))))
> +  (if (!CONSTANT_CLASS_P (@0))
> +   (bitop @0 (bitop @1 @2))
> +   (with { tree cst1 = const_binop (bitop, type, @0, @2); }
> +    (if (cst1)
> +     (bitop @1 { cst1; })
> +     (with { tree cst2 = const_binop (bitop, type, @1, @2); }
> +      (if (cst2)
> +       (bitop @0 { cst2; }))))))))
>
>  /* Try simple folding for X op !X, and X op X with the help
>     of the truth_valued_p and logical_inverted_value predicates.  */

Reply via email to