Immutables converted to immediates

Cecil Ward cecil at cecilward.com
Wed Jun 28 17:48:41 UTC 2023


On Wednesday, 28 June 2023 at 17:27:37 UTC, Cecil Ward wrote:
> 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.

What it’s for: I have a tight loop to skip to the end of the 
various types of D comments eg "*/", or until a newline for "//" 
comments etc. as I’ve written a cheap parser for a small part of 
the grammar of D. There’s quite a bit of overhead before the 
start of the loop, and I’m not sure that this is such a great 
idea, jury is still out. I need to think about it more.


More information about the Digitalmars-d mailing list