https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84234
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> --- #pragma omp declare simd or simd attribute say that on the definition compiler should create alternate entry point(s) for the vectorized variants, and on declarations that on the definition they were created, and that the compiler can use them on vectorized loops. That is true also on your testcase, just the compiler decided not to use them because it couldn't prove it doesn't have a side-effect that would prevent it. What I don't understand is when you are using #pragma omp declare simd why aren't you also using #pragma omp simd on the loops you want to vectorize.