Optimising std::find on x86 and PPC

Zdenek Dvorak rakdver@atrey.karlin.mff.cuni.cz
Tue Dec 14 22:17:00 GMT 2004


Hello,

> Just so others have context, the trivially broken loop that Paolo had 
> sent to me looks like this:
> 
> int*
> check(int* a, int* b)
> {
>  for (; a < b; ++a)
>    if (*a == 1)
>      return a;
>  return a;
> }
> 
> 
> This was unrolled with 3.3.3, but 4.0 (and apparently 3.4) claims the 
> number of iterations is not runtime computable.
> 
> This is clearly wrong, as there are no stores in the entire function, so b 
> couldn't *possible* change, no matter what we do.

as Andrew noted, the problem is that the loop actually looks like

for (i = a; i < b; i += 4)
  something;

At rtl level we do not have sufficient information to determine the
number of iterations of this loop precisely at runtime -- we cannot
determine whether it is not infinite.  This however should not block
loop unrolling, and should be relatively simple to fix; I will try.

Note however that the fact that 3.3 unrolls this loop very likely means
that 3.3 is buggy; I guess that 3.3 would also unroll

for (i = a; i < b; i += 5)
  something;

Which would be obviously wrong, unless you are very careful with the way
number of iterations is determined (which 3.3 is not).

Zdenek

Zdenek



More information about the Libstdc++ mailing list