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