https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114184
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- BTW, typedef unsigned char V __attribute__((vector_size (16))); long double foo (void) { long double d; *(V *)&d = (V) { 149, 136, 89, 42, 38, 240, 196, 194 }; return d; } ICEs at -O2 too since r14-4537-g70b5c6981fcdff246f90e57e91f3e1667eab2eb3 so I'm afraid even trying to optimize the XFmode lowpart SUBREG of the CONST_VECTOR into same size SUBREG from half sized CONST_VECTOR to XFmode wouldn't help, because that is exactly what we have in this testcase, (insn 5 2 6 2 (set (reg/v:XF 98 [ d ]) (subreg:XF (const_vector:V16QI [ (const_int -107 [0xffffffffffffff95]) (const_int -120 [0xffffffffffffff88]) (const_int 89 [0x59]) (const_int 42 [0x2a]) (const_int 38 [0x26]) (const_int -16 [0xfffffffffffffff0]) (const_int -60 [0xffffffffffffffc4]) (const_int -62 [0xffffffffffffffc2]) (const_int 0 [0]) repeated x8 ]) 0)) "pr114184-4.c":6:12 -1 (nil))