Mail Archives: djgpp/2002/09/18/09:07:24
Hello.
Rafal 'Raf256' Maj wrote:
>
> Hans-Bernhard Broeker <broeker AT physik DOT rwth-aachen DOT de> wrote in
> news:alvrup$25r$1 AT nets3 DOT rz DOT RWTH-Aachen DOT DE
>
> >> int main() { for (long long int i=0; i<500000000; i++) ; return 0; }
> >> why this dead-loop is not removed ?
>
> > Because the GCC people explicitly decided to not do that, IIRC. The
> > distinction being that a loop explicitly coded with an empty body is
> > probably a timing-critical delay loop, and as such should be left
> > alone. If you put something into the loop, and try again, you just
> > might see what you expected.
>
> int a;
> for (long long int i=0; i<500000000; i++) a=0;
>
> gives same result :-/
What does that prove? How do you know that gcc doesn't move the assignment
outside the loop, giving you almost the same code as before:
int a;
for (long long int i=0; i<500000000; i++) ;
a=0;
> IMHO time-critical loops should be marked as :
>
> for (volatile long long int i=0; i<500000000; i++) ;
> ^^^^^^^^
> this will never be optimized. And all dead codes should be deleted (this
> loop is not due to volatile counter)
I thought that 'volatile' meant that something external to the program could
modify the value (e.g.: some interrupt handler). Note that 'volatile' may have
no effect, depending on the C implementation. See point 8 on page 28 of the
C99 standard.
Also, why should the compiler drop this loop? You've asked it to loop, so why
shouldn't it generate code to do that? You can't expect the compiler to do all
the optimisation for you!
> Meybe I should report somwhere that 'bug' ? I use gcc 2.95
I think you should ask gcc AT gnu DOT org if there is a warning to detect empty
bodies in for loops, where the only action is to increase the loop counter.
But even then there may not be one. It's probably possible to construct a case
where the warning would be bogus.
Regards,
--
Richard Dawe [ http://www.phekda.freeserve.co.uk/richdawe/ ]
- Raw text -