On Thu, Feb 22, 2024 at 12:59:18PM -0800, Greg McGary wrote:
> The sign bit of a sign-extending load cannot be known until runtime,
> so don't attempt to simplify it in the combiner.
> 
> 2024-02-22  Greg McGary  <g...@rivosinc.com>
> 
>         PR rtl-optimization/113010
>         * combine.cc (simplify_comparison): Don't simplify high part
>       of paradoxical-SUBREG-of-MEM on machines that sign-extend loads
> 
>         * gcc.c-torture/execute/pr113010.c: New test.
> ---
>  gcc/combine.cc                                 | 10 ++++++++--
>  gcc/testsuite/gcc.c-torture/execute/pr113010.c |  9 +++++++++
>  2 files changed, 17 insertions(+), 2 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr113010.c
> 
> diff --git a/gcc/combine.cc b/gcc/combine.cc
> index 812553c091e..736206242e1 100644
> --- a/gcc/combine.cc
> +++ b/gcc/combine.cc
> @@ -12550,9 +12550,15 @@ simplify_comparison (enum rtx_code code, rtx *pop0, 
> rtx *pop1)
>           }
>  
>         /* If the inner mode is narrower and we are extracting the low part,
> -          we can treat the SUBREG as if it were a ZERO_EXTEND.  */
> +          we can treat the SUBREG as if it were a ZERO_EXTEND ...  */
>         if (paradoxical_subreg_p (op0))
> -         ;
> +         {
> +           /* ... except we can't treat as ZERO_EXTEND when a machine
> +              automatically sign-extends loads. */
> +           if (MEM_P (SUBREG_REG (op0)) && WORD_REGISTER_OPERATIONS
> +               && load_extend_op (inner_mode) == SIGN_EXTEND)
> +             break;

That doesn't feel sufficient.  Like in the PR112758 patch, I believe
for WORD_REGISTER_OPERATIONS you should treat it as a ZERO_EXTEND only
if MEM_P (SUBREG_REG (op0)) && load_extend_op (inner_mode) == ZERO_EXTEND
or if GET_MODE_PRECISION (inner_mode) is known to be >= BITS_PER_WORD.

        Jakub

Reply via email to