https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98849
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- int a[1024], b[1024]; void foo (void) { for (int i = 0; i < 1024; i++) a[i] = b[i] << 3; } void bar (int x) { for (int i = 0; i < 1024; i++) a[i] = b[i] << x; } ICEs with -O3 -mcpu=iwmmxt too. Here the vectorizer understands the target has vector x vector shift and not vector x scalar, so we get: vect_cst__13 = { 3, 3 }; ... vect__2.7_14 = vect__1.6_8 << vect_cst__13; but veclower carelessly undoes that: vect__2.7_14 = vect__1.6_8 << 3;