Home | History | Annotate | Download | only in include
      1 /* Natural loop functions
      2    Copyright (C) 1987, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
      3    2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
      4 
      5 This file is part of GCC.
      6 
      7 GCC is free software; you can redistribute it and/or modify it under
      8 the terms of the GNU General Public License as published by the Free
      9 Software Foundation; either version 3, or (at your option) any later
     10 version.
     11 
     12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     15 for more details.
     16 
     17 You should have received a copy of the GNU General Public License
     18 along with GCC; see the file COPYING3.  If not see
     19 <http://www.gnu.org/licenses/>.  */
     20 
     21 #ifndef GCC_CFGLOOP_H
     22 #define GCC_CFGLOOP_H
     23 
     24 #include "basic-block.h"
     25 /* For rtx_code.  */
     26 #include "rtl.h"
     27 #include "vecprim.h"
     28 #include "double-int.h"
     29 
     30 /* Structure to hold decision about unrolling/peeling.  */
     31 enum lpt_dec
     32 {
     33   LPT_NONE,
     34   LPT_PEEL_COMPLETELY,
     35   LPT_PEEL_SIMPLE,
     36   LPT_UNROLL_CONSTANT,
     37   LPT_UNROLL_RUNTIME,
     38   LPT_UNROLL_STUPID
     39 };
     40 
     41 struct lpt_decision GTY (())
     42 {
     43   enum lpt_dec decision;
     44   unsigned times;
     45 };
     46 
     47 /* The structure describing a bound on number of iterations of a loop.  */
     48 
     49 struct nb_iter_bound GTY ((chain_next ("%h.next")))
     50 {
     51   /* The statement STMT is executed at most ...  */
     52   gimple stmt;
     53 
     54   /* ... BOUND + 1 times (BOUND must be an unsigned constant).
     55      The + 1 is added for the following reasons:
     56 
     57      a) 0 would otherwise be unused, while we would need to care more about
     58         overflows (as MAX + 1 is sometimes produced as the estimate on number
     59 	of executions of STMT).
     60      b) it is consistent with the result of number_of_iterations_exit.  */
     61   double_int bound;
     62 
     63   /* True if the statement will cause the loop to be leaved the (at most)
     64      BOUND + 1-st time it is executed, that is, all the statements after it
     65      are executed at most BOUND times.  */
     66   bool is_exit;
     67 
     68   /* The next bound in the list.  */
     69   struct nb_iter_bound *next;
     70 };
     71 
     72 /* Description of the loop exit.  */
     73 
     74 struct loop_exit GTY (())
     75 {
     76   /* The exit edge.  */
     77   struct edge_def *e;
     78 
     79   /* Previous and next exit in the list of the exits of the loop.  */
     80   struct loop_exit *prev;
     81   struct loop_exit *next;
     82 
     83   /* Next element in the list of loops from that E exits.  */
     84   struct loop_exit *next_e;
     85 };
     86 
     87 typedef struct loop *loop_p;
     88 DEF_VEC_P (loop_p);
     89 DEF_VEC_ALLOC_P (loop_p, heap);
     90 DEF_VEC_ALLOC_P (loop_p, gc);
     91 
     92 /* An integer estimation of the number of iterations.  Estimate_state
     93    describes what is the state of the estimation.  */
     94 enum loop_estimation
     95 {
     96   /* Estimate was not computed yet.  */
     97   EST_NOT_COMPUTED,
     98   /* Estimate is ready.  */
     99   EST_AVAILABLE
    100 };
    101 
    102 /* Structure to hold information for each natural loop.  */
    103 struct loop GTY ((chain_next ("%h.next")))
    104 {
    105   /* Index into loops array.  */
    106   int num;
    107 
    108   /* Number of loop insns.  */
    109   unsigned ninsns;
    110 
    111   /* Basic block of loop header.  */
    112   struct basic_block_def *header;
    113 
    114   /* Basic block of loop latch.  */
    115   struct basic_block_def *latch;
    116 
    117   /* For loop unrolling/peeling decision.  */
    118   struct lpt_decision lpt_decision;
    119 
    120   /* Average number of executed insns per iteration.  */
    121   unsigned av_ninsns;
    122 
    123   /* Number of blocks contained within the loop.  */
    124   unsigned num_nodes;
    125 
    126   /* Superloops of the loop, starting with the outermost loop.  */
    127   VEC (loop_p, gc) *superloops;
    128 
    129   /* The first inner (child) loop or NULL if innermost loop.  */
    130   struct loop *inner;
    131 
    132   /* Link to the next (sibling) loop.  */
    133   struct loop *next;
    134 
    135   /* Auxiliary info specific to a pass.  */
    136   PTR GTY ((skip (""))) aux;
    137 
    138   /* The number of times the latch of the loop is executed.
    139      This is an INTEGER_CST or an expression containing symbolic
    140      names.  Don't access this field directly:
    141      number_of_latch_executions computes and caches the computed
    142      information in this field.  */
    143   tree nb_iterations;
    144 
    145   /* An integer guaranteed to bound the number of iterations of the loop
    146      from above.  */
    147   double_int nb_iterations_upper_bound;
    148 
    149   /* An integer giving the expected number of iterations of the loop.  */
    150   double_int nb_iterations_estimate;
    151 
    152   bool any_upper_bound;
    153   bool any_estimate;
    154 
    155   /* An integer estimation of the number of iterations.  Estimate_state
    156      describes what is the state of the estimation.  */
    157   enum loop_estimation estimate_state;
    158 
    159   /* Upper bound on number of iterations of a loop.  */
    160   struct nb_iter_bound *bounds;
    161 
    162   /* Head of the cyclic list of the exits of the loop.  */
    163   struct loop_exit *exits;
    164 };
    165 
    166 /* Flags for state of loop structure.  */
    167 enum
    168 {
    169   LOOPS_HAVE_PREHEADERS = 1,
    170   LOOPS_HAVE_SIMPLE_LATCHES = 2,
    171   LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS = 4,
    172   LOOPS_HAVE_RECORDED_EXITS = 8,
    173   LOOPS_MAY_HAVE_MULTIPLE_LATCHES = 16,
    174   LOOP_CLOSED_SSA = 32,
    175   LOOPS_NEED_FIXUP = 64,
    176   LOOPS_HAVE_FALLTHRU_PREHEADERS = 128
    177 };
    178 
    179 #define LOOPS_NORMAL (LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_SIMPLE_LATCHES \
    180 		      | LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
    181 #define AVOID_CFG_MODIFICATIONS (LOOPS_MAY_HAVE_MULTIPLE_LATCHES)
    182 
    183 /* Structure to hold CFG information about natural loops within a function.  */
    184 struct loops GTY (())
    185 {
    186   /* State of loops.  */
    187   int state;
    188 
    189   /* Array of the loops.  */
    190   VEC (loop_p, gc) *larray;
    191 
    192   /* Maps edges to the list of their descriptions as loop exits.  Edges
    193      whose sources or destinations have loop_father == NULL (which may
    194      happen during the cfg manipulations) should not appear in EXITS.  */
    195   htab_t GTY((param_is (struct loop_exit))) exits;
    196 
    197   /* Pointer to root of loop hierarchy tree.  */
    198   struct loop *tree_root;
    199 };
    200 
    201 /* Loop recognition.  */
    202 extern int flow_loops_find (struct loops *);
    203 extern void disambiguate_loops_with_multiple_latches (void);
    204 extern void flow_loops_free (struct loops *);
    205 extern void flow_loops_dump (FILE *,
    206 			     void (*)(const struct loop *, FILE *, int), int);
    207 extern void flow_loop_dump (const struct loop *, FILE *,
    208 			    void (*)(const struct loop *, FILE *, int), int);
    209 struct loop *alloc_loop (void);
    210 extern void flow_loop_free (struct loop *);
    211 int flow_loop_nodes_find (basic_block, struct loop *);
    212 void fix_loop_structure (bitmap changed_bbs);
    213 void mark_irreducible_loops (void);
    214 void release_recorded_exits (void);
    215 void record_loop_exits (void);
    216 void rescan_loop_exit (edge, bool, bool);
    217 
    218 /* Loop data structure manipulation/querying.  */
    219 extern void flow_loop_tree_node_add (struct loop *, struct loop *);
    220 extern void flow_loop_tree_node_remove (struct loop *);
    221 extern void add_loop (struct loop *, struct loop *);
    222 extern bool flow_loop_nested_p	(const struct loop *, const struct loop *);
    223 extern bool flow_bb_inside_loop_p (const struct loop *, const_basic_block);
    224 extern struct loop * find_common_loop (struct loop *, struct loop *);
    225 struct loop *superloop_at_depth (struct loop *, unsigned);
    226 struct eni_weights_d;
    227 extern unsigned tree_num_loop_insns (struct loop *, struct eni_weights_d *);
    228 extern int num_loop_insns (const struct loop *);
    229 extern int average_num_loop_insns (const struct loop *);
    230 extern unsigned get_loop_level (const struct loop *);
    231 extern bool loop_exit_edge_p (const struct loop *, const_edge);
    232 extern bool is_loop_exit (struct loop *, basic_block);
    233 extern void mark_loop_exit_edges (void);
    234 
    235 /* Loops & cfg manipulation.  */
    236 extern basic_block *get_loop_body (const struct loop *);
    237 extern unsigned get_loop_body_with_size (const struct loop *, basic_block *,
    238 					 unsigned);
    239 extern basic_block *get_loop_body_in_dom_order (const struct loop *);
    240 extern basic_block *get_loop_body_in_bfs_order (const struct loop *);
    241 extern basic_block *get_loop_body_in_custom_order (const struct loop *,
    242 			       int (*) (const void *, const void *));
    243 
    244 extern VEC (edge, heap) *get_loop_exit_edges (const struct loop *);
    245 edge single_exit (const struct loop *);
    246 extern unsigned num_loop_branches (const struct loop *);
    247 
    248 extern edge loop_preheader_edge (const struct loop *);
    249 extern edge loop_latch_edge (const struct loop *);
    250 
    251 extern void add_bb_to_loop (basic_block, struct loop *);
    252 extern void remove_bb_from_loops (basic_block);
    253 
    254 extern void cancel_loop_tree (struct loop *);
    255 extern void delete_loop (struct loop *);
    256 
    257 enum
    258 {
    259   CP_SIMPLE_PREHEADERS = 1,
    260   CP_FALLTHRU_PREHEADERS = 2
    261 };
    262 
    263 basic_block create_preheader (struct loop *, int);
    264 extern void create_preheaders (int);
    265 extern void force_single_succ_latches (void);
    266 
    267 extern void verify_loop_structure (void);
    268 
    269 /* Loop analysis.  */
    270 extern bool just_once_each_iteration_p (const struct loop *, const_basic_block);
    271 gcov_type expected_loop_iterations_unbounded (const struct loop *);
    272 extern unsigned expected_loop_iterations (const struct loop *);
    273 extern rtx doloop_condition_get (rtx);
    274 
    275 void estimate_numbers_of_iterations_loop (struct loop *);
    276 HOST_WIDE_INT estimated_loop_iterations_int (struct loop *, bool);
    277 bool estimated_loop_iterations (struct loop *, bool, double_int *);
    278 
    279 /* Loop manipulation.  */
    280 extern bool can_duplicate_loop_p (const struct loop *loop);
    281 
    282 #define DLTHE_FLAG_UPDATE_FREQ	1	/* Update frequencies in
    283 					   duplicate_loop_to_header_edge.  */
    284 #define DLTHE_RECORD_COPY_NUMBER 2	/* Record copy number in the aux
    285 					   field of newly create BB.  */
    286 #define DLTHE_FLAG_COMPLETTE_PEEL 4	/* Update frequencies expecting
    287 					   a complete peeling.  */
    288 
    289 extern edge create_empty_if_region_on_edge (edge, tree);
    290 extern struct loop *create_empty_loop_on_edge (edge, tree, tree, tree, tree,
    291 					       tree *, struct loop *);
    292 extern struct loop * duplicate_loop (struct loop *, struct loop *);
    293 extern bool duplicate_loop_to_header_edge (struct loop *, edge,
    294 					   unsigned, sbitmap, edge,
    295  					   VEC (edge, heap) **, int);
    296 extern struct loop *loopify (edge, edge,
    297 			     basic_block, edge, edge, bool,
    298 			     unsigned, unsigned);
    299 struct loop * loop_version (struct loop *, void *,
    300 			    basic_block *, unsigned, unsigned, unsigned, bool);
    301 extern bool remove_path (edge);
    302 void scale_loop_frequencies (struct loop *, int, int);
    303 
    304 /* Induction variable analysis.  */
    305 
    306 /* The description of induction variable.  The things are a bit complicated
    307    due to need to handle subregs and extends.  The value of the object described
    308    by it can be obtained as follows (all computations are done in extend_mode):
    309 
    310    Value in i-th iteration is
    311      delta + mult * extend_{extend_mode} (subreg_{mode} (base + i * step)).
    312 
    313    If first_special is true, the value in the first iteration is
    314      delta + mult * base
    315 
    316    If extend = UNKNOWN, first_special must be false, delta 0, mult 1 and value is
    317      subreg_{mode} (base + i * step)
    318 
    319    The get_iv_value function can be used to obtain these expressions.
    320 
    321    ??? Add a third mode field that would specify the mode in that inner
    322    computation is done, which would enable it to be different from the
    323    outer one?  */
    324 
    325 struct rtx_iv
    326 {
    327   /* Its base and step (mode of base and step is supposed to be extend_mode,
    328      see the description above).  */
    329   rtx base, step;
    330 
    331   /* The type of extend applied to it (SIGN_EXTEND, ZERO_EXTEND or UNKNOWN).  */
    332   enum rtx_code extend;
    333 
    334   /* Operations applied in the extended mode.  */
    335   rtx delta, mult;
    336 
    337   /* The mode it is extended to.  */
    338   enum machine_mode extend_mode;
    339 
    340   /* The mode the variable iterates in.  */
    341   enum machine_mode mode;
    342 
    343   /* Whether the first iteration needs to be handled specially.  */
    344   unsigned first_special : 1;
    345 };
    346 
    347 /* The description of an exit from the loop and of the number of iterations
    348    till we take the exit.  */
    349 
    350 struct niter_desc
    351 {
    352   /* The edge out of the loop.  */
    353   edge out_edge;
    354 
    355   /* The other edge leading from the condition.  */
    356   edge in_edge;
    357 
    358   /* True if we are able to say anything about number of iterations of the
    359      loop.  */
    360   bool simple_p;
    361 
    362   /* True if the loop iterates the constant number of times.  */
    363   bool const_iter;
    364 
    365   /* Number of iterations if constant.  */
    366   unsigned HOST_WIDEST_INT niter;
    367 
    368   /* Upper bound on the number of iterations.  */
    369   unsigned HOST_WIDEST_INT niter_max;
    370 
    371   /* Assumptions under that the rest of the information is valid.  */
    372   rtx assumptions;
    373 
    374   /* Assumptions under that the loop ends before reaching the latch,
    375      even if value of niter_expr says otherwise.  */
    376   rtx noloop_assumptions;
    377 
    378   /* Condition under that the loop is infinite.  */
    379   rtx infinite;
    380 
    381   /* Whether the comparison is signed.  */
    382   bool signed_p;
    383 
    384   /* The mode in that niter_expr should be computed.  */
    385   enum machine_mode mode;
    386 
    387   /* The number of iterations of the loop.  */
    388   rtx niter_expr;
    389 };
    390 
    391 extern void iv_analysis_loop_init (struct loop *);
    392 extern bool iv_analyze (rtx, rtx, struct rtx_iv *);
    393 extern bool iv_analyze_result (rtx, rtx, struct rtx_iv *);
    394 extern bool iv_analyze_expr (rtx, rtx, enum machine_mode, struct rtx_iv *);
    395 extern rtx get_iv_value (struct rtx_iv *, rtx);
    396 extern bool biv_p (rtx, rtx);
    397 extern void find_simple_exit (struct loop *, struct niter_desc *);
    398 extern void iv_analysis_done (void);
    399 
    400 extern struct niter_desc *get_simple_loop_desc (struct loop *loop);
    401 extern void free_simple_loop_desc (struct loop *loop);
    402 
    403 static inline struct niter_desc *
    404 simple_loop_desc (struct loop *loop)
    405 {
    406   return (struct niter_desc *) loop->aux;
    407 }
    408 
    409 /* Accessors for the loop structures.  */
    410 
    411 /* Returns the loop with index NUM from current_loops.  */
    412 
    413 static inline struct loop *
    414 get_loop (unsigned num)
    415 {
    416   return VEC_index (loop_p, current_loops->larray, num);
    417 }
    418 
    419 /* Returns the number of superloops of LOOP.  */
    420 
    421 static inline unsigned
    422 loop_depth (const struct loop *loop)
    423 {
    424   return VEC_length (loop_p, loop->superloops);
    425 }
    426 
    427 /* Returns the immediate superloop of LOOP, or NULL if LOOP is the outermost
    428    loop.  */
    429 
    430 static inline struct loop *
    431 loop_outer (const struct loop *loop)
    432 {
    433   unsigned n = VEC_length (loop_p, loop->superloops);
    434 
    435   if (n == 0)
    436     return NULL;
    437 
    438   return VEC_index (loop_p, loop->superloops, n - 1);
    439 }
    440 
    441 /* Returns the list of loops in current_loops.  */
    442 
    443 static inline VEC (loop_p, gc) *
    444 get_loops (void)
    445 {
    446   if (!current_loops)
    447     return NULL;
    448 
    449   return current_loops->larray;
    450 }
    451 
    452 /* Returns the number of loops in current_loops (including the removed
    453    ones and the fake loop that forms the root of the loop tree).  */
    454 
    455 static inline unsigned
    456 number_of_loops (void)
    457 {
    458   if (!current_loops)
    459     return 0;
    460 
    461   return VEC_length (loop_p, current_loops->larray);
    462 }
    463 
    464 /* Returns true if state of the loops satisfies all properties
    465    described by FLAGS.  */
    466 
    467 static inline bool
    468 loops_state_satisfies_p (unsigned flags)
    469 {
    470   return (current_loops->state & flags) == flags;
    471 }
    472 
    473 /* Sets FLAGS to the loops state.  */
    474 
    475 static inline void
    476 loops_state_set (unsigned flags)
    477 {
    478   current_loops->state |= flags;
    479 }
    480 
    481 /* Clears FLAGS from the loops state.  */
    482 
    483 static inline void
    484 loops_state_clear (unsigned flags)
    485 {
    486   if (!current_loops)
    487     return;
    488   current_loops->state &= ~flags;
    489 }
    490 
    491 /* Loop iterators.  */
    492 
    493 /* Flags for loop iteration.  */
    494 
    495 enum li_flags
    496 {
    497   LI_INCLUDE_ROOT = 1,		/* Include the fake root of the loop tree.  */
    498   LI_FROM_INNERMOST = 2,	/* Iterate over the loops in the reverse order,
    499 				   starting from innermost ones.  */
    500   LI_ONLY_INNERMOST = 4		/* Iterate only over innermost loops.  */
    501 };
    502 
    503 /* The iterator for loops.  */
    504 
    505 typedef struct
    506 {
    507   /* The list of loops to visit.  */
    508   VEC(int,heap) *to_visit;
    509 
    510   /* The index of the actual loop.  */
    511   unsigned idx;
    512 } loop_iterator;
    513 
    514 static inline void
    515 fel_next (loop_iterator *li, loop_p *loop)
    516 {
    517   int anum;
    518 
    519   while (VEC_iterate (int, li->to_visit, li->idx, anum))
    520     {
    521       li->idx++;
    522       *loop = get_loop (anum);
    523       if (*loop)
    524 	return;
    525     }
    526 
    527   VEC_free (int, heap, li->to_visit);
    528   *loop = NULL;
    529 }
    530 
    531 static inline void
    532 fel_init (loop_iterator *li, loop_p *loop, unsigned flags)
    533 {
    534   struct loop *aloop;
    535   unsigned i;
    536   int mn;
    537 
    538   li->idx = 0;
    539   if (!current_loops)
    540     {
    541       li->to_visit = NULL;
    542       *loop = NULL;
    543       return;
    544     }
    545 
    546   li->to_visit = VEC_alloc (int, heap, number_of_loops ());
    547   mn = (flags & LI_INCLUDE_ROOT) ? 0 : 1;
    548 
    549   if (flags & LI_ONLY_INNERMOST)
    550     {
    551       for (i = 0; VEC_iterate (loop_p, current_loops->larray, i, aloop); i++)
    552 	if (aloop != NULL
    553 	    && aloop->inner == NULL
    554 	    && aloop->num >= mn)
    555 	  VEC_quick_push (int, li->to_visit, aloop->num);
    556     }
    557   else if (flags & LI_FROM_INNERMOST)
    558     {
    559       /* Push the loops to LI->TO_VISIT in postorder.  */
    560       for (aloop = current_loops->tree_root;
    561 	   aloop->inner != NULL;
    562 	   aloop = aloop->inner)
    563 	continue;
    564 
    565       while (1)
    566 	{
    567 	  if (aloop->num >= mn)
    568 	    VEC_quick_push (int, li->to_visit, aloop->num);
    569 
    570 	  if (aloop->next)
    571 	    {
    572 	      for (aloop = aloop->next;
    573 		   aloop->inner != NULL;
    574 		   aloop = aloop->inner)
    575 		continue;
    576 	    }
    577 	  else if (!loop_outer (aloop))
    578 	    break;
    579 	  else
    580 	    aloop = loop_outer (aloop);
    581 	}
    582     }
    583   else
    584     {
    585       /* Push the loops to LI->TO_VISIT in preorder.  */
    586       aloop = current_loops->tree_root;
    587       while (1)
    588 	{
    589 	  if (aloop->num >= mn)
    590 	    VEC_quick_push (int, li->to_visit, aloop->num);
    591 
    592 	  if (aloop->inner != NULL)
    593 	    aloop = aloop->inner;
    594 	  else
    595 	    {
    596 	      while (aloop != NULL && aloop->next == NULL)
    597 		aloop = loop_outer (aloop);
    598 	      if (aloop == NULL)
    599 		break;
    600 	      aloop = aloop->next;
    601 	    }
    602 	}
    603     }
    604 
    605   fel_next (li, loop);
    606 }
    607 
    608 #define FOR_EACH_LOOP(LI, LOOP, FLAGS) \
    609   for (fel_init (&(LI), &(LOOP), FLAGS); \
    610        (LOOP); \
    611        fel_next (&(LI), &(LOOP)))
    612 
    613 #define FOR_EACH_LOOP_BREAK(LI) \
    614   { \
    615     VEC_free (int, heap, (LI)->to_visit); \
    616     break; \
    617   }
    618 
    619 /* The properties of the target.  */
    620 
    621 extern unsigned target_avail_regs;
    622 extern unsigned target_res_regs;
    623 extern unsigned target_reg_cost [2];
    624 extern unsigned target_spill_cost [2];
    625 
    626 /* Register pressure estimation for induction variable optimizations & loop
    627    invariant motion.  */
    628 extern unsigned estimate_reg_pressure_cost (unsigned, unsigned, bool);
    629 extern void init_set_costs (void);
    630 
    631 /* Loop optimizer initialization.  */
    632 extern void loop_optimizer_init (unsigned);
    633 extern void loop_optimizer_finalize (void);
    634 
    635 /* Optimization passes.  */
    636 extern void unswitch_loops (void);
    637 
    638 enum
    639 {
    640   UAP_PEEL = 1,		/* Enables loop peeling.  */
    641   UAP_UNROLL = 2,	/* Enables unrolling of loops if it seems profitable.  */
    642   UAP_UNROLL_ALL = 4	/* Enables unrolling of all loops.  */
    643 };
    644 
    645 extern void unroll_and_peel_loops (int);
    646 extern void doloop_optimize_loops (void);
    647 extern void move_loop_invariants (void);
    648 
    649 #endif /* GCC_CFGLOOP_H */
    650