The optimizer is free to reorder the instructions. The compiler you
are currently using may do the right thing some of the time or even
all of the time but a future version may not. ADC is guaranteed by
the compiler developers to always work correctly.
This is how atmel recommends to read the results in
their data sheet...
The ATmega328 datasheet does not have a C code snippet for reading
the ADC result.
...and also this is how it is currently implemented
in analogRead() function.
"Current" being very relative. The code in question was very likely
first written when "ADC" was not provided or at a time when the
compiler performed the read incorrectly. Undoubtedly no one has
reviewed that snippet of code since it was first written.
- Brian