如何查看编译器应用于Swift代码的优化?

时间:2016-11-03 15:58:27

标签: swift compilation swift3 llvm

具体来说,我有一些Swift 3.0日志记录函数,它们将所有语句都包装在if中,只有当从ObjC桥接的两个static const值的操作具有非零结果时才会执行。

func logStuff(_ message: @autoclosure () -> String) {
    if a & b != 0 {
        // log stuff here...
    }
}

变量ab在我的桥接标题中声明如下:

static const NSUInteger a = <some literal>;
static const NSUInteger b = <some literal>;

logStuff()的结果为零并且启用了整个模块优化时,编译器是否会忽略对a & b的整个调用?

可以理解这个问题的具体答案,但是在任何情况下轻松查看LLVM实际应用的优化方法都是理想的。

1 个答案:

答案 0 :(得分:0)

如果使用自己使用检测编译的LLVM构建自己的Swift编译器,则应该能够按照LLVM文档Writing an LLVM Pass中的描述转储该信息。

但是优化传递交互,可以运行几次,并且可能并不总是按照您期望的方式执行。因此,您最好通过实验检查您关注的具体案例,然后检查生成的二进制文件。

由于它是一个日志记录函数,可能很容易动态触发,一个(可能更简单)替代静态检查编译器输出的方法是在调试器下运行可执行文件,在你期望的函数上设置断点不应该是调用,然后在可执行文件中执行一个操作,如果调用尚未优化,将触发调用。

然后,在应用程序的整个生命周期内重复验证,因为编译器和源代码会继续更改。 (或者认为这不值得那么勤奋。)