Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Llvm 查找循环终止条件变量_Llvm - Fatal编程技术网

Llvm 查找循环终止条件变量

Llvm 查找循环终止条件变量,llvm,Llvm,我想找到用于检查循环终止的变量, 例如,在下面的循环中,我应该得到“%n”: 有没有直接的方法可以得到这个值? 我可以做的一个方法是,迭代指令并检查icmp指令。但我认为这不是一个合适的方法。 请给我推荐一种方法。 提前感谢。不幸的是,没有通用的解决方案。您的问题是停顿问题的一个实例,经证明没有通用解决方案: 如果你能把问题空间缩减到非常简单的地方,使用一个不是图灵完全的操作子集(http://en.wikipedia.org/wiki/Turing-complete),您可能会想出一个解决方案

我想找到用于检查循环终止的变量,
例如,在下面的循环中,我应该得到“%n”:

有没有直接的方法可以得到这个值?
我可以做的一个方法是,迭代指令并检查icmp指令。但我认为这不是一个合适的方法。
请给我推荐一种方法。

提前感谢。

不幸的是,没有通用的解决方案。您的问题是停顿问题的一个实例,经证明没有通用解决方案:


如果你能把问题空间缩减到非常简单的地方,使用一个不是图灵完全的操作子集(http://en.wikipedia.org/wiki/Turing-complete),您可能会想出一个解决方案。但是没有通用的解决方案。

不幸的是,没有通用的解决方案。您的问题是停顿问题的一个实例,经证明没有通用解决方案:


如果你能把问题空间缩减到非常简单的地方,使用一个不是图灵完全的操作子集(http://en.wikipedia.org/wiki/Turing-complete),您可能会想出一个解决方案。但是没有通用的解决方案。

虽然对于通用循环没有办法做到这一点,但在某些情况下可以找到这一点。在LLVM中有一个名为'-indvars:Canonicalize inclusion Variables'的过程,它被描述为

此转换分析和转换归纳变量 (以及由此导出的计算)转换为更简单的形式,适用于 随后的分析和转换

此转换使用 可识别归纳变量:

  • 所有循环都转换为一个标准归纳变量,该变量从零开始,步数为1
  • 规范归纳变量保证是循环头块中的第一个PHI节点
  • 任何指针算术循环都会被引发以使用数组下标
  • 如果回路的跳闸计数是可计算的,则此过程也会使 以下更改:

  • 循环的退出条件被规范化,以比较归纳值和退出值。这会使循环像:

    for (i = 7; i*i < 1000; ++i)
    
  • 从indvar派生的表达式在循环外的任何使用都将更改为在循环外计算派生值, 消除对感应电机出口值的依赖 变量如果循环的唯一目的是计算退出值 对于某些派生表达式,此转换将使循环 死了

  • 毕竟,这种转变之后应该是强度降低 已经执行了所需的循环转换。另外,, 在有利可图的目标上,循环可以转化为 倒计时到零(“do循环”优化)


    听起来它正是您所需要的。

    虽然对于一般循环没有办法做到这一点,但在某些情况下可能会发现这一点。在LLVM中有一个名为'-indvars:Canonicalize inclusion Variables'的过程,它被描述为

    此转换分析和转换归纳变量 (以及由此导出的计算)转换为更简单的形式,适用于 随后的分析和转换

    此转换使用 可识别归纳变量:

  • 所有循环都转换为一个标准归纳变量,该变量从零开始,步数为1
  • 规范归纳变量保证是循环头块中的第一个PHI节点
  • 任何指针算术循环都会被引发以使用数组下标
  • 如果回路的跳闸计数是可计算的,则此过程也会使 以下更改:

  • 循环的退出条件被规范化,以比较归纳值和退出值。这会使循环像:

    for (i = 7; i*i < 1000; ++i)
    
  • 从indvar派生的表达式在循环外的任何使用都将更改为在循环外计算派生值, 消除对感应电机出口值的依赖 变量如果循环的唯一目的是计算退出值 对于某些派生表达式,此转换将使循环 死了

  • 毕竟,这种转变之后应该是强度降低 已经执行了所需的循环转换。另外,, 在有利可图的目标上,循环可以转化为 倒计时到零(“do循环”优化)

    听起来它正是你所需要的

    for (i = 0; i != 25; ++i)