2016-01-15 59 views
1

我在一个简单的c程序上使用单个LLVM优化传递'mem2reg'。LLVM -stats选项

opt <test>.bc -mem2reg -instcount -o <test>.bc -stats 

执行后,我看到的统计数据选项没有显示收集的统计信息,并似乎在为了使用“-stats”选项,LLVM必须启用断言编译。 我不明白,任何人都可以帮助我。

+0

你可以包含'opt --version'的输出吗? –

回答

1

没有什么特别的。这是一个设计决策,只收集+ Assert构建的统计数据。如果你看一下第llvm/ADT/Statistic.hStatistic类看起来是这样的:

class Statistic { 
public: 
    // Initialization stuff 
#if !defined(NDEBUG) || defined(LLVM_ENABLE_STATS) 
    // Actually keeping track of the stat 
#else 
    // Dummy ops that will be optimized away 
#endif 
}; 

正如你可以看到,统计收集既可以当NDEBUG定义(即断言建立时,例如,在释放+ Assets或Debug + Asserts模式)当定义了LLVM_ENABLE_STATS时,与构建类型无关。

在打印统计信息的代码中镜像了相同的结构。

只能通过重建来重新启用统计信息。如果您不需要或者不需要+ Asserts版本的开销,只需在到CFLAGS或等同于(重新)生成Makefile时添加-DLLVM_ENABLE_STATS即可。您可以在How To Release LLVM文档页面找到更多关于启用断言的信息。

至于为什么在发布版本中禁用统计信息,此行为是在commit fa785cb22d(2013年3月,它着陆于3.3)中引入的,可能用于消除由功能引入的内存和性能开销,除非您正在工作在LLVM本身。

也就是说,像Clang这样基于LLVM的编译器的大多数用户只是想将他们的源代码转换为可执行文件,并可能接收有意义的诊断信息,他们肯定希望编译器尽可能快地做到这一点。他们不太关心LLVM完成这个目标的确切方式,这完全可以理解。然而,这只是一个猜测,因为我在邮件列表档案中找不到任何相关的讨论。