Hi!

On Tue, Aug 27, 2019 at 09:37:59AM -0700, Michael Eager wrote:
> Combine is complex, but I don't think that target descriptions should 
> conform to its behaviors;

But they have to, in some ways.  If combine writes something that can be
written in multiple ways in some way X, then your machine description has
to recognise X (perhaps in addition to other ways it can be written), or
you will not get as much optimisation as you might like: some combine
attempts will fail.

> combine should adapt to the target.

How?


> diff --git a/gcc/combine.c b/gcc/combine.c
> index 93bd3da26d7..fdc79ab7d3e 100644
> --- a/gcc/combine.c
> +++ b/gcc/combine.c
> @@ -7777,17 +7777,7 @@ make_extraction (machine_mode mode, rtx inner, 
> HOST_WIDE_INT pos,

This patch is against some older version of combine.c?  The line number is
off by 70 or so.

>        && partial_subreg_p (extraction_mode, mode))
>      extraction_mode = mode;

And current trunk has here

  /* Punt if len is too large for extraction_mode.  */
  if (maybe_gt (len, GET_MODE_PRECISION (extraction_mode)))
    return NULL_RTX;

(See r268913, https://gcc.gnu.org/ml/gcc-patches/2019-02/msg01140.html ).

Does that fix your problem already?  Is more needed?  Is your patch
removing some now-dead code?

> -  if (!MEM_P (inner))
> -    wanted_inner_mode = wanted_inner_reg_mode;
> -  else
> -    {
> -      /* Be careful not to go beyond the extracted object and maintain the
> -      natural alignment of the memory.  */
> -      wanted_inner_mode = smallest_int_mode_for_size (len);
> -      while (pos % GET_MODE_BITSIZE (wanted_inner_mode) + len
> -          > GET_MODE_BITSIZE (wanted_inner_mode))
> -     wanted_inner_mode = GET_MODE_WIDER_MODE (wanted_inner_mode).require ();
> -    }
> +  wanted_inner_mode = wanted_inner_reg_mode;


Segher

Reply via email to