https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101842
Bug ID: 101842 Summary: Vectorizer doesn't vectorize when loop bound depends on two independent variables that are unknown Product: gcc Version: 12.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: tnfchris at gcc dot gnu.org Target Milestone: --- The following example float f(float *p, float d, int len, float lim) { float m[4]; for (int i = 0; i < len && d >= lim; i += 4) { m[0] = p[0] * p[0]; m[1] = p[1] * p[1]; m[2] = p[2] * p[2]; m[3] = p[3] * p[3]; d = d - m[0]; d = d - m[1]; d = d - m[2]; d = d - m[3]; p += 4; } return d; } isn't vectorized at -Ofast because ``` missed: not vectorized: number of iterations cannot be computed. ``` which seems odd because I would expect that it would be treated as just any other loop with unbounded iterations. Commenting out this check results in it bailing out because of it not knowing how to deal with the reduction. This loop should be easy to vectorize with vectorizing the multiplications of m and then reducing the changes of `d - sum (m[0..3])`.