> In other words, any 32-bit target with 'need_64bit_hwint=yes' in config.gcc
> is not able to have benefit from this optimization because it never
> passes the condition test.
>
>
> My solution is to use GET_MODE_MASK(mode) to filter out all bits not
> in target mode. The following is my patch:
The patch is OK for 4.9 once stage #1 is open if it passes bootstrap/regtest.
> gcc/ChangLog:
>
> * gcc/combine.c: Use GET_MODE_MASK() to filter out
> unnecessary bits in simplify_compare_const().
This should be
* combine.c (simplify_compare_const): Use GET_MODE_MASK to filter out
unnecessary bits in the constant power of two case.
>
> diff --git a/gcc/combine.c b/gcc/combine.c
> index 67bd776..8c8cb92 100644
> --- a/gcc/combine.c
> +++ b/gcc/combine.c
> @@ -10917,8 +10917,8 @@ simplify_compare_const (enum rtx_code code,
> rtx op0, rtx *pop1)
> && (code == EQ || code == NE || code == GE || code == GEU
>
> || code == LT || code == LTU)
>
> && mode_width <= HOST_BITS_PER_WIDE_INT
> - && exact_log2 (const_op) >= 0
> - && nonzero_bits (op0, mode) == (unsigned HOST_WIDE_INT) const_op)
> + && exact_log2 (const_op & GET_MODE_MASK (mode)) >= 0
> + && nonzero_bits (op0, mode) == (unsigned HOST_WIDE_INT)
> (const_op & GET_MODE_MASK (mode)))
> {
> code = (code == EQ || code == GE || code == GEU ? NE : EQ);
> const_op = 0;
The line is too long, write
&& nonzero_bits (op0, mode)
== (unsigned HOST_WIDE_INT) (const_op & GET_MODE_MASK (mode)))
instead.
--
Eric Botcazou