我使用LLVM来编译libtomcrypt,它的速度非常快(几秒钟),但是当我使用空白传递(只是一个无效的模块传递)时,它非常慢(几分钟)。
有人知道为什么吗?
我使用Fedora 19。
我使用的LLVM是发布版本中的LLVM 3.4。
由于
答案 0 :(得分:1)
我可以想到空模块传递可以通过两种方式对编译时产生负面影响:
模块传递强制传递管理器上的某种同步点。例如,假设您有以下内容:
在具有两个函数f()
和g()
的模块上。传球经理可以(并且将会)首先在f()
上运行A和B,然后只在g()
上运行A和B.除了其他原因之外,这对于内存局部性是有用的。
但是,如果添加模块传递:
然后强制传递管理器首先在两个函数上运行A,然后模块传递,然后在两个函数上运行B.
如果传递没有实现 getAnalysisUsage 方法,则默认为没有任何先决条件传递,并使所有其他传递无效。
因此,如果您的runOnModule
方法返回true
,则传递管理器将以前的所有分析传递视为无效,如果稍后需要,则强制重新运行它们。
要获得更完整的图片,建议您阅读a full explanation on what a pass manager does的文档。