How is it possible that countUntil() generates a jump-table when the hayStack is a compile time array?

realhet real_het at hotmail.com
Sat Oct 1 13:20:08 UTC 2022


Hello,

I just wanted to optimize a byte -> index lookup, by using a 256 
element table instead of using [1, 2, 3].countUntil(x) and I was 
amazed what I've found.
My solution lookup[x] was not faster at all, because LDC2 
amazingly optimized the linear search to a jump table.

Anyone please can tell me, how it is possible?

I looked inside the countUntil() template and I see no static ifs 
for compile time optimizations.

Is it true that: The compiler notices that there is a while loop 
on a static compile time array and it is clever enough to solve 
all the calculations in compile time and generate a completely 
unrolled loop? Then the optimizer transforms it to the jump table 
and do it with "jmp rax" ?

If I'm right, this is not just std library magic, it works even 
with my own template functions.
I'm also getting crazy long compile times, so this gotta be the 
case :D

Thank You in advance.


More information about the Digitalmars-d-learn mailing list