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
可以用来执行这些计算。