https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79514
Uroš Bizjak <ubizjak at gmail dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Component|target |middle-end
--- Comment #4 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Uroš Bizjak from comment #3)
> (In reply to Gerhard Steinmetz from comment #0)
> > (insn 10 9 11 2 (set (mem:XF (pre_modify:DI (reg/f:DI 7 sp)
> > (plus:DI (reg/f:DI 7 sp)
> > (const_int -16 [0xfffffffffffffff0]))) [2 S12 A32])
> > (reg:XF 87 [ _1 ])) "pr46251.c":3 118 {*pushxf}
> > (expr_list:REG_DEAD (reg:XF 87 [ _1 ])
> > (expr_list:REG_ARGS_SIZE (const_int 16 [0x10])
> > (nil))))
>
> This doesn't look like a valid RTL to me.
A bit of debugging shows:
Breakpoint 1, gen_movxf (operand0=0x2aaaae8f3318, operand1=0x2aaaae8daf90) at
../../git/gcc/gcc/config/i386/i386.md:3185
3185 return standard_sse_constant_opcode (insn, operands[1]);
(gdb) p debug_rtx (operand1)
(reg:XF 87 [ _1 ])
$3 = void
(gdb) p debug_rtx (operand0)
(mem:XF (pre_modify:DI (reg/f:DI 7 sp)
(plus:DI (reg/f:DI 7 sp)
(const_int -16 [0xfffffffffffffff0]))) [2 S12 A32])
$4 = void
(gdb) bt
#0 gen_movxf (operand0=0x2aaaae8f3318, operand1=0x2aaaae8daf90) at
../../git/gcc/gcc/config/i386/i386.md:3185
#1 0x00000000007e23ef in operator() (a1=0x2aaaae8daf90, a0=0x2aaaae8f3318,
this=<optimized out>) at ../../git/gcc/gcc/recog.h:301
#2 emit_move_insn_1 (x=0x2aaaae8f3318, y=0x2aaaae8daf90) at
../../git/gcc/gcc/expr.c:3643
#3 0x00000000007e2745 in emit_move_insn (x=x@entry=0x2aaaae8f3318,
y=y@entry=0x2aaaae8daf90) at ../../git/gcc/gcc/expr.c:3738
#4 0x00000000007e4433 in emit_single_push_insn_1 (type=0x2aaaae7c8498,
x=0x2aaaae8daf90, mode=<optimized out>) at ../../git/gcc/gcc/expr.c:4185
#5 emit_single_push_insn (mode=<optimized out>, x=0x2aaaae8daf90,
type=0x2aaaae7c8498) at ../../git/gcc/gcc/expr.c:4197
#6 0x00000000007e817b in emit_push_insn (x=0x2aaaae8daf90, mode=XFmode,
type=0x2aaaae7c8498, size=0x0, align=64, partial=0, reg=0x0, extra=0,
args_addr=0x0, args_so_far=0x2aaaae7b0480, reg_parm_stack_space=0,
alignment_pad=0x2aaaae7b0480, sibcall_p=true)
at ../../git/gcc/gcc/expr.c:4536
...
(gdb) f 4
#4 0x00000000007e4433 in emit_single_push_insn_1 (type=0x2aaaae7c8498,
x=0x2aaaae8daf90, mode=<optimized out>) at ../../git/gcc/gcc/expr.c:4185
4185 emit_move_insn (dest, x);
(gdb) p debug_rtx (dest)
(mem:XF (pre_modify:DI (reg/f:DI 7 sp)
(plus:DI (reg/f:DI 7 sp)
(const_int -16 [0xfffffffffffffff0]))) [2 S12 A32])
$12 = void
(gdb) list
4180 outgoing arguments and we cannot allow reordering of reads
4181 from function arguments with stores to outgoing arguments
4182 of sibling calls. */
4183 set_mem_alias_set (dest, 0);
4184 }
4185 emit_move_insn (dest, x);
4186 }
4187
4188 /* Emit and annotate a single push insn. */
4189
So, it is middle end that generates invalid RTX.