Next: , Previous: loop-iv, Up: Loop Analysis and Representation


14.7 迭代次数分析

在GIMPLE和RTL之上,都有函数可以用来判定循环的迭代次数,并且具有相似的接口。在GCC中,循环的迭代次数被定义为循环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)。