Immutables converted to immediates

Iain Buclaw ibuclaw at gdcproject.org
Sat Jul 1 20:52:14 UTC 2023


On Wednesday, 28 June 2023 at 17:27:37 UTC, Cecil Ward wrote:
> GDC is generating a structure in the code segment and then 
> fetching it even though the values of the elements ought to be 
> known at compile-time. I’m not sure why. The actual code, 
> x86-64 in this case, consists of a load of fetches from the 
> code segment into successive registers before the start of the 
> loop, and the loop then consists of a load of instructions like 
> cmp [r8+4*rax], r9, where r9, r10 etc we’re loaded up from the 
> fetches from [rip+disp] before th4 loop, a minor strength 
> reduction compared to a compare-immediate, as it has plenty of 
> registers free. The mystery is why the fetches from [rip+disp] 
> even exist, given that they are known values.

Right, `immutable` (as well as `const`) has rather wobbly 
meanings, because you can have immutable data/fields that are 
initialized by a constructor - so in the worst case it can't be 
rodata at all.

For example:
```
immutable uint[] arr;

shared static this()
{
     arr = [1,2,3];
}
```
Here, we can't possibly know what the length of arr will end up 
being at run-time.

Based on the current wording of [the 
spec](https://dlang.org/spec/const3.html#const_and_immutable),

2. `immutable` applies to data that cannot change. Immutable data 
values, once constructed, remain the same for the duration of the 
program's execution.

3. `const` applies to data that cannot be changed by the const 
reference to that data. It may, however, be changed by another 
reference to that same data.


I guess there's scope for applying read-only semantics to both 
const and immutable locals/parameters.  For static data, only 
immutables that aren't set in a ctor can be read-only.


More information about the Digitalmars-d mailing list