Почему Clang `-O3` выделяется в 2 раза быстрее, чем g ++ - PullRequest
4 голосов
/ 28 апреля 2011

Об использовании и злоупотреблении выделением

Получил несколько ориентиров в нижней части предыдущего вопроса. Очевидно, что clang имеет лучшую реализацию в профиле оптимизатора -O3. Что дает? Кланг режет углы? Кроме того, поскольку clang является современным компилятором, есть ли в его реализации alloca какие-либо меры безопасности или другие интересные свойства?

1 Ответ

3 голосов
/ 28 апреля 2011

Угадай по Делнану это правда.Но он не учел, что тест очень плохой, и Clang может оптимизировать фактическую alloca операцию из alloca_test.

alloca_test, имеет только Ivm ir операцию alloca, но нет функции alloca()вызов:

%11 = call i32 @_Z18random_string_sizev()
%12 = alloca i8, i32 %11

Сравните с malloc_test:

%11 = call i32 @_Z18random_string_sizev()
%12 = call i8* @malloc(i32 %11)

Даже с -O1 больше нет выделений в alloca_test:

define void @_Z11alloca_testv() nounwind {
; <label>:0
  %1 = tail call i32 @_Z18random_vector_sizev()
  %2 = icmp sgt i32 %1, 0
  br i1 %2, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %.lr.ph, %0
  %i.01 = phi i32 [ %4, %.lr.ph ], [ 0, %0 ]
  %3 = tail call i32 @_Z18random_string_sizev()
  %4 = add nsw i32 %i.01, 1
  %exitcond = icmp eq i32 %4, %1
  br i1 %exitcond, label %._crit_edge, label %.lr.ph

._crit_edge:                                      ; preds = %.lr.ph, %0
  ret void
}

А для malloc_test вызов malloc все еще здесь:

%6 = tail call i32 @_Z18random_string_sizev()
%7 = tail call i8* @malloc(i32 %6)

Я должен также сказать, что g++ -O3 (протестировано 4.1 и 4.5.2) не оптимизирует изменение размера стека (основной эффект alloca)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...