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.