我想找到用于检查循环终止的变量,
例如,在下面的循环中,我应该得到“%n”:
for.body8: ; preds = %for.body8.preheader,for.body8
%i.116 = phi i32 [ %inc12, %for.body8 ], [ 0, %for.body8.preheader ]
%inc12 = add nsw i32 %i.116, 1
.....
%6 = load i32* %n, align 4, !tbaa !0
% cmp7 = icmp slt i32 %inc12, %6
br i1 %cmp7, label %for.body8, label %for.end13.loopexit
有没有直接的方法来获得这个价值?
我可以做的一种方法是,迭代指令并检查icmp指令。但我不认为它是一种正确的方法。
请建议我一个方法
提前谢谢。
答案 0 :(得分:1)
虽然没有办法对一般循环执行此操作,但在某些情况下可以找到它。在LLVM中有一个名为'-indvars:Canonicalize Induction Variables'的传递,被描述为
该转换分析并转换诱导变量 (以及从它们派生的计算)为适合的简单形式 随后的分析和转型。
此转换使用a对每个循环进行以下更改 可识别的诱导变量:
- 将所有循环转换为具有单个规范归纳变量,该变量从零开始并逐步进行。
- 规范归纳变量保证是循环头块中的第一个PHI节点。
- 引发任何指针算术重复以使用数组下标。
醇>如果一个循环的行程计数是可计算的,那么这个过程也会产生 以下更改:
循环的退出条件是规范化的,以将归纳值与退出值进行比较。这会变成如下循环:
for (i = 7; i*i < 1000; ++i)
到
for (i = 0; i != 25; ++i)
- 醇>
在从indvar派生的表达式的循环之外的任何使用都被更改为计算循环外的派生值, 消除对导入装置退出值的依赖 变量。如果循环的唯一目的是计算退出值 一些派生表达式,这个转换将成为循环 死。
这种转变毕竟应该是强度降低 已经进行了所需的循环变换。另外, 在有利可图的目标上,循环可以转换为 倒数到零(“do loop”优化)。
听起来就像你需要的那样。
答案 1 :(得分:0)
不幸的是,没有一般解决方案。您的问题是暂停问题的一个实例,证明没有通用解决方案:http://en.wikipedia.org/wiki/Halting_problem
如果你能够将问题空间缩小到极其简单的东西,使用一些非完整的操作子集(http://en.wikipedia.org/wiki/Turing-complete),你可能会能够想出一个解决方案。但是没有一般的解决方案。