为什么 clang 的 `-O3` 分配在简单的分配基准上比 g++ 快 2 倍

问题描述 投票:0回答:1

关于alloca的使用和滥用

在上一个问题的底部得到了一些基准。 clang 显然在

-O3
优化器配置文件中有更好的实现。什么给? clang 是否偷工减料?另外,由于 clang 是一个现代编译器,它的
alloca
实现中是否有任何安全性或其他有趣的属性?

memory-management clang compiler-optimization micro-optimization alloca
1个回答
5
投票

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_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)并没有优化堆栈大小的变化(分配主效应)。

© www.soinside.com 2019 - 2024. All rights reserved.