Next: Dependency analysis, Previous: loop-iv, Up: Loop Analysis and Representation
在GIMPLE和RTL之上,都有函数可以用来判定循环的迭代次数,并且具有相似的接口。在GCC中,循环的迭代次数被定义为循环latch的执行次数。许多情况下,是不可能无条件的判定出迭代次数——判定的迭代次数只有在满足一些假设时才正确。分析尝试使用包含在程序中的信息来检验这些条件;如果失败了,则条件和结果一起被返回。下面的信息和条件由分析提供:
assumptions
:
如果条件为假,则其余的信息无效。
noloop_assumptions
, GIMPLE上的may_be_zero
:
如果该条件为真,则循环在第一次迭代中便退出。
infinite
:
If this condition is true, the loop is infinite.
This condition is only available on RTL. On GIMPLE, conditions for
finiteness of the loop are included in assumptions
.
niter_expr
, GIMPLE上的niter
:
该表达式给出迭代次数。迭代次数被定义为循环latch的执行次数。
在GIMPLE和RTL之上,都需要初始化归约变量分析框架(GIMPLE上为SCEV,RTL上为loop-iv)。在GIMPLE上,结果存储在struct tree_niter_desc
中。可以通过number_of_iterations_exit
函数来判定循环在通过给定出口退出之前的迭代次数。在RTL上,结果返回在struct niter_desc
结构体中,相应的函数名为check_simple_exit
。还有一些函数遍历循环的所有出口,并尝试找到容易判定迭代次数的一个——它们是GIMPLE上的find_loop_niter
和RTL上的find_simple_exit
。最后,还有一些函数提供相同的信息,只不过还额外的对其进行缓存,使得反复调用迭代次数的代价不会很高——它们是GIMPLE上的number_of_latch_executions
和RTL上的get_simple_loop_desc
。
注意这些函数中的一些可能与其它的在行为上有些不同——有些只返回迭代次数的表达式。函数number_of_latch_executions
只工作于单个出口的循环。函数number_of_cond_exit_executions
能被用来判定一个单出口循环在退出条件下的执行次数。(即,number_of_latch_executions
加1)。