X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fcfgloop.h;h=9df217eb509c84eeb7aa43e6e61d54193d363e71;hb=7c1ab928ec2df070c5c9a55efe0c276a5e1aa004;hp=60c80ceaa3fd842768509738b6e9cab67ee4d632;hpb=07c03fb07980462ea57c04544fc4e575dc72deb8;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/cfgloop.h b/gcc/cfgloop.h index 60c80ceaa3f..9df217eb509 100644 --- a/gcc/cfgloop.h +++ b/gcc/cfgloop.h @@ -43,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 { @@ -83,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; @@ -133,7 +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. */ + disappear when loop.c is replaced and removed. */ /* The NOTE_INSN_LOOP_BEG. */ rtx start; @@ -173,12 +184,22 @@ struct loop 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. */ @@ -244,7 +265,6 @@ extern struct loops *current_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); @@ -308,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. */ @@ -410,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); @@ -424,6 +445,17 @@ 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); @@ -446,5 +478,13 @@ 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 */