https://gcc.gnu.org/bugzilla/show_bug.cgi?id=72717
Aldy Hernandez <aldyh at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |aldyh at gcc dot gnu.org, | |meissner at gcc dot gnu.org --- Comment #2 from Aldy Hernandez <aldyh at gcc dot gnu.org> --- FWIW: emit_move_insn() is trying to emit a move from an SI to a DI and dying: #1 0x00000000107a4e24 in emit_move_insn (x=0x3fffb58bd8f0, y=0x3fffb58bd8a8) at /home/aldyh/gcc/gcc/expr.c:3696 (gdb) call debug_rtx(x) (reg:DI 179) (gdb) call debug_rtx(y) (subreg/s/v:SI (reg:DI 156 [ _3 ]) 0) (gdb) This comes via rs6000_expand_vector_init(): /* Double word values on VSX can use xxpermdi or lxvdsx. */ if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode)) { rtx op0 = XVECEXP (vals, 0, 0); rtx op1 = XVECEXP (vals, 0, 1); if (all_same) { if (!MEM_P (op0) && !REG_P (op0)) => op0 = force_reg (inner_mode, op0); if (mode == V2DFmode) emit_insn (gen_vsx_splat_v2df (target, op0)); else emit_insn (gen_vsx_splat_v2di (target, op0)); ...where we have: (gdb) p inner_mode $4 = DImode (gdb) call debug_rtx(vals) (parallel:V2DI [ (subreg/s/v:SI (reg:DI 156 [ _3 ]) 0) (subreg/s/v:SI (reg:DI 156 [ _3 ]) 0) ]) (gdb) p inner_mode $5 = DImode (gdb) call debug_rtx(op0) (subreg/s/v:SI (reg:DI 156 [ _3 ]) 0)