我目前正在使用llvm并且我专注于循环:因为我想展开循环,我发现llvm已经提供了一个展开循环的函数。该函数需要以下参数:
count
(展开后循环体存在的次数)tripcount
,它确定循环执行的次数(在展开之前)。或者确切地说(取自getSmallConstantTripCount
类中ScalarEvolution
函数的文档):
[...]它是控制在进入分支之前可以达到ExitingBlock的次数。对于具有多个出口的循环,如果循环通过另一个分支过早退出,则它可能不是循环头执行的次数
tripmultiple
- 根据getSmallConstantTripMultiple
类中ScalarEvolution
函数的文档 - 是
[...]此循环的行程计数的最大常数除数[...]
可以使用已经提到的函数从tripcount
类获取tripmultiple
和ScalarEvolution
值。我的传递当前使用这些值但是当我开始测试几个循环的传递时,似乎两个值总是相等的(当我开始使用break
来创建CFG中的早期退出时,llvm无法确定任何这些值并且总是返回"默认"值)。
我现在的问题是:这两个值之间究竟有什么区别?在哪些条件下这些值不同(某些代码示例会非常有用)?并且可能发生llvm ScalarEvolution
通过无法计算tripcount但可以确定tripmultiple?如果是这样,一些代码会非常有用,因为我目前无法想象这样的情况。