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. */
/* Number of natural loops in the function. */
unsigned num;
- /* Maximum nested loop level in the function. */
- unsigned levels;
-
/* Array of natural loop descriptors (scanning this array in reverse order
will find the inner loops before their enclosing outer loops). */
struct loop *array;
/* The above array is unused in new loop infrastructure and is kept only for
purposes of the old loop optimizer. Instead we store just pointers to
- loops here. */
+ loops here.
+ Note that a loop in this array may actually be NULL, if the loop
+ has been removed and the entire loops structure has not been
+ recomputed since that time. */
struct loop **parray;
/* Pointer to root of loop hierarchy tree. */
/* 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);
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 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);
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. */