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 Gcc
mailing list