https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105711

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed.  We are expanding

MEM <vector(2) char> [(char *)&c] = { 0, 0 };

with 'c' expanded as

(concat:CQI (reg/v:QI 93 [ c ])
    (reg/v:QI 94 [ c+1 ]))

doing read_complex_part from

(subreg:CQI (const_vector:V2QI [
            (const_int 0 [0]) repeated x2
        ]) 0)

which is a) a missed subreg simplification (do we have const complex in RTL?).

We get into extract_bit_field_1 which eventually does

  /* Make sure we are playing with integral modes.  Pun with subregs
     if we aren't.  */
  opt_scalar_int_mode op0_mode = int_mode_for_mode (GET_MODE (op0));
  scalar_int_mode imode;
  if (!op0_mode.exists (&imode) || imode != GET_MODE (op0))
    {
      if (MEM_P (op0))
        op0 = adjust_bitfield_address_size (op0, op0_mode.else_blk (),
                                            0, MEM_SIZE (op0));
      else if (op0_mode.exists (&imode))
        {
          op0 = gen_lowpart (imode, op0);

getting us a HImode (const_int 0 [0]) as op0.  But extract_bit_field_as_subreg
which eventually ICEs only gets op0 but not its mode ...

I'm testing a patch.

Reply via email to