llvm:ScalarEvolution:tripcount和tripmultiple之间的差异

时间:2015-11-05 22:32:50

标签: llvm

我目前正在使用llvm并且我专注于循环:因为我想展开循环,我发现llvm已经提供了一个展开循环的函数。该函数需要以下参数:

  • 确定展开次数的count(展开后循环体存在的次数)
  • 一个tripcount,它确定循环执行的次数(在展开之前)。或者确切地说(取自getSmallConstantTripCount类中ScalarEvolution函数的文档):
      

    [...]它是控制在进入分支之前可以达到ExitingBlock的次数。对于具有多个出口的循环,如果循环通过另一个分支过早退出,则它可能不是循环头执行的次数

  • 一个tripmultiple - 根据getSmallConstantTripMultiple类中ScalarEvolution函数的文档 - 是
      

    [...]此循环的行程计数的最大常数除数[...]

  • 其他一些与此问题无关的论点。

可以使用已经提到的函数从tripcount类获取tripmultipleScalarEvolution值。我的传递当前使用这些值但是当我开始测试几个循环的传递时,似乎两个值总是相等的(当我开始使用break来创建CFG中的早期退出时,llvm无法确定任何这些值并且总是返回"默认"值)。

我现在的问题是:这两个值之间究竟有什么区别?在哪些条件下这些值不同(某些代码示例会非常有用)?并且可能发生llvm ScalarEvolution通过无法计算tripcount但可以确定tripmultiple?如果是这样,一些代码会非常有用,因为我目前无法想象这样的情况。

0 个答案:

没有答案