https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113677
--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Note it is not just about constants either. Take: ``` #define vect64 __attribute__((vector_size(8) )) #define vect128 __attribute__((vector_size(16) )) vect128 unsigned int f(vect64 unsigned int a, vect64 unsigned int b) { vect64 unsigned int zero={0, 0}; return __builtin_shufflevector (a, b, 0, 1, 2, 3); } ``` We get: ``` _1 = {a_3(D), { 0, 0 }}; _2 = {b_4(D), { 0, 0 }}; _5 = VEC_PERM_EXPR <_1, _2, { 0, 1, 4, 5 }>; ``` Which obvious could be done to just: `_5 = {a_3(D), b_4(D)};`