| 1 |
280 |
jeremybenn |
/* Scalar evolution detector.
|
| 2 |
|
|
Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
|
| 3 |
|
|
Contributed by Sebastian Pop <s.pop@laposte.net>
|
| 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_TREE_SCALAR_EVOLUTION_H
|
| 22 |
|
|
#define GCC_TREE_SCALAR_EVOLUTION_H
|
| 23 |
|
|
|
| 24 |
|
|
extern tree number_of_latch_executions (struct loop *);
|
| 25 |
|
|
extern tree number_of_exit_cond_executions (struct loop *);
|
| 26 |
|
|
extern gimple get_loop_exit_condition (const struct loop *);
|
| 27 |
|
|
|
| 28 |
|
|
extern void scev_initialize (void);
|
| 29 |
|
|
extern void scev_reset (void);
|
| 30 |
|
|
extern void scev_reset_htab (void);
|
| 31 |
|
|
extern void scev_finalize (void);
|
| 32 |
|
|
extern tree analyze_scalar_evolution (struct loop *, tree);
|
| 33 |
|
|
extern tree instantiate_scev (basic_block, struct loop *, tree);
|
| 34 |
|
|
extern tree resolve_mixers (struct loop *, tree);
|
| 35 |
|
|
extern void gather_stats_on_scev_database (void);
|
| 36 |
|
|
extern void scev_analysis (void);
|
| 37 |
|
|
extern unsigned int scev_const_prop (void);
|
| 38 |
|
|
extern bool expression_expensive_p (tree);
|
| 39 |
|
|
extern bool simple_iv (struct loop *, struct loop *, tree, affine_iv *, bool);
|
| 40 |
|
|
extern tree compute_overall_effect_of_inner_loop (struct loop *, tree);
|
| 41 |
|
|
|
| 42 |
|
|
/* Returns the basic block preceding LOOP or ENTRY_BLOCK_PTR when the
|
| 43 |
|
|
loop is function's body. */
|
| 44 |
|
|
|
| 45 |
|
|
static inline basic_block
|
| 46 |
|
|
block_before_loop (loop_p loop)
|
| 47 |
|
|
{
|
| 48 |
|
|
edge preheader = loop_preheader_edge (loop);
|
| 49 |
|
|
return (preheader ? preheader->src : ENTRY_BLOCK_PTR);
|
| 50 |
|
|
}
|
| 51 |
|
|
|
| 52 |
|
|
/* Analyze all the parameters of the chrec that were left under a
|
| 53 |
|
|
symbolic form. LOOP is the loop in which symbolic names have to
|
| 54 |
|
|
be analyzed and instantiated. */
|
| 55 |
|
|
|
| 56 |
|
|
static inline tree
|
| 57 |
|
|
instantiate_parameters (struct loop *loop, tree chrec)
|
| 58 |
|
|
{
|
| 59 |
|
|
return instantiate_scev (block_before_loop (loop), loop, chrec);
|
| 60 |
|
|
}
|
| 61 |
|
|
|
| 62 |
|
|
/* Returns the loop of the polynomial chrec CHREC. */
|
| 63 |
|
|
|
| 64 |
|
|
static inline struct loop *
|
| 65 |
|
|
get_chrec_loop (const_tree chrec)
|
| 66 |
|
|
{
|
| 67 |
|
|
return get_loop (CHREC_VARIABLE (chrec));
|
| 68 |
|
|
}
|
| 69 |
|
|
|
| 70 |
|
|
#endif /* GCC_TREE_SCALAR_EVOLUTION_H */
|