Next: Number of iterations, Previous: Scalar evolutions, Up: Loop Analysis and Representation
RTL之上的归约变量很简单,并且只允许一次在一个循环中,仿射归约变量的分析。接口在cfgloop.h中声明。在循环L中分析归约变量之前,必须在L上调用iv_analysis_loop_init函数。分析完成之后(可能会为多个循环调用iv_analysis_loop_init),应该调用iv_analysis_done。下面的函数能够被用来访问分析结果:
iv_analyze:
分析在给定insn中的单个寄存器。如果在该insn中没有使用寄存器,则扫描下一个insn,因此该函数能够在通过get_condition返回的insn上被调用。
iv_analyze_result:
分析给定insn的赋值结果。
iv_analyze_expr:
分析一个更加复杂的表达式。其所有操作数都通过iv_analyze来分析,因此它们必须用在特定insn中,或者后面insn的其中之一。
归约变量的描述在struct rtx_iv中。为了处理子寄存器,该表示有些复杂;如果extend域的值不是UNKNOWN,则归约变量在第i次迭代时的值为
delta + mult * extend_{extend_mode} (subreg_{mode} (base + i * step)),
不过下面的情况例外:如果first_special为真,则在首次迭代时(当i为0时),值为delta + mult * base。然而,如果extend等于UNKNOWN,则first_special必须为假,delta为0,mult为1,并且在第i次迭代时的值为
subreg_{mode} (base + i * step)
函数get_iv_value可以用来执行这些计算。