https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114908
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Component|target |tree-optimization Ever confirmed|0 |1 Status|UNCONFIRMED |NEW Last reconfirmed| |2024-05-01 --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- __r = { 0, 0, 0, 0 }; __builtin_memcpy (&__r, &data, 24); __r.2_4 = __r; _5 = VIEW_CONVERT_EXPR<_Rp>(__r.2_4); That is a fancy way of doing a PERM like: _5 = VEC_PERM_EXPR <{ 0, 0, 0, 0 }, data_1(D), { 4, 5, 6, 0 }>; And then it does: MEM[(struct _Head_base *)&D.183459 + 32B]._M_head_impl._M_data.D.184855._M_data = _5; MEM <unsigned long> [(struct simd *)&__r] = 0; __builtin_memcpy (&MEM <struct _MemberType> [(void *)&__r + 8B], &MEM[(const struct simd &)&D.183459 + 32]._M_data, 24); SR.136_19 = MEM[(struct simd *)&__r]; __r ={v} {CLOBBER(eos)}; MEM[(struct simd *)&D.200690] = SR.136_19; Which is another fancy way of doing a PERM like: SR.136_19 = VEC_PERM_EXPR <{ 0, 0, 0, 0 }, _5, { 0, 4, 5, 6 }>;