This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Indirect memory addresses vs. lra


Hi John,

On Mon, Aug 12, 2019 at 08:47:43AM +0200, John Darrington wrote:
> On Sat, Aug 10, 2019 at 11:12:18AM -0500, Segher Boessenkool wrote:
>      On Sat, Aug 10, 2019 at 08:05:53AM +0200, John Darrington wrote:
>      > 	 Choosing alt 5 in insn 14:  (0) m  (1) m {*movsi}
>      >    14: [r40:PSI+0x20]=[r41:PSI]
>      >     Inserting insn reload before:
>      >    48: r40:PSI=r34:PSI
>      >    49: r41:PSI=[y:PSI+0x2f]
>      
>      insn 14 is a mem-to-mem move (another feature not many more modern /
>      more RISCy CPUs have).  That requires both of your address registers.
>      So far, so good.  The reloads (insn 48 and 49) require address
>      registers themselves; that isn't necessarily a problem either.
> 
> So far as I can see, insn 48 is completely redundant.  It's copying a
> pseudo reg (74) into another pseudo reg (40).
> This is pointless and a waste, since insn 14 does not modify 74.
> I don't understand why lra feels the need to do it.

LRA always does this, I think...  it reloads all inputs to all insns
that may need reloading.  It later optimises most of that away again,
but this gives it a lot of freedom to move things around.

Or that is what it always looked like to me.  I haven't looked at the
code to see if that is the real reason, blush.

> If lra knew about (mem (mem ...)) style addressing, then insn 49 would
> also be redundant (which is why I raised the topic).

Yes.  But it probably should be able to deal with things like this, too,
or some other testcases will die a horrible death.

> In summary, what we have is:
> 
> (insn 48 84 49 2 (set (reg/f:PSI 40 [34])
>         (reg/f:PSI 74 [34]))
>      (nil))
> (insn 49 48 14 2 (set (reg:PSI 41)
>         (mem/f/c:PSI (plus:PSI (reg/f:PSI 9 y)
>                 (const_int 47 [0x2f])) [3 p+0 S4 A8]))
>      (nil))
> (insn 14 49 15 2 (set (mem:SI (plus:PSI (reg/f:PSI 40 [34])
>                 (const_int 32 [0x20])) [2  S4 A64])
>         (mem:SI (reg:PSI 41) [2 *p_5(D)+0 S4 A8])) 
> 
> where, like you say, insns 48 and 49 are reloads.  But these two reloads 
> are unnecessary and cause the machine to run out of PSImode registers.

Anyway, please have patience, and see what Vladimir comes up with.  These
things take time.


Segher


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]