http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60438

--- Comment #18 from linzj <manjian2006 at gmail dot com> ---
(In reply to Richard Henderson from comment #17)
> The REG_ARGS_SIZE notes are a red-herring.
> 
> The bug is that 
> 
> (insn:TI 66 61 31 4 (set (mem:SI (pre_dec:SI (reg/f:SI 7 sp)) [0  S4 A8])
>         (reg:SI 0 ax [orig:85 D.1918 ] [85])) z.c:21 66 {*pushsi2}
>      (nil))
> 
> as noted above created by split2, is not processed by the dwarf2cfi
> code at all, and so its stack adjustment is lost entirely.  Thus when
> we remove its adjustment later, we wind up with the wrong answer and
> that leads directly to the abort.

Hi rth,
you are right,I have been distracted.And I have tried to fix this in i386.c 
ix86_force_to_memory& ix86_free_from_memory,but fail.
The split is defined as follow:

(define_split
  [(set (match_operand 0 "register_operand")
    (match_operator 3 "binary_fp_operator"
       [(float (match_operand:SWI24 1 "register_operand"))
        (match_operand 2 "register_operand")]))]
  "reload_completed
   && X87_FLOAT_MODE_P (GET_MODE (operands[0]))
   && X87_ENABLE_FLOAT (GET_MODE (operands[0]), GET_MODE (operands[1]))"
  [(const_int 0)]
{
  operands[4] = ix86_force_to_memory (GET_MODE (operands[1]), operands[1]);
  operands[4] = gen_rtx_FLOAT (GET_MODE (operands[0]), operands[4]);
  emit_insn (gen_rtx_SET (VOIDmode, operands[0],
              gen_rtx_fmt_ee (GET_CODE (operands[3]),
                      GET_MODE (operands[3]),
                      operands[4],
                      operands[2])));
  ix86_free_from_memory (GET_MODE (operands[1]));
  DONE;
})

in i386.md:13640

Reply via email to