I am curious about the liberties that a compiler has when optimizing. Let’s limit this question to GCC and C/C++ (any version, any flavour of standard):
Is it possible to write code which behaves differently depending on which optimization level it was compiled with?
The example I have in mind is printing different bits of text in various constructors in C++ and getting a difference depending on whether copies are elided (though I’ve not been able to make such a thing work).
Counting clock cycles is not permitted. If you have an example for a non-GCC compiler, I’d be curious, too, but I can’t check it. Bonus points for an example in C. 🙂
Edit: The example code should be standard compliant and not contain undefined behaviour from the outset.
Edit 2: Got some great answers already! Let me up the stakes a bit: The code must constitute a well-formed program and be standards-compliant, and it must compile to correct, deterministic programs in every optimization level. (That excludes things like race-conditions in ill-formed multithreaded code.) Also I appreciate that floating point rounding may be affected, but let’s discount that.
I just hit 800 reputation, so I think I shall blow 50 reputation as bounty on the first complete example to conform to (the spirit) of those conditions; 25 if it involves abusing strict aliasing. (Subject to someone showing me how to send bounty to someone else.)
The portion of the C++ standard that applies is §1.9 "Program execution". It reads, in part:
So, yes, code may behave differently at different optimization levels, but (assuming that all levels produce a conforming compiler), but they cannot behave observably differently.
EDIT: Allow me to correct my conclusion: Yes, code may behave differently at different optimization levels as long as each behavior is observably identical to one of the behaviors of the standard’s abstract machine.