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
{
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;
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;
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. */
/* 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);
#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. */
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);
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 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 */