X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fcfgloop.h;h=9df217eb509c84eeb7aa43e6e61d54193d363e71;hb=7c1ab928ec2df070c5c9a55efe0c276a5e1aa004;hp=8a24c15f27160cd885514c9483470c82db9aacff;hpb=9c1ccc0f89cb2abebfb3b43ec4bb12b3b54a2b00;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/cfgloop.h b/gcc/cfgloop.h index 8a24c15f271..9df217eb509 100644 --- a/gcc/cfgloop.h +++ b/gcc/cfgloop.h @@ -19,6 +19,13 @@ along with GCC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#ifndef GCC_CFGLOOP_H +#define GCC_CFGLOOP_H + +#include "basic-block.h" +/* For rtx_code. */ +#include "rtl.h" + /* Structure to hold decision about unrolling/peeling. */ enum lpt_dec { @@ -36,6 +43,20 @@ struct lpt_decision unsigned times; }; +/* The structure describing a bound on number of iterations of a loop. */ + +struct nb_iter_bound +{ + tree bound; /* The expression whose value is an upper bound on the + number of executions of anything after ... */ + tree at_stmt; /* ... this statement during one execution of loop. */ + tree additional; /* A conjunction of conditions the operands of BOUND + satisfy. The additional information about the value + of the bound may be derived from it. */ + struct nb_iter_bound *next; + /* The next bound in a list. */ +}; + /* Structure to hold information for each natural loop. */ struct loop { @@ -76,9 +97,6 @@ struct loop the loop latch. */ basic_block last; - /* Bitmap of blocks contained within the loop. */ - sbitmap nodes; - /* Number of blocks contained within the loop. */ unsigned num_nodes; @@ -126,17 +144,7 @@ struct loop void *aux; /* The following are currently used by loop.c but they are likely to - disappear as loop.c is converted to use the CFG. */ - - /* Nonzero if the loop has a NOTE_INSN_LOOP_VTOP. */ - rtx vtop; - - /* Nonzero if the loop has a NOTE_INSN_LOOP_CONT. - A continue statement will generate a branch to NEXT_INSN (cont). */ - rtx cont; - - /* The dominator of cont. */ - rtx cont_dominator; + disappear when loop.c is replaced and removed. */ /* The NOTE_INSN_LOOP_BEG. */ rtx start; @@ -168,6 +176,30 @@ struct loop /* The number of LABEL_REFs on exit_labels for this loop and all loops nested inside it. */ int exit_count; + + /* The probable number of times the loop is executed at runtime. + This is an INTEGER_CST or an expression containing symbolic + names. Don't access this field directly: + number_of_iterations_in_loop computes and caches the computed + information in this field. */ + tree nb_iterations; + + /* An INTEGER_CST estimation of the number of iterations. NULL_TREE + if there is no estimation. */ + tree estimated_nb_iterations; + + /* Upper bound on number of iterations of a loop. */ + struct nb_iter_bound *bounds; + + /* If not NULL, loop has just single exit edge stored here (edges to the + EXIT_BLOCK_PTR do not count. */ + edge single_exit; + + /* True when the loop does not carry data dependences, and + consequently the iterations can be executed in any order. False + when the loop carries data dependences, or when the property is + not decidable. */ + bool parallel_p; }; /* Flags for state of loop structure. */ @@ -175,7 +207,8 @@ enum { LOOPS_HAVE_PREHEADERS = 1, LOOPS_HAVE_SIMPLE_LATCHES = 2, - LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS = 4 + LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS = 4, + LOOPS_HAVE_MARKED_SINGLE_EXITS = 8 }; /* Structure to hold CFG information about natural loops within a function. */ @@ -217,6 +250,10 @@ struct loops int state; }; +/* The loop tree currently optimized. */ + +extern struct loops *current_loops; + /* Flags for loop discovery. */ #define LOOP_TREE 1 /* Build loop hierarchy tree. */ @@ -228,7 +265,6 @@ struct loops /* Loop recognition. */ extern int flow_loops_find (struct loops *, int flags); -extern int flow_loops_update (struct loops *, int flags); extern void flow_loops_free (struct loops *); extern void flow_loops_dump (const struct loops *, FILE *, void (*)(const struct loop *, FILE *, int), int); @@ -237,6 +273,8 @@ extern void flow_loop_dump (const struct loop *, FILE *, extern int flow_loop_scan (struct loop *, int); extern void flow_loop_free (struct loop *); void mark_irreducible_loops (struct loops *); +void mark_single_exit_loops (struct loops *); +extern void create_loop_notes (void); /* Loop data structure manipulation/querying. */ extern void flow_loop_tree_node_add (struct loop *, struct loop *); @@ -245,12 +283,16 @@ extern bool flow_loop_outside_edge_p (const struct loop *, edge); extern bool flow_loop_nested_p (const struct loop *, const struct loop *); extern bool flow_bb_inside_loop_p (const struct loop *, const basic_block); extern struct loop * find_common_loop (struct loop *, struct loop *); +struct loop *superloop_at_depth (struct loop *, unsigned); +extern unsigned tree_num_loop_insns (struct loop *); extern int num_loop_insns (struct loop *); extern int average_num_loop_insns (struct loop *); +extern unsigned get_loop_level (const struct loop *); /* Loops & cfg manipulation. */ extern basic_block *get_loop_body (const struct loop *); extern basic_block *get_loop_body_in_dom_order (const struct loop *); +extern basic_block *get_loop_body_in_bfs_order (const struct loop *); extern edge *get_loop_exit_edges (const struct loop *, unsigned *); extern unsigned num_loop_branches (const struct loop *); @@ -286,13 +328,15 @@ extern bool can_duplicate_loop_p (struct loop *loop); #define DLTHE_FLAG_UPDATE_FREQ 1 /* Update frequencies in duplicate_loop_to_header_edge. */ +extern struct loop * duplicate_loop (struct loops *, struct loop *, + struct loop *); extern int duplicate_loop_to_header_edge (struct loop *, edge, struct loops *, unsigned, sbitmap, edge, edge *, unsigned *, int); -extern struct loop *loopify (struct loops *, edge, edge, basic_block); -extern void unloop (struct loops *, struct loop *); +extern struct loop *loopify (struct loops *, edge, edge, + basic_block, edge, edge, bool); extern bool remove_path (struct loops *, edge); -extern edge split_loop_bb (basic_block, rtx); +extern edge split_loop_bb (basic_block, void *); /* Induction variable analysis. */ @@ -306,7 +350,7 @@ extern edge split_loop_bb (basic_block, rtx); If first_special is true, the value in the first iteration is delta + mult * base - If extend = NIL, first_special must be false, delta 0, mult 1 and value is + If extend = UNKNOWN, first_special must be false, delta 0, mult 1 and value is subreg_{mode} (base + i * step) The get_iv_value function can be used to obtain these expressions. @@ -321,7 +365,7 @@ struct rtx_iv see the description above). */ rtx base, step; - /* The type of extend applied to it (SIGN_EXTEND, ZERO_EXTEND or NIL). */ + /* The type of extend applied to it (SIGN_EXTEND, ZERO_EXTEND or UNKNOWN). */ enum rtx_code extend; /* Operations applied in the extended mode. */ @@ -388,9 +432,8 @@ extern void iv_analysis_loop_init (struct loop *); extern rtx iv_get_reaching_def (rtx, rtx); extern bool iv_analyze (rtx, rtx, struct rtx_iv *); extern rtx get_iv_value (struct rtx_iv *, rtx); +extern bool biv_p (rtx, rtx); extern void find_simple_exit (struct loop *, struct niter_desc *); -extern void iv_number_of_iterations (struct loop *, rtx, rtx, - struct niter_desc *); extern void iv_analysis_done (void); extern struct niter_desc *get_simple_loop_desc (struct loop *loop); @@ -402,6 +445,22 @@ simple_loop_desc (struct loop *loop) return loop->aux; } +/* The properties of the target. */ + +extern unsigned target_avail_regs; /* Number of available registers. */ +extern unsigned target_res_regs; /* Number of reserved registers. */ +extern unsigned target_small_cost; /* The cost for register when there + is a free one. */ +extern unsigned target_pres_cost; /* The cost for register when there are + not too many free ones. */ +extern unsigned target_spill_cost; /* The cost for register when we need + to spill. */ + +/* Register pressure estimation for induction variable optimizations & loop + invariant motion. */ +extern unsigned global_cost_for_size (unsigned, unsigned, unsigned); +extern void init_set_costs (void); + /* Loop optimizer initialization. */ extern struct loops *loop_optimizer_init (FILE *); extern void loop_optimizer_finalize (struct loops *, FILE *); @@ -417,3 +476,15 @@ enum }; extern void unroll_and_peel_loops (struct loops *, int); +extern void doloop_optimize_loops (struct loops *); +extern void move_loop_invariants (struct loops *); +extern void record_estimate (struct loop *, tree, tree, tree); + +/* Old loop optimizer interface. */ + +/* Flags passed to loop_optimize. */ +#define LOOP_PREFETCH 1 + +extern void loop_optimize (rtx, FILE *, int); + +#endif /* GCC_CFGLOOP_H */