фиктивные перемещения, сгенерированные gcc - PullRequest
4 голосов
/ 23 января 2012

Небольшое любопытство, которое я нашел; GCC, похоже, генерирует следующий код, когда у меня много флагов оптимизации:

00000000004019ae:   test %si,%si
00000000004019b1:   movups %xmm0,%xmm0
00000000004019b4:   je 0x401f40 <main(int, char**)+1904>

Вопрос: какой цели служит вторая инструкция? Это не похоже на это / делает / что-нибудь; Итак, это какая-то оптимизация для выравнивания программы в кеше команд? Или это что-то с не по порядку исполнением? (Я собираю с -mtune=native на Nehalem, если это поможет: D).

Ничего срочного, конечно, просто любопытно.

Ответы [ 2 ]

6 голосов
/ 23 января 2012

Возможно xmm0 содержит результат некоторых вычислений, выполненных в целочисленной области (с целочисленной инструкцией SSE). Ожидается, что следующая инструкция, использующая xmm0, будет находиться в области с плавающей запятой (инструкция SSE с плавающей запятой).

Nehalem может выполнить эту следующую инструкцию быстрее, если xmm0 будет перенесен в область с плавающей запятой с такой инструкцией, как movaps или movups. И может быть полезно выполнить эту миграцию до инструкции условного перехода. В этом случае миграция выполняется только один раз. Если инструкция movups не используется, миграция может быть выполнена дважды (автоматически с помощью первой инструкции FP в этом регистре), первый раз спекулятивно, на неверно предсказанной ветви, и второй раз - на правильной ветви.

Кажется, компилятор заметил, что лучше оптимизировать цепочки зависимостей вычислений, чем оптимизировать размер кода и ресурсы выполнения.

2 голосов
/ 23 января 2012

В дополнение к гипотезе, предложенной Евгением Клюевым, другие возможности (в произвольном порядке) заключаются в том, что (a) это ошибка оптимизатора компилятора, (b) movups вставляется для разрыва зависимости или (c) она вставляетсяс целью выравнивания кода.

...