Immutables converted to immediates
Cecil Ward
cecil at cecilward.com
Wed Jun 28 17:27:37 UTC 2023
This is a question about either the front end or back end of GDC
and maybe also LDC`.
At compile time, should the value of arr[0] etc be calculable so
that the code below turns out to be something like *p == 1 where
n is an immediate constant in asm?
immutable uint arr = [1,2,3];
immutable uint * p;
loop
{
if ( arr[0]== p[0] && arr[1] == p[1] && arr[2] == p[2]
…
}
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.
More information about the Digitalmars-d
mailing list