Спеціалізація типів
Режим швидкості (-O2) може клонувати функцію у варіанти за представленням,
захищені перевірками тегів під час виконання. -O0 і
--no-type-specialization створюють лише узагальнений код.
Політика
- Профілі беруться з виведених фактів про місця виклику. Наразі лише точні
цілочислові синглтони, представні на цільовій платформі, доводять, що
аргумент є малим цілим. Специфікації (specs), широкий
integer(), об'єднання та невідомі типи залишаються узагальненими. - Варіант виправданий лише тоді, коли він усуває реалізовану перевірку: точне порівняння молодшого тегу при завантаженні аргументу у вхідному блоці, до побічних ефектів.
- Обмеження: 3 варіанти на функцію, 32 на модуль, 128 на ціль. Оцінене, а потім фактичне зростання (клон + guards + диспетчеризація + запасний шлях) має залишатися в межах 2x від кількості інструкцій узагальненого коду на функцію та модуль.
- Узагальнені тіла завжди зберігаються. Чернетки, що перевищують бюджет, мовчки відкидаються; програма ніколи не завершується збоєм через спеціалізацію.
- Вибір детермінований (порядок модуля, символу, профілю).
Пониження
Клонування/спрощення LLVM замінює доведені перевірки всередині клону. Обмежений диспетчер перевіряє кожен обмежений тег і передає контекст та аргументи варіанту або узагальненому тілу; публічний символ і ABI не змінюються. Жодного неперевіреного розпакування, припущень зі специфікацій чи прапорців fast-math не вводиться.
Поточний ефект
Поточна підмножина вихідного коду не має перевірок представлення, які можна усунути, тож реальний вихідний код Erlang отримує нуль варіантів навіть на O2; спеціалізація тотожної функції лише збільшила б код. Цільові фікстури LLVM вставляють повторювані перевірки тегів, щоб перевірити влучання, запасні шляхи та відкат зростання з нативним виконанням.
codegen_measurements записує measurements/<config>/measurements.json у
каталог збірки тестів codegen (час компіляції, байти IR/об'єктного коду,
варіанти, нативний час). Часи є описовими, ніколи не пороговими значеннями.
Зразок для Windows x64 / LLVM 23.1.2 (2026-09-29): вихідне навантаження
232,876 байтів IR / 40,498 байтів об'єктного коду на O0 і 204,408 / 35,886 за
обох політик O2, нуль варіантів; синтетична фікстура додала 30 інструкцій до
функції з 55 інструкцій для одного прийнятого варіанту.
Clause