Почему Clang `-O3` выделяет память в 2 раза быстрее, чем g++

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

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


person Hassan Syed    schedule 28.04.2011    source источник
comment
Это всего лишь дикая догадка, но: Если clang сопоставляет alloca с инструкцией LLVM alloca, проход Reg2Mem (широко используемый, поскольку он заботится о создании правильно сформированного SSA) может преобразовать его в использование регистров уровня LLVM, которые получают все оптимизации, которые LLVM предоставляет для обычных переменных.   -  person    schedule 28.04.2011


Ответы (1)


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

alloca_test имеют только llvm 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 больше нет alloca:

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).

person osgx    schedule 28.04.2011
comment
ну семантически эффект тот же нет? Встраивание семантики alloca по сравнению с использованием вызова llvm il, память по-прежнему создается в кадре стека? - person Hassan Syed; 28.04.2011
comment
Я не знаю, позволяет ли llvm вызывать alloca (как вызываемая функция может изменить размер стека вызывающей стороны), но оператор alloca ir находится в базовом наборе операций ir. llvm.org/docs/LangRef.html#i_alloca - person osgx; 28.04.2011