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)};`