Удивительное рядом — clang и оптимизация
От: Dair Россия  
Дата: 09.04.16 19:00
Оценка:
Коллега из соседнего проекта попросил у меня помощи.
Проект, говорит, не собирается — компилирует бесконечно долго, уже и кофе пил, и на ночь оставлял.

Давай, говорю, проект, хоть посмотрю что как.
Посмотрел.

Version 7.3 (7D175), Apple LLVM version 7.3.0 (clang-703.0.29), проект под iOS.

В самом деле, без оптимизации проект собирается, с -Os (штатный для сборки релиза для заливки в аппстор) — не собирается. Висит бесконечно на этапе компиляции, ещё до линковки. Прождал 10 минут (перекурил), cancel.

Нашёл файл, который не хочет компиляться.

C++98, никакого Objective-C++ (игра). Никакого boost или ещё какой шаблонной магии. Конкретно в этом файле даже STL нет.
Вообще файл назван main.cpp, содержит 7 глобальных переменных числовых типов (uint, DWORD и float; одна из глобальных переменных gMsPerFrame (вполне self-explaining) типа float) и несколько функций без классов общего вида, типа

void Init()
{
    gSomeObject.Init();
    gSomeOtherObject.Init();
    ...
}


Все эти gObject определены в других файлах.

Начал комментировать последовательно, нашёл участок кода, который приводит к эффекту.

в функции Update(), которая, как я предполагаю, вызывается каждый кадр игры, есть определение FPS. Ну, там, получить время, понять сколько времени прошло с предыдущего запроса. Что от этого зависит — не разбирался.
Но добавлен нижний "фильтр" на FPS вот такого совершенно невинного вида:
if (gMsPerFrame > 66)
    gMsPerFrame = 66;


Закомментарил — всё компилируется.

Заменил на такой же невинный фрагмент:
    float newMsPerFrame = gMsPerFrame > 66? 66: gMsPerFrame;

    gMsPerFrame = newMsPerFrame;


Компилируется.

Интересно как оптимизация сработала. Точнее, кмк, не сработала.
Отредактировано 09.04.2016 20:17 Dair . Предыдущая версия .
Re: Удивительное рядом — clang и оптимизация
От: Vain Россия google.ru
Дата: 09.04.16 19:21
Оценка:
Здравствуйте, Dair, Вы писали:

D>в функции Update(), которая, как я предполагаю, вызывается каждый кадр игры, есть определение FPS. Ну, там, получить время, понять сколько времени прошло с предыдущего запроса. Что от этого зависит — не разбирался.

D>...
D>Интересно как оптимизация сработала. Точнее, кмк, не сработала.
ошибка с точностью вокруг float?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: Удивительное рядом — clang и оптимизация
От: AlexGin Беларусь  
Дата: 10.05.16 18:09
Оценка: -1
Здравствуйте, Dair, Вы писали:

D>Но добавлен нижний "фильтр" на FPS вот такого совершенно невинного вида:

D>
D>if (gMsPerFrame > 66)
D>    gMsPerFrame = 66;
D>


D>Закомментарил — всё компилируется.


D>Заменил на такой же невинный фрагмент:

D>
D>    float newMsPerFrame = gMsPerFrame > 66? 66: gMsPerFrame;

D>    gMsPerFrame = newMsPerFrame;
D>


D>Компилируется.


D>Интересно как оптимизация сработала. Точнее, кмк, не сработала.


Т.к. это значения типа float, я бы написал так:
if (gMsPerFrame > 66.0)
    gMsPerFrame = 66.0;


Ну или вот так:
    float newMsPerFrame = gMsPerFrame > 66.0 ? 66.0 : gMsPerFrame;

    gMsPerFrame = newMsPerFrame;
Отредактировано 10.05.2016 18:10 AlexGin . Предыдущая версия .
Re: Удивительное рядом — clang и оптимизация
От: Tilir Россия http://tilir.livejournal.com
Дата: 20.05.16 08:49
Оценка:
Здравствуйте, Dair, Вы писали:

D>Интересно как оптимизация сработала. Точнее, кмк, не сработала.


Попробуйте в два этапа:

1) сначала clang++ с опцией -emit-llvm до test.bc
2) потом llc до объектника.

Чтобы установить в каком компоненте -- во фронтенде или в бэкенде баг.

Дальше заведите баг в трекере.
Re[2]: Удивительное рядом — clang и оптимизация
От: T4r4sB Россия  
Дата: 20.05.16 09:14
Оценка: +1
Здравствуйте, AlexGin, Вы писали:


AG>Т.к. это значения типа float, я бы написал так:


66.0f
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.