(root)/
gcc-13.2.0/
gcc/
cfgloop.h
       1  /* Natural loop functions
       2     Copyright (C) 1987-2023 Free Software Foundation, Inc.
       3  
       4  This file is part of GCC.
       5  
       6  GCC is free software; you can redistribute it and/or modify it under
       7  the terms of the GNU General Public License as published by the Free
       8  Software Foundation; either version 3, or (at your option) any later
       9  version.
      10  
      11  GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      12  WARRANTY; without even the implied warranty of MERCHANTABILITY or
      13  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      14  for more details.
      15  
      16  You should have received a copy of the GNU General Public License
      17  along with GCC; see the file COPYING3.  If not see
      18  <http://www.gnu.org/licenses/>.  */
      19  
      20  #ifndef GCC_CFGLOOP_H
      21  #define GCC_CFGLOOP_H
      22  
      23  #include "cfgloopmanip.h"
      24  
      25  /* Structure to hold decision about unrolling/peeling.  */
      26  enum lpt_dec
      27  {
      28    LPT_NONE,
      29    LPT_UNROLL_CONSTANT,
      30    LPT_UNROLL_RUNTIME,
      31    LPT_UNROLL_STUPID
      32  };
      33  
      34  struct GTY (()) lpt_decision {
      35    enum lpt_dec decision;
      36    unsigned times;
      37  };
      38  
      39  /* The type of extend applied to an IV.  */
      40  enum iv_extend_code
      41  {
      42    IV_SIGN_EXTEND,
      43    IV_ZERO_EXTEND,
      44    IV_UNKNOWN_EXTEND
      45  };
      46  
      47  /* The structure describing a bound on number of iterations of a loop.  */
      48  
      49  class GTY ((chain_next ("%h.next"))) nb_iter_bound {
      50  public:
      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    widest_int bound;
      62  
      63    /* True if, after executing the statement BOUND + 1 times, we will
      64       leave the loop; that is, all the statements after it are executed at most
      65       BOUND times.  */
      66    bool is_exit;
      67  
      68    /* The next bound in the list.  */
      69    class nb_iter_bound *next;
      70  };
      71  
      72  /* Description of the loop exit.  */
      73  
      74  struct GTY ((for_user)) loop_exit {
      75    /* The exit edge.  */
      76    edge e;
      77  
      78    /* Previous and next exit in the list of the exits of the loop.  */
      79    struct loop_exit *prev;
      80    struct loop_exit *next;
      81  
      82    /* Next element in the list of loops from that E exits.  */
      83    struct loop_exit *next_e;
      84  };
      85  
      86  struct loop_exit_hasher : ggc_ptr_hash<loop_exit>
      87  {
      88    typedef edge compare_type;
      89  
      90    static hashval_t hash (loop_exit *);
      91    static bool equal (loop_exit *, edge);
      92    static void remove (loop_exit *);
      93  };
      94  
      95  typedef class loop *loop_p;
      96  
      97  /* An integer estimation of the number of iterations.  Estimate_state
      98     describes what is the state of the estimation.  */
      99  enum loop_estimation
     100  {
     101    /* Estimate was not computed yet.  */
     102    EST_NOT_COMPUTED,
     103    /* Estimate is ready.  */
     104    EST_AVAILABLE,
     105    EST_LAST
     106  };
     107  
     108  /* The structure describing non-overflow control induction variable for
     109     loop's exit edge.  */
     110  struct GTY ((chain_next ("%h.next"))) control_iv {
     111    tree base;
     112    tree step;
     113    struct control_iv *next;
     114  };
     115  
     116  /* Structure to hold information for each natural loop.  */
     117  class GTY ((chain_next ("%h.next"))) loop {
     118  public:
     119    /* Index into loops array.  Note indices will never be reused after loop
     120       is destroyed.  */
     121    int num;
     122  
     123    /* Number of loop insns.  */
     124    unsigned ninsns;
     125  
     126    /* Basic block of loop header.  */
     127    basic_block header;
     128  
     129    /* Basic block of loop latch.  */
     130    basic_block latch;
     131  
     132    /* For loop unrolling/peeling decision.  */
     133    struct lpt_decision lpt_decision;
     134  
     135    /* Average number of executed insns per iteration.  */
     136    unsigned av_ninsns;
     137  
     138    /* Number of blocks contained within the loop.  */
     139    unsigned num_nodes;
     140  
     141    /* Superloops of the loop, starting with the outermost loop.  */
     142    vec<loop_p, va_gc> *superloops;
     143  
     144    /* The first inner (child) loop or NULL if innermost loop.  */
     145    class loop *inner;
     146  
     147    /* Link to the next (sibling) loop.  */
     148    class loop *next;
     149  
     150    /* Auxiliary info specific to a pass.  */
     151    void *GTY ((skip (""))) aux;
     152  
     153    /* The number of times the latch of the loop is executed.  This can be an
     154       INTEGER_CST, or a symbolic expression representing the number of
     155       iterations like "N - 1", or a COND_EXPR containing the runtime
     156       conditions under which the number of iterations is non zero.
     157  
     158       Don't access this field directly: number_of_latch_executions
     159       computes and caches the computed information in this field.  */
     160    tree nb_iterations;
     161  
     162    /* An integer guaranteed to be greater or equal to nb_iterations.  Only
     163       valid if any_upper_bound is true.  */
     164    widest_int nb_iterations_upper_bound;
     165  
     166    widest_int nb_iterations_likely_upper_bound;
     167  
     168    /* An integer giving an estimate on nb_iterations.  Unlike
     169       nb_iterations_upper_bound, there is no guarantee that it is at least
     170       nb_iterations.  */
     171    widest_int nb_iterations_estimate;
     172  
     173    /* If > 0, an integer, where the user asserted that for any
     174       I in [ 0, nb_iterations ) and for any J in
     175       [ I, min ( I + safelen, nb_iterations ) ), the Ith and Jth iterations
     176       of the loop can be safely evaluated concurrently.  */
     177    int safelen;
     178  
     179    /* Preferred vectorization factor for the loop if non-zero.  */
     180    int simdlen;
     181  
     182    /* Constraints are generally set by consumers and affect certain
     183       semantics of niter analyzer APIs.  Currently the APIs affected are
     184       number_of_iterations_exit* functions and their callers.  One typical
     185       use case of constraints is to vectorize possibly infinite loop:
     186  
     187         1) Compute niter->assumptions by calling niter analyzer API and
     188  	  record it as possible condition for loop versioning.
     189         2) Clear buffered result of niter/scev analyzer.
     190         3) Set constraint LOOP_C_FINITE assuming the loop is finite.
     191         4) Analyze data references.  Since data reference analysis depends
     192  	  on niter/scev analyzer, the point is that niter/scev analysis
     193  	  is done under circumstance of LOOP_C_FINITE constraint.
     194         5) Version the loop with niter->assumptions computed in step 1).
     195         6) Vectorize the versioned loop in which niter->assumptions is
     196  	  checked to be true.
     197         7) Update constraints in versioned loops so that niter analyzer
     198  	  in following passes can use it.
     199  
     200       Note consumers are usually the loop optimizers and it is consumers'
     201       responsibility to set/clear constraints correctly.  Failing to do
     202       that might result in hard to track down bugs in niter/scev consumers.  */
     203    unsigned constraints;
     204  
     205    /* An integer estimation of the number of iterations.  Estimate_state
     206       describes what is the state of the estimation.  */
     207    ENUM_BITFIELD(loop_estimation) estimate_state : 8;
     208  
     209    unsigned any_upper_bound : 1;
     210    unsigned any_estimate : 1;
     211    unsigned any_likely_upper_bound : 1;
     212  
     213    /* True if the loop can be parallel.  */
     214    unsigned can_be_parallel : 1;
     215  
     216    /* True if -Waggressive-loop-optimizations warned about this loop
     217       already.  */
     218    unsigned warned_aggressive_loop_optimizations : 1;
     219  
     220    /* True if this loop should never be vectorized.  */
     221    unsigned dont_vectorize : 1;
     222  
     223    /* True if we should try harder to vectorize this loop.  */
     224    unsigned force_vectorize : 1;
     225  
     226    /* True if the loop is part of an oacc kernels region.  */
     227    unsigned in_oacc_kernels_region : 1;
     228  
     229    /* True if the loop is known to be finite.  This is a localized
     230       flag_finite_loops or similar pragmas state.  */
     231    unsigned finite_p : 1;
     232  
     233    /* The number of times to unroll the loop.  0 means no information given,
     234       just do what we always do.  A value of 1 means do not unroll the loop.
     235       A value of USHRT_MAX means unroll with no specific unrolling factor.
     236       Other values means unroll with the given unrolling factor.  */
     237    unsigned short unroll;
     238  
     239    /* If this loop was inlined the main clique of the callee which does
     240       not need remapping when copying the loop body.  */
     241    unsigned short owned_clique;
     242  
     243    /* For SIMD loops, this is a unique identifier of the loop, referenced
     244       by IFN_GOMP_SIMD_VF, IFN_GOMP_SIMD_LANE and IFN_GOMP_SIMD_LAST_LANE
     245       builtins.  */
     246    tree simduid;
     247  
     248    /* In loop optimization, it's common to generate loops from the original
     249       loop.  This field records the index of the original loop which can be
     250       used to track the original loop from newly generated loops.  This can
     251       be done by calling function get_loop (cfun, orig_loop_num).  Note the
     252       original loop could be destroyed for various reasons thus no longer
     253       exists, as a result, function call to get_loop returns NULL pointer.
     254       In this case, this field should not be used and needs to be cleared
     255       whenever possible.  */
     256    int orig_loop_num;
     257  
     258    /* Upper bound on number of iterations of a loop.  */
     259    class nb_iter_bound *bounds;
     260  
     261    /* Non-overflow control ivs of a loop.  */
     262    struct control_iv *control_ivs;
     263  
     264    /* Head of the cyclic list of the exits of the loop.  */
     265    struct loop_exit *exits;
     266  
     267    /* Number of iteration analysis data for RTL.  */
     268    class niter_desc *simple_loop_desc;
     269  
     270    /* For sanity checking during loop fixup we record here the former
     271       loop header for loops marked for removal.  Note that this prevents
     272       the basic-block from being collected but its index can still be
     273       reused.  */
     274    basic_block former_header;
     275  };
     276  
     277  /* Set if the loop is known to be infinite.  */
     278  #define LOOP_C_INFINITE		(1 << 0)
     279  /* Set if the loop is known to be finite without any assumptions.  */
     280  #define LOOP_C_FINITE		(1 << 1)
     281  
     282  /* Set C to the LOOP constraint.  */
     283  inline void
     284  loop_constraint_set (class loop *loop, unsigned c)
     285  {
     286    loop->constraints |= c;
     287  }
     288  
     289  /* Clear C from the LOOP constraint.  */
     290  inline void
     291  loop_constraint_clear (class loop *loop, unsigned c)
     292  {
     293    loop->constraints &= ~c;
     294  }
     295  
     296  /* Check if C is set in the LOOP constraint.  */
     297  inline bool
     298  loop_constraint_set_p (class loop *loop, unsigned c)
     299  {
     300    return (loop->constraints & c) == c;
     301  }
     302  
     303  /* Flags for state of loop structure.  */
     304  enum
     305  {
     306    LOOPS_HAVE_PREHEADERS = 1,
     307    LOOPS_HAVE_SIMPLE_LATCHES = 2,
     308    LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS = 4,
     309    LOOPS_HAVE_RECORDED_EXITS = 8,
     310    LOOPS_MAY_HAVE_MULTIPLE_LATCHES = 16,
     311    LOOP_CLOSED_SSA = 32,
     312    LOOPS_NEED_FIXUP = 64,
     313    LOOPS_HAVE_FALLTHRU_PREHEADERS = 128
     314  };
     315  
     316  #define LOOPS_NORMAL (LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_SIMPLE_LATCHES \
     317  		      | LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
     318  #define AVOID_CFG_MODIFICATIONS (LOOPS_MAY_HAVE_MULTIPLE_LATCHES)
     319  
     320  /* Structure to hold CFG information about natural loops within a function.  */
     321  struct GTY (()) loops {
     322    /* State of loops.  */
     323    int state;
     324  
     325    /* Array of the loops.  */
     326    vec<loop_p, va_gc> *larray;
     327  
     328    /* Maps edges to the list of their descriptions as loop exits.  Edges
     329       whose sources or destinations have loop_father == NULL (which may
     330       happen during the cfg manipulations) should not appear in EXITS.  */
     331    hash_table<loop_exit_hasher> *GTY(()) exits;
     332  
     333    /* Pointer to root of loop hierarchy tree.  */
     334    class loop *tree_root;
     335  };
     336  
     337  /* Loop recognition.  */
     338  bool bb_loop_header_p (basic_block);
     339  void init_loops_structure (struct function *, struct loops *, unsigned);
     340  extern struct loops *flow_loops_find (struct loops *);
     341  extern void disambiguate_loops_with_multiple_latches (void);
     342  extern void flow_loops_free (struct loops *);
     343  extern void flow_loops_dump (FILE *,
     344  			     void (*)(const class loop *, FILE *, int), int);
     345  extern void flow_loop_dump (const class loop *, FILE *,
     346  			    void (*)(const class loop *, FILE *, int), int);
     347  class loop *alloc_loop (void);
     348  extern void flow_loop_free (class loop *);
     349  int flow_loop_nodes_find (basic_block, class loop *);
     350  unsigned fix_loop_structure (bitmap changed_bbs);
     351  bool mark_irreducible_loops (void);
     352  void release_recorded_exits (function *);
     353  void record_loop_exits (void);
     354  void rescan_loop_exit (edge, bool, bool);
     355  void sort_sibling_loops (function *);
     356  
     357  /* Loop data structure manipulation/querying.  */
     358  extern void flow_loop_tree_node_add (class loop *, class loop *,
     359  				     class loop * = NULL);
     360  extern void flow_loop_tree_node_remove (class loop *);
     361  extern bool flow_loop_nested_p	(const class loop *, const class loop *);
     362  extern bool flow_bb_inside_loop_p (const class loop *, const_basic_block);
     363  extern class loop * find_common_loop (class loop *, class loop *);
     364  class loop *superloop_at_depth (class loop *, unsigned);
     365  struct eni_weights;
     366  extern int num_loop_insns (const class loop *);
     367  extern int average_num_loop_insns (const class loop *);
     368  extern unsigned get_loop_level (const class loop *);
     369  extern bool loop_exit_edge_p (const class loop *, const_edge);
     370  extern bool loop_exits_to_bb_p (class loop *, basic_block);
     371  extern bool loop_exits_from_bb_p (class loop *, basic_block);
     372  extern void mark_loop_exit_edges (void);
     373  extern dump_user_location_t get_loop_location (class loop *loop);
     374  
     375  /* Loops & cfg manipulation.  */
     376  extern basic_block *get_loop_body (const class loop *);
     377  extern unsigned get_loop_body_with_size (const class loop *, basic_block *,
     378  					 unsigned);
     379  extern basic_block *get_loop_body_in_dom_order (const class loop *);
     380  extern basic_block *get_loop_body_in_bfs_order (const class loop *);
     381  extern basic_block *get_loop_body_in_custom_order (const class loop *,
     382  			       int (*) (const void *, const void *));
     383  extern basic_block *get_loop_body_in_custom_order (const class loop *, void *,
     384  			       int (*) (const void *, const void *, void *));
     385  
     386  extern auto_vec<edge> get_loop_exit_edges (const class loop *, basic_block * = NULL);
     387  extern edge single_exit (const class loop *);
     388  extern edge single_likely_exit (class loop *loop, const vec<edge> &);
     389  extern unsigned num_loop_branches (const class loop *);
     390  
     391  extern edge loop_preheader_edge (const class loop *);
     392  extern edge loop_latch_edge (const class loop *);
     393  
     394  extern void add_bb_to_loop (basic_block, class loop *);
     395  extern void remove_bb_from_loops (basic_block);
     396  
     397  extern void cancel_loop_tree (class loop *);
     398  extern void delete_loop (class loop *);
     399  
     400  
     401  extern void verify_loop_structure (void);
     402  
     403  /* Loop analysis.  */
     404  extern bool just_once_each_iteration_p (const class loop *, const_basic_block);
     405  gcov_type expected_loop_iterations_unbounded (const class loop *,
     406  					      bool *read_profile_p = NULL, bool by_profile_only = false);
     407  extern unsigned expected_loop_iterations (class loop *);
     408  extern rtx doloop_condition_get (rtx_insn *);
     409  
     410  void mark_loop_for_removal (loop_p);
     411  
     412  /* Induction variable analysis.  */
     413  
     414  /* The description of induction variable.  The things are a bit complicated
     415     due to need to handle subregs and extends.  The value of the object described
     416     by it can be obtained as follows (all computations are done in extend_mode):
     417  
     418     Value in i-th iteration is
     419       delta + mult * extend_{extend_mode} (subreg_{mode} (base + i * step)).
     420  
     421     If first_special is true, the value in the first iteration is
     422       delta + mult * base
     423  
     424     If extend = UNKNOWN, first_special must be false, delta 0, mult 1 and value is
     425       subreg_{mode} (base + i * step)
     426  
     427     The get_iv_value function can be used to obtain these expressions.
     428  
     429     ??? Add a third mode field that would specify the mode in that inner
     430     computation is done, which would enable it to be different from the
     431     outer one?  */
     432  
     433  class rtx_iv
     434  {
     435  public:
     436    /* Its base and step (mode of base and step is supposed to be extend_mode,
     437       see the description above).  */
     438    rtx base, step;
     439  
     440    /* The type of extend applied to it (IV_SIGN_EXTEND, IV_ZERO_EXTEND,
     441       or IV_UNKNOWN_EXTEND).  */
     442    enum iv_extend_code extend;
     443  
     444    /* Operations applied in the extended mode.  */
     445    rtx delta, mult;
     446  
     447    /* The mode it is extended to.  */
     448    scalar_int_mode extend_mode;
     449  
     450    /* The mode the variable iterates in.  */
     451    scalar_int_mode mode;
     452  
     453    /* Whether the first iteration needs to be handled specially.  */
     454    unsigned first_special : 1;
     455  };
     456  
     457  /* The description of an exit from the loop and of the number of iterations
     458     till we take the exit.  */
     459  
     460  class GTY(()) niter_desc
     461  {
     462  public:
     463    /* The edge out of the loop.  */
     464    edge out_edge;
     465  
     466    /* The other edge leading from the condition.  */
     467    edge in_edge;
     468  
     469    /* True if we are able to say anything about number of iterations of the
     470       loop.  */
     471    bool simple_p;
     472  
     473    /* True if the loop iterates the constant number of times.  */
     474    bool const_iter;
     475  
     476    /* Number of iterations if constant.  */
     477    uint64_t niter;
     478  
     479    /* Assumptions under that the rest of the information is valid.  */
     480    rtx assumptions;
     481  
     482    /* Assumptions under that the loop ends before reaching the latch,
     483       even if value of niter_expr says otherwise.  */
     484    rtx noloop_assumptions;
     485  
     486    /* Condition under that the loop is infinite.  */
     487    rtx infinite;
     488  
     489    /* Whether the comparison is signed.  */
     490    bool signed_p;
     491  
     492    /* The mode in that niter_expr should be computed.  */
     493    scalar_int_mode mode;
     494  
     495    /* The number of iterations of the loop.  */
     496    rtx niter_expr;
     497  };
     498  
     499  extern void iv_analysis_loop_init (class loop *);
     500  extern bool iv_analyze (rtx_insn *, scalar_int_mode, rtx, class rtx_iv *);
     501  extern bool iv_analyze_result (rtx_insn *, rtx, class rtx_iv *);
     502  extern bool iv_analyze_expr (rtx_insn *, scalar_int_mode, rtx,
     503  			     class rtx_iv *);
     504  extern rtx get_iv_value (class rtx_iv *, rtx);
     505  extern bool biv_p (rtx_insn *, scalar_int_mode, rtx);
     506  extern void iv_analysis_done (void);
     507  
     508  extern class niter_desc *get_simple_loop_desc (class loop *loop);
     509  extern void free_simple_loop_desc (class loop *loop);
     510  
     511  inline class niter_desc *
     512  simple_loop_desc (class loop *loop)
     513  {
     514    return loop->simple_loop_desc;
     515  }
     516  
     517  /* Accessors for the loop structures.  */
     518  
     519  /* Returns the loop with index NUM from FNs loop tree.  */
     520  
     521  inline class loop *
     522  get_loop (struct function *fn, unsigned num)
     523  {
     524    return (*loops_for_fn (fn)->larray)[num];
     525  }
     526  
     527  /* Returns the number of superloops of LOOP.  */
     528  
     529  inline unsigned
     530  loop_depth (const class loop *loop)
     531  {
     532    return vec_safe_length (loop->superloops);
     533  }
     534  
     535  /* Returns the immediate superloop of LOOP, or NULL if LOOP is the outermost
     536     loop.  */
     537  
     538  inline class loop *
     539  loop_outer (const class loop *loop)
     540  {
     541    unsigned n = vec_safe_length (loop->superloops);
     542  
     543    if (n == 0)
     544      return NULL;
     545  
     546    return (*loop->superloops)[n - 1];
     547  }
     548  
     549  /* Returns true if LOOP has at least one exit edge.  */
     550  
     551  inline bool
     552  loop_has_exit_edges (const class loop *loop)
     553  {
     554    return loop->exits->next->e != NULL;
     555  }
     556  
     557  /* Returns the list of loops in FN.  */
     558  
     559  inline vec<loop_p, va_gc> *
     560  get_loops (struct function *fn)
     561  {
     562    struct loops *loops = loops_for_fn (fn);
     563    if (!loops)
     564      return NULL;
     565  
     566    return loops->larray;
     567  }
     568  
     569  /* Returns the number of loops in FN (including the removed
     570     ones and the fake loop that forms the root of the loop tree).  */
     571  
     572  inline unsigned
     573  number_of_loops (struct function *fn)
     574  {
     575    struct loops *loops = loops_for_fn (fn);
     576    if (!loops)
     577      return 0;
     578  
     579    return vec_safe_length (loops->larray);
     580  }
     581  
     582  /* Returns true if state of the loops satisfies all properties
     583     described by FLAGS.  */
     584  
     585  inline bool
     586  loops_state_satisfies_p (function *fn, unsigned flags)
     587  {
     588    return (loops_for_fn (fn)->state & flags) == flags;
     589  }
     590  
     591  inline bool
     592  loops_state_satisfies_p (unsigned flags)
     593  {
     594    return loops_state_satisfies_p (cfun, flags);
     595  }
     596  
     597  /* Sets FLAGS to the loops state.  */
     598  
     599  inline void
     600  loops_state_set (function *fn, unsigned flags)
     601  {
     602    loops_for_fn (fn)->state |= flags;
     603  }
     604  
     605  inline void
     606  loops_state_set (unsigned flags)
     607  {
     608    loops_state_set (cfun, flags);
     609  }
     610  
     611  /* Clears FLAGS from the loops state.  */
     612  
     613  inline void
     614  loops_state_clear (function *fn, unsigned flags)
     615  {
     616    loops_for_fn (fn)->state &= ~flags;
     617  }
     618  
     619  inline void
     620  loops_state_clear (unsigned flags)
     621  {
     622    if (!current_loops)
     623      return;
     624    loops_state_clear (cfun, flags);
     625  }
     626  
     627  /* Check loop structure invariants, if internal consistency checks are
     628     enabled.  */
     629  
     630  inline void
     631  checking_verify_loop_structure (void)
     632  {
     633    /* VERIFY_LOOP_STRUCTURE essentially asserts that no loops need fixups.
     634  
     635       The loop optimizers should never make changes to the CFG which
     636       require loop fixups.  But the low level CFG manipulation code may
     637       set the flag conservatively.
     638  
     639       Go ahead and clear the flag here.  That avoids the assert inside
     640       VERIFY_LOOP_STRUCTURE, and if there is an inconsistency in the loop
     641       structures VERIFY_LOOP_STRUCTURE will detect it.
     642  
     643       This also avoid the compile time cost of excessive fixups.  */
     644    loops_state_clear (LOOPS_NEED_FIXUP);
     645    if (flag_checking)
     646      verify_loop_structure ();
     647  }
     648  
     649  /* Loop iterators.  */
     650  
     651  /* Flags for loop iteration.  */
     652  
     653  enum li_flags
     654  {
     655    LI_INCLUDE_ROOT = 1,		/* Include the fake root of the loop tree.  */
     656    LI_FROM_INNERMOST = 2,	/* Iterate over the loops in the reverse order,
     657  				   starting from innermost ones.  */
     658    LI_ONLY_INNERMOST = 4		/* Iterate only over innermost loops.  */
     659  };
     660  
     661  /* Provide the functionality of std::as_const to support range-based for
     662     to use const iterator.  (We can't use std::as_const itself because it's
     663     a C++17 feature.)  */
     664  template <typename T>
     665  constexpr const T &
     666  as_const (T &t)
     667  {
     668    return t;
     669  }
     670  
     671  /* A list for visiting loops, which contains the loop numbers instead of
     672     the loop pointers.  If the loop ROOT is offered (non-null), the visiting
     673     will start from it, otherwise it would start from the tree_root of
     674     loops_for_fn (FN) instead.  The scope is restricted in function FN and
     675     the visiting order is specified by FLAGS.  */
     676  
     677  class loops_list
     678  {
     679  public:
     680    loops_list (function *fn, unsigned flags, class loop *root = nullptr);
     681  
     682    template <typename T> class Iter
     683    {
     684    public:
     685      Iter (const loops_list &l, unsigned idx) : list (l), curr_idx (idx)
     686      {
     687        fill_curr_loop ();
     688      }
     689  
     690      T operator* () const { return curr_loop; }
     691  
     692      Iter &
     693      operator++ ()
     694      {
     695        if (curr_idx < list.to_visit.length ())
     696  	{
     697  	  /* Bump the index and fill a new one.  */
     698  	  curr_idx++;
     699  	  fill_curr_loop ();
     700  	}
     701        else
     702  	gcc_assert (!curr_loop);
     703  
     704        return *this;
     705      }
     706  
     707      bool
     708      operator!= (const Iter &rhs) const
     709      {
     710        return this->curr_idx != rhs.curr_idx;
     711      }
     712  
     713    private:
     714      /* Fill the current loop starting from the current index.  */
     715      void fill_curr_loop ();
     716  
     717      /* Reference to the loop list to visit.  */
     718      const loops_list &list;
     719  
     720      /* The current index in the list to visit.  */
     721      unsigned curr_idx;
     722  
     723      /* The loop implied by the current index.  */
     724      class loop *curr_loop;
     725    };
     726  
     727    using iterator = Iter<class loop *>;
     728    using const_iterator = Iter<const class loop *>;
     729  
     730    iterator
     731    begin ()
     732    {
     733      return iterator (*this, 0);
     734    }
     735  
     736    iterator
     737    end ()
     738    {
     739      return iterator (*this, to_visit.length ());
     740    }
     741  
     742    const_iterator
     743    begin () const
     744    {
     745      return const_iterator (*this, 0);
     746    }
     747  
     748    const_iterator
     749    end () const
     750    {
     751      return const_iterator (*this, to_visit.length ());
     752    }
     753  
     754  private:
     755    /* Walk loop tree starting from ROOT as the visiting order specified
     756       by FLAGS.  */
     757    void walk_loop_tree (class loop *root, unsigned flags);
     758  
     759    /* The function we are visiting.  */
     760    function *fn;
     761  
     762    /* The list of loops to visit.  */
     763    auto_vec<int, 16> to_visit;
     764  };
     765  
     766  /* Starting from current index CURR_IDX (inclusive), find one index
     767     which stands for one valid loop and fill the found loop as CURR_LOOP,
     768     if we can't find one, set CURR_LOOP as null.  */
     769  
     770  template <typename T>
     771  inline void
     772  loops_list::Iter<T>::fill_curr_loop ()
     773  {
     774    int anum;
     775  
     776    while (this->list.to_visit.iterate (this->curr_idx, &anum))
     777      {
     778        class loop *loop = get_loop (this->list.fn, anum);
     779        if (loop)
     780  	{
     781  	  curr_loop = loop;
     782  	  return;
     783  	}
     784        this->curr_idx++;
     785      }
     786  
     787    curr_loop = nullptr;
     788  }
     789  
     790  /* Set up the loops list to visit according to the specified
     791     function scope FN and iterating order FLAGS.  If ROOT is
     792     not null, the visiting would start from it, otherwise it
     793     will start from tree_root of loops_for_fn (FN).  */
     794  
     795  inline loops_list::loops_list (function *fn, unsigned flags, class loop *root)
     796  {
     797    struct loops *loops = loops_for_fn (fn);
     798    gcc_assert (!root || loops);
     799  
     800    /* Check mutually exclusive flags should not co-exist.  */
     801    unsigned checked_flags = LI_ONLY_INNERMOST | LI_FROM_INNERMOST;
     802    gcc_assert ((flags & checked_flags) != checked_flags);
     803  
     804    this->fn = fn;
     805    if (!loops)
     806      return;
     807  
     808    class loop *tree_root = root ? root : loops->tree_root;
     809  
     810    this->to_visit.reserve_exact (number_of_loops (fn));
     811  
     812    /* When root is tree_root of loops_for_fn (fn) and the visiting
     813       order is LI_ONLY_INNERMOST, we would like to use linear
     814       search here since it has a more stable bound than the
     815       walk_loop_tree.  */
     816    if (flags & LI_ONLY_INNERMOST && tree_root == loops->tree_root)
     817      {
     818        gcc_assert (tree_root->num == 0);
     819        if (tree_root->inner == NULL)
     820  	{
     821  	  if (flags & LI_INCLUDE_ROOT)
     822  	    this->to_visit.quick_push (0);
     823  
     824  	  return;
     825  	}
     826  
     827        class loop *aloop;
     828        unsigned int i;
     829        for (i = 1; vec_safe_iterate (loops->larray, i, &aloop); i++)
     830  	if (aloop != NULL && aloop->inner == NULL)
     831  	  this->to_visit.quick_push (aloop->num);
     832      }
     833    else
     834      walk_loop_tree (tree_root, flags);
     835  }
     836  
     837  /* The properties of the target.  */
     838  struct target_cfgloop {
     839    /* Number of available registers.  */
     840    unsigned x_target_avail_regs;
     841  
     842    /* Number of available registers that are call-clobbered.  */
     843    unsigned x_target_clobbered_regs;
     844  
     845    /* Number of registers reserved for temporary expressions.  */
     846    unsigned x_target_res_regs;
     847  
     848    /* The cost for register when there still is some reserve, but we are
     849       approaching the number of available registers.  */
     850    unsigned x_target_reg_cost[2];
     851  
     852    /* The cost for register when we need to spill.  */
     853    unsigned x_target_spill_cost[2];
     854  };
     855  
     856  extern struct target_cfgloop default_target_cfgloop;
     857  #if SWITCHABLE_TARGET
     858  extern struct target_cfgloop *this_target_cfgloop;
     859  #else
     860  #define this_target_cfgloop (&default_target_cfgloop)
     861  #endif
     862  
     863  #define target_avail_regs \
     864    (this_target_cfgloop->x_target_avail_regs)
     865  #define target_clobbered_regs \
     866    (this_target_cfgloop->x_target_clobbered_regs)
     867  #define target_res_regs \
     868    (this_target_cfgloop->x_target_res_regs)
     869  #define target_reg_cost \
     870    (this_target_cfgloop->x_target_reg_cost)
     871  #define target_spill_cost \
     872    (this_target_cfgloop->x_target_spill_cost)
     873  
     874  /* Register pressure estimation for induction variable optimizations & loop
     875     invariant motion.  */
     876  extern unsigned estimate_reg_pressure_cost (unsigned, unsigned, bool, bool);
     877  extern void init_set_costs (void);
     878  
     879  /* Loop optimizer initialization.  */
     880  extern void loop_optimizer_init (unsigned);
     881  extern void loop_optimizer_finalize (function *, bool = false);
     882  inline void
     883  loop_optimizer_finalize ()
     884  {
     885    loop_optimizer_finalize (cfun);
     886  }
     887  
     888  /* Optimization passes.  */
     889  enum
     890  {
     891    UAP_UNROLL = 1,	/* Enables unrolling of loops if it seems profitable.  */
     892    UAP_UNROLL_ALL = 2	/* Enables unrolling of all loops.  */
     893  };
     894  
     895  extern void doloop_optimize_loops (void);
     896  extern void move_loop_invariants (void);
     897  extern auto_vec<basic_block> get_loop_hot_path (const class loop *loop);
     898  
     899  /* Returns the outermost loop of the loop nest that contains LOOP.*/
     900  inline class loop *
     901  loop_outermost (class loop *loop)
     902  {
     903    unsigned n = vec_safe_length (loop->superloops);
     904  
     905    if (n <= 1)
     906      return loop;
     907  
     908    return (*loop->superloops)[1];
     909  }
     910  
     911  extern void record_niter_bound (class loop *, const widest_int &, bool, bool);
     912  extern HOST_WIDE_INT get_estimated_loop_iterations_int (class loop *);
     913  extern HOST_WIDE_INT get_max_loop_iterations_int (const class loop *);
     914  extern HOST_WIDE_INT get_likely_max_loop_iterations_int (class loop *);
     915  extern bool get_estimated_loop_iterations (class loop *loop, widest_int *nit);
     916  extern bool get_max_loop_iterations (const class loop *loop, widest_int *nit);
     917  extern bool get_likely_max_loop_iterations (class loop *loop, widest_int *nit);
     918  extern int bb_loop_depth (const_basic_block);
     919  
     920  /* Converts VAL to widest_int.  */
     921  
     922  inline widest_int
     923  gcov_type_to_wide_int (gcov_type val)
     924  {
     925    HOST_WIDE_INT a[2];
     926  
     927    a[0] = (unsigned HOST_WIDE_INT) val;
     928    /* If HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_WIDEST_INT, avoid shifting by
     929       the size of type.  */
     930    val >>= HOST_BITS_PER_WIDE_INT - 1;
     931    val >>= 1;
     932    a[1] = (unsigned HOST_WIDE_INT) val;
     933  
     934    return widest_int::from_array (a, 2);
     935  }
     936  #endif /* GCC_CFGLOOP_H */