Next: LCSSA, Previous: Loop querying, Up: Loop Analysis and Representation
flow_loop_tree_node_add
: 向树中增加一个节点。
flow_loop_tree_node_remove
: 从树中移除一个节点。
add_bb_to_loop
: 向循环增加一个基本块。
remove_bb_from_loops
: 从循环中移除一个基本块。
大多数低级别的CFG函数会自动更新循环。下列函数用来处理一些比较复杂的CFG操作情况:
remove_path
: 移除一个边,以及它支配的所有块。
split_loop_exit_edge
:
拆分循环的出口边,以确保PHI节点参数保留在循环中(确保使用了循环封闭SSA形式)。只用于GIMPLE。
最后,有一些高层的循环转换被实现。虽然其中一些能够工作于非最内层循环,但是大多数并没有对这种情况进行过测试,目前,它们只对最内层循环可靠:
create_iv
:
创建一个新的归约变量。只工作在GIMPLE上。
standard_iv_increment_position
能够被用来为iv增量找到合适的位置。
duplicate_loop_to_header_edge
,
tree_duplicate_loop_to_header_edge
:
这些函数(在RTL和GIMPLE之上)在进入循环头的边上对循环体复制规定的次数,
从而执行了循环展开或loop peeling。对于复制的循环,
can_duplicate_loop_p
(GIMPLE之上为can_unroll_loop_p
)必须为真。
loop_version
, tree_ssa_loop_version
:
这些函数创建一个循环的复本,以及在它们之前的一个分支跳转,
从而可以根据规定的条件来选择它们。这对需要在运行时检验一些假设的优化很有帮助
(循环的一个复本通常不做变换,而另一个通过某种方式进行转换)。
tree_unroll_loop
:
展开循环,包括剥离额外的迭代,从而使得迭代次数可以由展开因子划分,
更新出口条件,以及移除不会经过的出口。只在GIMPLE上工作。