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

            Bug ID: 108264
           Summary: [11/12/13 Regression] ICE compiling guacamole-server
                    on s390x-linux
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jakub at gcc dot gnu.org
  Target Milestone: ---

int v;
extern int bar (void);

static inline void
foo (char *d)
{
  switch (bar ())
    {
    case 2:
      d[0] = d[1] = d[2] = d[3] = v;
      break;
    case 4:
      d[0] = 0;
    }
}

int
baz (int x)
{
  foo ((char *) &x);
  return x;
}

ICEs with -O2 -march=z13 -fpic (in 11 with -O2 -ftree-vectorize -march=z13
-fpic) in:
during RTL pass: expand
dump file: guacamole-ice.i.254r.expand
In function ‘foo’,
    inlined from ‘baz’ at guacamole-ice.i:20:3:
guacamole-ice.i:10:12: internal compiler error: in convert_move, at expr.cc:297
   10 |       d[0] = d[1] = d[2] = d[3] = v;
      |       ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
This is when expanding
  _2 = {_6, _6, _6, _6};
  MEM <vector(4) char> [(char *)&x] = _2;
where
  vector(4) char _2;
and x is int PARM_DECL.
to in convert_move is (reg/v:DI 66 [ x+-4 ]) and from is (reg:V4QI 70) , so the
modes have different sizes.  But x is actually int and so the DImode is
argument promotion.

Reply via email to