Leif Gram: Mr. Fix

Пожелание

Требуется следующая оптимизация для C++.

Допустим, встрeтился такой код:
double x = drand48();
f(x, 1, true);


Допустим далее, что после перебора всех кандидатов для f, наилушей оказалась некоторая
f(double, int32_t, bool) {...},
причем ее определение известно.

В таком случае компилятор должен сгенерировать код определения функции одного переменного f_1(double), полученный из кода исходной функции f подстановкой констант на место остальных параметров, оптимизировать его согласно стандартным правилам оптимизации, и вызвать f_1(x).
Как говорится, I'd like to raise the level of this discussion.

Давайте попросим constexpr функции с constexpr параметрами, то есть:

constexpr int f (double, constexpr int32_t, constexpr bool) { /* тело */ }

определяет потенциальное (так же, как и темплейты) семейство функций с частичными специализациями, от исходной 3-аргументной f до функции от одного double аргумента. Было, навскидку, предложение http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1045r0.html которое пробрасывает constexpr параметры, но это не совсем то.

В конкретно Вашем случае фиксируемы параметры целые, так что можно сделать темплейт функцию от одного аргумента double с такими темплейт параметрами и сделать специализации таким способом.

Тогда в коде будет

double x = drand48();
f<1, true>(x);

Сама f имплементируется по-прежнему, только вместо последних параметров функции используются параметры темплейта.

В более общем случае, можно применить clang-tools и напускать его на текст программы, заменяя все вызовы f(..., 1, true) на f_1_true(...) и для каждого такого случая копировать имплементацию f с подставленными константами. Как мотивирующий вариант, у нас есть процедура просмотра кода и убивание аргумента функции, если она всегда вызывается с конкретным значением этого аргумента - работает почти автоматизированно, если не напорется на хитрые имена функций.