On Wednesday, 11 September 2024 at 18:54:21 UTC, Walter Bright wrote:
>On 9/11/2024 4:18 AM, Manu wrote:
>Obfuscating the contorting code is not the goal or a reasonable solution; we just want a mechanism in the language to take advantage of this general category of support in whatever architecture.
I tend to agree, but when micro-optimizing one's code, one accepts that its elegance is going to decline.
There are at least 3 ways to organize the code to get what you want. I won't claim they're beautiful, but they work.
FWIW, I agree with Walter that it is not worth to add a new special feature to the language for the problem at hand.
It is rare that you'd want to explicitly tell whether a branch is likely or not, and for that case the tool already exist (llvm_expect
for LDC). It think it would hurt D as a whole to have special stuff for such a rare thing.
I do agree that it'd be good to have a common interface for all compilers, which can be achieved by e.g. introducing a core.micro_optimization
module.
That module could collect more of such micro optimization things, like telling the compiler about likely function pointers or class types (devirtualization). [1]
Cheers,
Johan
[1]
auto is_likely(alias Likely, Fptr, Args...)(Fptr fptr, Args args) {
return (fptr == &Likely) ? Likely(args) : fptr(args);
}
// ...
void function() fptr = get_function_ptr();
fptr.is_likely!likely_function();
See https://johanengelen.github.io/ldc/2016/04/13/PGO-in-LDC-virtual-calls.html