Am 31.07.2014 17:26, schrieb Artur Skawina via Digitalmars-d:
On 07/31/14 15:44, Daniel Gibson via Digitalmars-d wrote:
And don't forget this (rather old) case: 
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=8537
(I really don't get why anyone would want such an optimization: I want an 
optimizer to use clever inlining, use SSE etc where it makes sense and stuff 
like that - but not to remove code I wrote.)

That is actually not a bug, but a perfectly valid optimization. The
compiler isn't clairvoyant and can not know that some data that you
wrote, but never read back, matters.

I don't want the compiler to care about that. When I tell it to write something, I want it to do that, even if it might look like nonsense (if anything, it could create a warning).


The solution is to tell the compiler that you really need that newly
(over-)written data. Eg

    asm {"" : : "m" (*cast(typeof(password[0])[9999999]*)password.ptr); }

inline asm is not portable


(yes, stdizing compiler barriers would be a good idea)

C11 defines a memset_s which is guaranteed not to be optimized away..
that's 9 years after that bugreport and will probably never be supported by MSVC (they don't even support C99). One could write a memset_s oneself.. that does a memset, reads the data and writes a char of it or something to a global variable (hoping that the compiler won't optimize that to "just set that variable to 0").

The thing is: I don't want a compiler to remove code I wrote just because it "thinks" it's superfluous. It could tell me about it as a warning, but it shouldn't just silently do it. If removing code makes my code faster, I can do it myself.

Cheers,
Daniel

Reply via email to