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)

Reply via email to