Hi,

While trying to optimize pixman, I noticed that gcc is unable to
recognize that 'while (n >= 1)' can often be simplified to 'if (n >=
1)'. Consider the following example, where there are loops that
operate on larger amounts of data and smaller loops that deal with
small or unaligned data.

int sum(const int *l, int n)
{
    int s = 0;

    while (n >= 2) {
        s += l[0] + l[1];

        l += 2;
        n -= 2;
    }

    while (n >= 1) {
        s += l[0];

        l += 1;
        n -= 1;
    }

    return s;
}

Clearly the while (n >= 1) loop can never execute more than once, as n
must be < 2, and in the body of the loop, n is decremented.

The resulting machine code includes the backward branch to the top of
the while (n >= 1) loop, which can never be taken.

I suppose this is a missed optimization. Is this known, or should I
make a new bug report?

Thanks,
Matt Turner

Reply via email to