LLVM在激活传递时较慢

时间:2014-01-08 09:11:48

标签: performance llvm libtomcrypt

我使用LLVM来编译libtomcrypt,它的速度非常快(几秒钟),但是当我使用空白传递(只是一个无效的模块传递)时,它非常慢(几分钟)。

有人知道为什么吗?

我使用Fedora 19。

我使用的LLVM是发布版本中的LLVM 3.4。

由于

1 个答案:

答案 0 :(得分:1)

我可以想到空模块传递可以通过两种方式对编译时产生负面影响:

1。通过订购

模块传递强制传递管理器上的某种同步点。例如,假设您有以下内容:

  1. 功能传递A
  2. 功能传递B
  3. 在具有两个函数f()g()的模块上。传球经理可以(并且将会)首先在f()上运行A和B,然后只在g()上运行A和B.除了其他原因之外,这对于内存局部性是有用的。 但是,如果添加模块传递:

    1. 功能传递A
    2. 模块传递
    3. 功能传递B
    4. 然后强制传递管理器首先在两个函数上运行A,然后模块传递,然后在两个函数上运行B.

      2。使以前的结果无效

      来自the documentation

        

      如果传递没有实现 getAnalysisUsage 方法,则默认为没有任何先决条件传递,并使所有其他传递无效。

      因此,如果您的runOnModule方法返回true,则传递管理器将以前的所有分析传递视为无效,如果稍后需要,则强制重新运行它们。

      要获得更完整的图片,建议您阅读a full explanation on what a pass manager does的文档。