No CTFE of function
Cecil Ward via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Aug 28 06:31:44 PDT 2017
On Saturday, 26 August 2017 at 16:52:36 UTC, Cecil Ward wrote:
> I have a pure function that has constant inputs, known at
> compile-time, contains no funny stuff internally - looked at
> the generated code, and no RTL calls at all. But in a test call
> with constant literal values (arrays initialised to literal)
> passed to the pure routine GDC refuses to CTFE the whole thing,
> as I would expect it (based on previous experience with d and
> GDC) to simply generate a trivial function that puts out a
> block of CTFE-evaluated constant data corresponding to the
> input.
>
> Unfortunately it's a bit too long to post in here. I've tried
> lots of variations. Function is marked nogc safe pure nothrow
>
> Any ideas as to why GDC might just refuse to do CTFE on
> compile-time-known inputs in a truly pure situation? Haven't
> tried DMD yet. Can try LDC. Am using d.godbolt.org to look at
> the result, as I don't have a machine here to run a d compiler
> on.
>
> Other things I can think of. Contains function-in-a-function
> calls, which are all unlined out in the generated code nicely,
> and not the first time I've done that with GDC either.
>
> Switches: Am using -Os or -O2 or -O3 - tried all. Tuning to
> presume + enable the latest x86-64 instructions. release build,
> no bounds-checks.
I will henceforth use the enum trick advice all times.
I noticed that the problem with init =void is compiler-dependent.
Using an enum for real CTFE, I don't get error messages from LDC
or GDC (i.e. [old?] versions currently up on d.godbolt.org) x64
compilers even if I do use the =void optimisation. This saved a
totally wasteful and pointless zero-fill of 64 bytes using 2 YMM
instructions in the particular unit test case I had, but of
course could easily be dramatically bad news depending on the
array size I am unnecessarily filling.
More information about the Digitalmars-d-learn
mailing list