[Bug rtl-optimization/60969] [4.9/4.10 Regression] ICE in output_129 in MMXMOV of mode MODE_SF for march=pentium4

vmakarov at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri May 16 16:55:00 GMT 2014


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.



More information about the Gcc-bugs mailing list