------- Comment #9 from uweigand at gcc dot gnu dot org 2009-10-08 18:39 ------- (In reply to comment #8) > This is on (set (reg:DF X) (mem:DF ((plus:DI (reg:DI Y) (const_int 3)))). > When X is still a pseudo, this is considered valid, as lfd accept any offset, > but when RA chooses to assign X to a GPR register, the address doesn't match > the Y constraint in movdf_hardfloat64. Is this a bug in reload that it > doesn't > attempt to force the address into a register, or in target description that it > should tell reload to do so somehow? Or does the backend need to be able to > handle these, perhaps by forcing splitting of it?
If reload were fixing up this insn, it would indeed have to make sure that the Y -> r constraints are respected, e.g. by reloading the address. However, this whole insn is *generated* by reload, in order to load a value into a reload register. Unfortunately, for such reload insns (which are simple moves), reload will simply assume they must be supported by the target, unless there is a secondary reload for this case. To fix this, I guess the rs6000 backend either has to accept the insn and implement it via splitting, or else register a secondary reload for this case (which is also able to request scratch registers). -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41176