Next: Loop manipulation, Previous: Loop representation, Up: Loop Analysis and Representation
查询循环信息的函数声明在cfgloop.h中。一些信息可以直接从结构体中获得。每个基本块的loop_father
域都包含了它所属的最内层的循环。最有用的(总是保持更新的)循环结构有:
header
, latch
: 循环的Header和latch基本块。
num_nodes
: 循环中的基本块数目(包括子循环的基本块)。
depth
: 该循环在循环树中的深度,也就是,外层循环的数目。
outer
, inner
, next
: 外部循环,第一个子循环,以及循环树中的下一个循环。
在循环结构体中还有其它一些域,它们有许多是只被一些过程使用,或者在改变CFG时并没有被更新;总之,它们应该不要去直接访问。
用来查询循环结构体的最重要的函数有:
flow_loops_dump
: 将循环的信息转储到文件中。
verify_loop_structure
: 检查循环结构体的一致性。
loop_latch_edge
: 返回循环的latch边。
loop_preheader_edge
:
如果循环有preheaders, 则返回循环的preheader边。
flow_loop_nested_p
: 测试循环是否为另一个循环的子循环。
flow_bb_inside_loop_p
:
测试基本块是否属于一个循环(包括它的子循环)。
find_common_loop
: 找到两个循环的公共外循环。
superloop_at_depth
: 返回给定深度的外循环。
tree_num_loop_insns
, num_loop_insns
:
分别在GIMPLE和RTL之上,评估循环中的insn数目。
loop_exit_edge_p
: 测试是否为循环的出口边。
mark_loop_exit_edges
:
使用EDGE_LOOP_EXIT
来标记所有循环的出口边。
get_loop_body
, get_loop_body_in_dom_order
,
get_loop_body_in_bfs_order
:
分别为,在反向的CFG中使用深度优先顺序,dominance顺序,以及宽度优先顺序,来列举基本块。
single_exit
:
或者返回循环的单一出口边,或者当循环具有多个出口时返回NULL
。只有在使用了LOOPS_HAVE_MARKED_SINGLE_EXITS属性时,才能使用这个函数。
get_loop_exit_edges
: 列举循环的出口边。
just_once_each_iteration_p
:
如果基本块在循环的每次迭代中都只被执行一次,返回true(也就是,其不属于一个子循环,并且dominate循环的latch)。