https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60969
--- Comment #20 from Vladimir Makarov <vmakarov at gcc dot gnu.org> ---
The problem is ira-costs.c. One pseudo gets equal costs for memory and all
classes. Therefore when non-mmx hard regs are not enough, a mmx is used.
After initialization of costs of reg classes for the pseudo, the costs are
never updated as all alternatives of insns where the pseudo occurs are
rejected.
The insn and the code in ira-costs.c in consideration are
(insn 26 25 27 4 (set (reg:SF 147 [ D.2423 ])
(float:SF (reg/v:SI 155 [ z ]))) 203 {*floatsisf2_i387}
(expr_list:REG_DEAD (reg/v:SI 155 [ z ])
(nil)))
(define_insn "*float<SWI48x:mode><MODEF:mode>2_i387"
[(set (match_operand:MODEF 0 "register_operand" "=f")
(float:MODEF (match_operand:SWI48x 1 "nonimmediate_operand" "m")))]
if (classes[i] == NO_REGS)
{
/* We must always fail if the operand is a REG, but
we did not find a suitable class.
Otherwise we may perform an uninitialized read
from this_op_costs after the `continue' statement
below. */
alt_fail = 1;
The code is originated from the old RA which is originated from reload in own
turn. The reload was not enable to deal with only 'm' alternative (when LRA
works well with only 'm').
I am working on the patch and I hope to commit it today into the branch and
trunk.