https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67681
Bug ID: 67681 Summary: Missed vectorization: induction variable used after loop Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: alalaw01 at gcc dot gnu.org Target Milestone: --- The inner loop here: void addlog2 (int *data) { int i = 1; for (int j=0; j<=30; j++) { int max = 1 << j; if (FOO && i>max) break; for (; i <= max; i++) data[i] += j; } } does not vectorize if the if(FOO...) is present: $ /work/alalaw01/build-aarch64-none-elf/install/bin/aarch64-none-elf-gcc -S -O2 -ftree-vectorize -fdump-tree-vect-details=stdout loop9b.c -DFOO=1 | grep vectorized loop9b.c:1:6: note: not vectorized: inner-loop count not invariant. loop9b.c:8:5: note: === vect_mark_stmts_to_be_vectorized === loop9b.c:8:5: note: not vectorized: value used after loop. loop9b.c:8:5: note: === vect_mark_stmts_to_be_vectorized === loop9b.c:8:5: note: not vectorized: value used after loop. loop9b.c:1:6: note: vectorized 0 loops in function. $ aarch64-none-elf-gcc -S -O2 -ftree-vectorize -fdump-tree-vect-details=stdout loop9b.c -DFOO=0 | grep vectorized loop9b.c:4:3: note: not vectorized: inner-loop count not invariant. loop9b.c:8:5: note: === vect_mark_stmts_to_be_vectorized === loop9b.c:8:5: note: loop vectorized loop9b.c:1:6: note: vectorized 1 loops in function. Same with -O3. Of course clever analysis could figure out that i>max is never true, but even without that, we should be able to get 'i' back afterwards.