xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/tree-scalar-evolution.h (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
11debfc3dSmrg /* Scalar evolution detector.
2*8feb0f0bSmrg    Copyright (C) 2003-2020 Free Software Foundation, Inc.
31debfc3dSmrg    Contributed by Sebastian Pop <s.pop@laposte.net>
41debfc3dSmrg 
51debfc3dSmrg This file is part of GCC.
61debfc3dSmrg 
71debfc3dSmrg GCC is free software; you can redistribute it and/or modify it under
81debfc3dSmrg the terms of the GNU General Public License as published by the Free
91debfc3dSmrg Software Foundation; either version 3, or (at your option) any later
101debfc3dSmrg version.
111debfc3dSmrg 
121debfc3dSmrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
131debfc3dSmrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
141debfc3dSmrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
151debfc3dSmrg for more details.
161debfc3dSmrg 
171debfc3dSmrg You should have received a copy of the GNU General Public License
181debfc3dSmrg along with GCC; see the file COPYING3.  If not see
191debfc3dSmrg <http://www.gnu.org/licenses/>.  */
201debfc3dSmrg 
211debfc3dSmrg #ifndef GCC_TREE_SCALAR_EVOLUTION_H
221debfc3dSmrg #define GCC_TREE_SCALAR_EVOLUTION_H
231debfc3dSmrg 
24*8feb0f0bSmrg extern tree number_of_latch_executions (class loop *);
25*8feb0f0bSmrg extern gcond *get_loop_exit_condition (const class loop *);
261debfc3dSmrg 
271debfc3dSmrg extern void scev_initialize (void);
281debfc3dSmrg extern bool scev_initialized_p (void);
291debfc3dSmrg extern void scev_reset (void);
301debfc3dSmrg extern void scev_reset_htab (void);
311debfc3dSmrg extern void scev_finalize (void);
32*8feb0f0bSmrg extern tree analyze_scalar_evolution (class loop *, tree);
33*8feb0f0bSmrg extern tree instantiate_scev (edge, class loop *, tree);
34*8feb0f0bSmrg extern tree resolve_mixers (class loop *, tree, bool *);
351debfc3dSmrg extern void gather_stats_on_scev_database (void);
36*8feb0f0bSmrg extern bool final_value_replacement_loop (class loop *);
371debfc3dSmrg extern unsigned int scev_const_prop (void);
381debfc3dSmrg extern bool expression_expensive_p (tree);
39*8feb0f0bSmrg extern bool simple_iv_with_niters (class loop *, class loop *, tree,
401debfc3dSmrg 				   struct affine_iv *, tree *, bool);
41*8feb0f0bSmrg extern bool simple_iv (class loop *, class loop *, tree, struct affine_iv *,
421debfc3dSmrg 		       bool);
43*8feb0f0bSmrg extern bool iv_can_overflow_p (class loop *, tree, tree, tree);
44*8feb0f0bSmrg extern tree compute_overall_effect_of_inner_loop (class loop *, tree);
451debfc3dSmrg 
461debfc3dSmrg /* Returns the basic block preceding LOOP, or the CFG entry block when
471debfc3dSmrg    the loop is function's body.  */
481debfc3dSmrg 
491debfc3dSmrg static inline basic_block
block_before_loop(loop_p loop)501debfc3dSmrg block_before_loop (loop_p loop)
511debfc3dSmrg {
521debfc3dSmrg   edge preheader = loop_preheader_edge (loop);
531debfc3dSmrg   return (preheader ? preheader->src : ENTRY_BLOCK_PTR_FOR_FN (cfun));
541debfc3dSmrg }
551debfc3dSmrg 
561debfc3dSmrg /* Analyze all the parameters of the chrec that were left under a
571debfc3dSmrg    symbolic form.  LOOP is the loop in which symbolic names have to
581debfc3dSmrg    be analyzed and instantiated.  */
591debfc3dSmrg 
601debfc3dSmrg static inline tree
instantiate_parameters(class loop * loop,tree chrec)61*8feb0f0bSmrg instantiate_parameters (class loop *loop, tree chrec)
621debfc3dSmrg {
63a2dc1f3fSmrg   return instantiate_scev (loop_preheader_edge (loop), loop, chrec);
641debfc3dSmrg }
651debfc3dSmrg 
661debfc3dSmrg /* Returns the loop of the polynomial chrec CHREC.  */
671debfc3dSmrg 
68*8feb0f0bSmrg static inline class loop *
get_chrec_loop(const_tree chrec)691debfc3dSmrg get_chrec_loop (const_tree chrec)
701debfc3dSmrg {
711debfc3dSmrg   return get_loop (cfun, CHREC_VARIABLE (chrec));
721debfc3dSmrg }
731debfc3dSmrg 
741debfc3dSmrg #endif  /* GCC_TREE_SCALAR_EVOLUTION_H  */
75