https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110939

--- Comment #10 from Chenghui Pan <panchenghui at loongson dot cn> ---
(In reply to Stefan Schulze Frielinghaus from comment #9)
> Thanks for the reproducer and sorry for the hassle.
> 
> The normal form of a constant for a mode with fewer bits than in
> HOST_WIDE_INT is a sign extended version of the original constant.  This
> even holds for unsigned constants which I missed.  The following should fix
> this:
> 
> diff --git a/gcc/combine.cc b/gcc/combine.cc
> index e46d202d0a7..9e5bf96a09d 100644
> --- a/gcc/combine.cc
> +++ b/gcc/combine.cc
> @@ -12059,7 +12059,7 @@ simplify_compare_const (enum rtx_code code,
> machine_mode mode,
>                                : (GET_MODE_SIZE (int_mode)
>                                   - GET_MODE_SIZE (narrow_mode_iter)));
>           *pop0 = adjust_address_nv (op0, narrow_mode_iter, offset);
> -         *pop1 = GEN_INT (n);
> +         *pop1 = gen_int_mode (n, narrow_mode_iter);
>           return adjusted_code;
>         }
>      }
> 
> Can you give this a try?

Bootstrapping is successful with this, thank you!

Reply via email to