I have figured out what the root cause of pr52543, but i need some
advise as to how to fix it.
The bug only happens if the source or destination of the move is a hard
register. lower-subreg never breaks up pseudo to pseudo moves that are
larger than word mode. According to richard sandiford, this bug also
appears on the neon, but i do not know if there is a bugzilla for it.
It also appears on my private port, which is why i am interested in it.
in the particular case of pr52543 and my port, this happens because the
input arguments are hard regs.
The offending code is in can_decompose_p. The problem is that if the
reg is a hard reg, it completely blows off all of the information that
it accumulated during the first pass and unconditionally splits the
register (assuming it is legal to do so).
My question for the list, what is the predicate that we want to replace
the code that always decomposes hardregs (assuming it is legal). In
the case of the neon and my port, decomposing costs 4x more than using a
wide move. I assume the avr is similar.
Kenny