Consequences of casting away immutable from pointers

Adam D. Ruppe destructionator at gmail.com
Fri Jan 5 04:16:48 UTC 2018


On Friday, 5 January 2018 at 04:10:54 UTC, Steven Schveighoffer 
wrote:
> The compiler assumes x is going to be 5 forever, so instead of 
> loading the value at that address, it just loads 5 into a 
> register (or maybe it just folds x == 5 into true).

I was curious what dmd did, and the disassembly indeed shows it 
just loads 5 into the register and leaves it there - assuming 
since it is immutable, it will never change through any pointer 
and thus never reloads it from memory at any time.

Interestingly, dmd -O just stubs out the whole function. I guess 
it assumes all the defined behavior actually accomplishes nothing 
and it is free to optimize out undefined behavior... thus the 
function needs no code. Similarly,  if the last assert is changed 
to x != 5, dmd -O doesn't even actually do a comparison (the 
value 5 never appears in the generated code!), it just outputs 
the direct call to assertion failure.


More information about the Digitalmars-d-learn mailing list