https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91897
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |missed-optimization Target| |x86_64-*-*, i?86-*-* Status|UNCONFIRMED |NEW Last reconfirmed| |2019-09-25 Component|c++ |target Ever confirmed|0 |1 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- Confirmed. This seems to be a target / RTL expansion issue when expanding BIT_FIELD_REF <<retval>, 256, 0> = _10; BIT_FIELD_REF <<retval>, 256, 256> = _13; BIT_FIELD_REF <<retval>, 256, 512> = _16; BIT_FIELD_REF <<retval>, 256, 768> = _19; return <retval>; which individually are expanded as ;; BIT_FIELD_REF <<retval>, 256, 512> = _16; (insn 24 23 25 (set (mem/j/c:DI (plus:DI (reg/f:DI 94 [ .result_ptr ]) (const_int 64 [0x40])) [0 +64 S8 A512]) (subreg:DI (reg:V4DF 90 [ _16 ]) 0)) "t.c":5:17 -1 (nil)) (insn 25 24 26 (set (mem/j/c:DI (plus:DI (reg/f:DI 94 [ .result_ptr ]) (const_int 72 [0x48])) [0 +72 S8 A64]) (subreg:DI (reg:V4DF 90 [ _16 ]) 8)) "t.c":5:17 -1 (nil)) (insn 26 25 27 (set (mem/j/c:DI (plus:DI (reg/f:DI 94 [ .result_ptr ]) (const_int 80 [0x50])) [0 +80 S8 A128]) (subreg:DI (reg:V4DF 90 [ _16 ]) 16)) "t.c":5:17 -1 (nil)) (insn 27 26 0 (set (mem/j/c:DI (plus:DI (reg/f:DI 94 [ .result_ptr ]) (const_int 88 [0x58])) [0 +88 S8 A64]) (subreg:DI (reg:V4DF 90 [ _16 ]) 24)) "t.c":5:17 -1 (nil)) instead of a single ymm store. The same happens with the following which effectively mimics the ABI: typedef double Double16 __attribute__((vector_size(8*16))); void mult(Double16 &res, const Double16& v1, const Double16& v2) { res = v1 * v2; }