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).
Но разве это уже не так? Если код функции известен at the call site, то компилятор попытается to expand этот код и все константы запустят элиминацию ненужного кода.
Это если он решить делать инлайнинг. Но ведь не все подряд функции инлайнятся, и делается это по каким-то нестандартным причинам, подозреваю, что связанными в первую очередь с длиной функции.
Я ни разу не эксперт по оптимизации, но насколько я знаю в большинстве компиляторов сейчас такие вещи строятся на heuristics. Т.е., другими словами: хрен поймёшь. Большинство стандартных функций инлайнятся - видимо, и потому что они таки да, короткие и код их известен, даже если не виден на момент вызова.

Более того, перезапуская компилятор, можно получить другой код! Потому что одна из метрик может быть время работы конкректного алгоритма оптимизации. Если считает слишком долго, то либо отменяется, либо принимаются результаты на момент принудительной остановки.
Ну вот, а то, что я говорю, может быть легко проделано на уровне препроцессинга текста программы стандартным и пресказуемым образом, а там уж пускай оптимизатор применяет свои эвристики. Неужели заранее очевидно, что это не нужно?
Думаю что это можно установить только экспериментально с конкретным компилятором. Сама по себе оптимизация хорошая, и я уверен что о ней уже думали и она срабатывает в каких-то случаях.