OSDN Git Service

* pa-host.c (MAP_FAILED): Define if not defined.
[pf3gnuchains/gcc-fork.git] / gcc / cfgloop.h
index 60c80ce..9df217e 100644 (file)
@@ -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 */