我使用Spec 2006基准测试来衡量一些私人通行证和生成的代码的性能。到目前为止,我所有的工作都是基于LLVM 3.1的。
上周我想继续使用 LLVM,并且我将所有通行证重新设置为LLVM 3.4。这只需要调整几#include
行。然而,在那次改变之后,我测量了一个巨大的性能回归。接下来,我禁用了所有自定义通行证,但性能仍然下降。以下是使用 LLVM 3.1 和 3.4 编译的一些 Spec 基准测试的数量
LLVM 3.1 LLVM 3.4
-------- --------
401.bzip2 7.50 17.5
429.mcf 4.72 8.10
456.hmmer 4.18 10.1
458.sjeng 4.85 8.86
433.milc 13.4 26.0
470.lbm 13.4 12.6
我还注意到 eg 调用的函数数量456.hmmer
从 6 变为 45009;大多数其他基准测试显示类似的数字。内联失败?
我用
CC=clang -g -std=c89 -D_GNU_SOURCE -c -emit-llvm
然后打电话opt
给
opt -simplifycfg -mem2reg -break-constgeps <my-passes> benchmark.bc -o benchmark.schnufte.bc
一旦opt
完成,位码就会被降低llc
并链接到一个可执行文件中。
性能回归非常明显,我怀疑 3.4 是否会以如此明显的回归发布。所以我的问题是:我错过了什么吗?现在是否更明确地调用了优化?我在通过后添加-std-compile-opts
到我的 opt 调用中,但这根本没有帮助。
编辑正如建议的那样,我向LLVMdev 邮件列表提出了这个问题,但该线程很少受到关注。