[SAOC 2026] CTFE Performance Weekly Update #4
Abul Hossain Khan
abulkhan19175 at gmail.com
Mon Oct 19 20:04:42 UTC 2026
Hi everyone,
This week was mostly bug fixing. Dennis filed a bunch of CTFE
bugs his wasm experiment found and suggested I fix some of them
to get a better understanding of the interpreter before writing
the interface. So that's what I did.
#### CTFE bug fixes
- `s[1]` on a one-element slice read the parent array instead of
erroring. An off-by-one in the bounds check, and two asserts in
`interpret3.d` relied on it -
https://github.com/dlang/dmd/pull/24040
- `s ~= cast(dchar) 0x110000` crashed the compiler. Now an error,
surrogates included - https://github.com/dlang/dmd/pull/24046
- `foreach_reverse` over a string skipped a stray byte at the end
instead of erroring. The error now prints the byte that failed to
decode - https://github.com/dlang/dmd/pull/24054
- `c && true` with a class reference gave `null` -
https://github.com/dlang/dmd/pull/24062
- `int /= uint` was folded in `int`, so `-5 /= 7u` gave a
different result than at run time. The cast semantic inserts on
the left side was thrown away -
https://github.com/dlang/dmd/pull/24069
- That one exposed a frontend bug: `x >>= y` took the type of the
shift count, unlike `x = x >> y`, so `int >>= uint` was a logical
shift with `-O`. Filed and fixed -
https://github.com/dlang/dmd/pull/24076
What I got out of it, in terms of the project: the interpreter
re-implements run time piece by piece. Appending a dchar goes
through the compiler's own UTF encoder, `foreach` over a string
is a hand-written decode loop standing in for `_aApplyRcd1`,
op-assign has its own typing. Every one of these is a place where
CTFE and run time can drift, and every one is something a new
engine has to provide again or route through druntime. That list
goes into the design doc.
Also the perf bot's new CTFE workload did its job on the first of
these PRs: one extra compare on the path every CTFE assignment
takes showed up as +0.13% instructions on the ctRegex tests,
invisible on the other workloads.
#### Tests and examples
- The three valid programs that the semantic-upfront experiment
broke had no coverage in the test suite, so they will be upstream
soon - https://github.com/dlang/dmd/pull/24077
- The code examples per expression kind going in and out of
`ctfeInterpret` that are here -
https://gist.github.com/abulgit/256ad4b52c2795806a1b369e5ef40004
#### What's next
- The design doc for the interface.
- The rest of the bug list.
Thanks to Dennis for mentoring this. As always, feel free to
leave any feedback or suggestions!
More information about the Digitalmars-d
mailing list