This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Natural loop detection
- To: law at cygnus dot com
- Subject: Re: Natural loop detection
- From: Michael Hayes <m dot hayes at elec dot canterbury dot ac dot nz>
- Date: Tue, 30 Nov 1999 16:43:28 +1300 (NZDT)
- Cc: Michael Hayes <m dot hayes at elec dot canterbury dot ac dot nz>, gcc-patches at gcc dot gnu dot org,rth at cygnus dot com, scox at cygnus dot com
- References: <"14402.16789.656976.358282"@ongaonga.elec.canterbury.ac.nz><24376.943870157@upchuck>
Jeffrey A Law writes:
> You could use a bitmap for each loop where each bit corresponds
> to a particular edge. I'd suggest using bitmaps instead of sbitmaps given
> that this information is likely to be very sparse or you could build chains
> with an EXPR_LIST or something like that.
I ended up opting for an array of edges. I would have liked a linked
list of edges but this didn't seem to be worth the memory allocation
overhead. Using EXPR_LIST for non-rtx data seemed grubby.
I have also rth-ified the code to use basic blocks pointers rather
than indexes. It doesn't really save any indirection during the loop
hunting phase but may be more useful when using the gathered loop
data.
Here's the modified patch, incorporating your suggestions.
1999-11-30 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
* flow.c (flow_nodes_print, flow_loops_cfg_dump, flow_loop_nested_p,
flow_loops_dump, flow_loops_free, flow_loop_exits_find,
flow_loop_nodes_find, flow_depth_first_order_compute,
flow_loop_pre_header_find, flow_loop_tree_node_add,
flow_loops_tree_build, flow_loop_level_compute,
flow_loops_level_compute, flow_loops_find,
flow_loop_outside_edge_p): New functions to find natural
loops in the CFG and to build loop heirachy tree.
* basic-block.h (flow_loops_find, flow_loops_free, flow_loop_dump):
Added protoypes.
(struct loops, struct loop): Define.
* sbitmap.c (sbitmap_a_subset_b_p): New function.
* sbitmap.h (sbitmap_a_subset_b_p): Added prototype.
* bitmap.h
begin 644 natural-loop2.patch.gz
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
=X%<@:'R7!X#17K\#6&BYG80";_\O>216<IYE````
`
end