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)。