<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Given a simple test where the maximum trip count is quite obvious, we end up producing a vectorized loop (or excessively complex control flow) seemingly because we are unable to determine the maximum trip count of the loop.</div><div>Here's an example:</div><div>#ifndef _START<br>#define _START 3<br>#endif<br>unsigned long test(unsigned long *a, unsigned long b) {<br>  for (unsigned long i = _START; i < (b & 7); i++)<br>    a[i] = b;<br>  return b;<br>}</div><div><br></div><div>If we compile that with -D_START=0, the loop is fully unrolled with a comparison and exit if the result of the and is equal to any of the 7 possible values at each unrolled iteration.</div><div>However, if we do not have that define (i.e. loop doesn't start from zero), we will vectorize the loop. There's even a "min.iters" check that is very obviously redundant:</div><div><br></div><div>%and = and i64 %b, 7</div><div>...<br></div><div>%0 = add nsw i64 %and, -3</div><div>%min.iters.check = icmp ult i64 %0, 24</div><div><br></div><div>The constant here will be different on different targets, but redundant nonetheless.</div><div>Does anyone think this is important to fix this or have any ideas on how to improve the handling here?<br></div></div></div></div></div></div>