How about a 100% CTFE?

Martin Nowak dawg at dawgfoto.de
Tue Nov 8 10:35:42 PST 2011


On Tue, 08 Nov 2011 09:08:49 +0100, Don <nospam at nospam.com> wrote:

> On 07.11.2011 21:36, Martin Nowak wrote:
>> On Mon, 07 Nov 2011 20:42:17 +0100, Trass3r <un at known.com> wrote:
>>
>>>>>> version(ARM)
>>>>>> {
>>>>>> immutable X = armSpecificCode(); // you want to run this on an  
>>>>>> X86???
>>>>>> }
>>>>>>
>>>>> I've always thought that it would be worthwhile to experiment with
>>>>> LLVM's JIT engine here.
>>>>> But as has been said quite some care will be necessary for cross
>>>>> compilation.
>>>>> Allowing arbitrary non-pure functions would cause lots troubles.
>>>>
>>>> Yeah, I think JIT for CTFE would be *very* interesting. But mainly
>>>> for reasons of speed rather than functionality.
>>>
>>> How would JIT work in the above case?
>>
>> You would need to do JIT a target agnostic IR.
>
> Yeah, it's only the glue layer which needs to change. The main  
> complexity is dealing with pointers.

Currently it only seems viable for strongly pure functions.
One would still need to be very careful about target dependencies through  
libc calls (sinl et.al.),
marshalling the arguments and the result is necessary and dmd doesn't have  
a virtual machine, does it?
One could try to fake the latter by compiling to executables, but it would  
require a target specific runtime/stdlib.

Overall I don't have too much performance issues with CTFE.

I've more issues with badly scaling compiler algorithms now that they
are used with magnitudes bigger input, i.e. unrolled loops or huge array  
literals.
Especially considering that they performance impact mostly stems from  
codegen
and sometime the generated code is only used for compile time  
initialization.

A lot of garbage is created during CTFE as in-place changes don't always  
work.
For example I haven't yet succeeded in writing an in-place CTFE quicksort,
so I ended up with 'sort(left) ~ pivot ~ sort(right)'.

martin


More information about the Digitalmars-d mailing list