为什么clang的`-O3`分配比g ++快2倍

时间:2011-04-28 14:47:31

标签: memory-management compiler-construction clang micro-optimization

On the use and abuse of alloca

在上一个问题的底部有一些基准测试。 clang显然在-O3优化器配置文件中有更好的实现。是什么赋予了?铿锵切角?此外,由于clang是一个现代编译器,它的alloca实现中是否有任何安全性或其他有趣的属性?

1 个答案:

答案 0 :(得分:3)

德尔南的猜测是真的。但他没有说明测试非常糟糕,并且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)

即使使用-O1alloca_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主效应)。