Предположението на delnan е вярно. Но той не отчете, че тестът е много лош и 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 в 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).
person
osgx
schedule
28.04.2011
alloca
към инструкцията LLVMalloca
, пропускът (широко използван, тъй като се грижи за създаването на добре оформен SSA)Reg2Mem
може да го трансформира в използване на регистри на ниво LLVM, които получават всички оптимизации, които LLVM предоставя за нормални променливи. - person   schedule 28.04.2011