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.