我在一个简单的c程序上使用单个LLVM优化传递'mem2reg'。LLVM -stats选项
opt <test>.bc -mem2reg -instcount -o <test>.bc -stats
执行后,我看到的统计数据选项没有显示收集的统计信息,并似乎在为了使用“-stats”选项,LLVM必须启用断言编译。 我不明白,任何人都可以帮助我。
我在一个简单的c程序上使用单个LLVM优化传递'mem2reg'。LLVM -stats选项
opt <test>.bc -mem2reg -instcount -o <test>.bc -stats
执行后,我看到的统计数据选项没有显示收集的统计信息,并似乎在为了使用“-stats”选项,LLVM必须启用断言编译。 我不明白,任何人都可以帮助我。
没有什么特别的。这是一个设计决策,只收集+ Assert构建的统计数据。如果你看一下第llvm/ADT/Statistic.h
的Statistic
类看起来是这样的:
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完成这个目标的确切方式,这完全可以理解。然而,这只是一个猜测,因为我在邮件列表档案中找不到任何相关的讨论。
你可以包含'opt --version'的输出吗? –