chf...@pathscale:~/gcc$ cat foo.c int a[100], b[100], c[100]; void foo(int n, int mid) { int i; for(i=0; i<n; i++) { if (i < mid) a[i] = a[i] + b[i]; else a[i] = a[i] + c[i]; } }
chf...@pathscale:~/gcc$ gcc -O3 -ftree-vectorizer-verbose=7 -c foo.c foo.c:6: note: not vectorized: control flow in loop. foo.c:3: note: vectorized 0 loops in function. This loop can be vectorized by icc. For this case, I would expect to see two loops with iteration range of [0, mid) and [mid, n). Then both loops can be vectorized. I am not sure which pass in gcc should do this iteration range splitting. -- Summary: gcc should vectorize this loop through "iteration range splitting" Product: gcc Version: 4.5.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: changpeng dot fang at amd dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43423