1*38fd1498Szrj /* Header file for High-level loop manipulation functions.
2*38fd1498Szrj    Copyright (C) 2013-2018 Free Software Foundation, Inc.
3*38fd1498Szrj 
4*38fd1498Szrj This file is part of GCC.
5*38fd1498Szrj 
6*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under
7*38fd1498Szrj the terms of the GNU General Public License as published by the Free
8*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later
9*38fd1498Szrj version.
10*38fd1498Szrj 
11*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14*38fd1498Szrj  for more details.
15*38fd1498Szrj 
16*38fd1498Szrj You should have received a copy of the GNU General Public License
17*38fd1498Szrj along with GCC; see the file COPYING3.  If not see
18*38fd1498Szrj <http://www.gnu.org/licenses/>.  */
19*38fd1498Szrj 
20*38fd1498Szrj #ifndef GCC_TREE_SSA_LOOP_MANIP_H
21*38fd1498Szrj #define GCC_TREE_SSA_LOOP_MANIP_H
22*38fd1498Szrj 
23*38fd1498Szrj typedef void (*transform_callback)(struct loop *, void *);
24*38fd1498Szrj 
25*38fd1498Szrj extern void create_iv (tree, tree, tree, struct loop *, gimple_stmt_iterator *,
26*38fd1498Szrj 		       bool, tree *, tree *);
27*38fd1498Szrj extern void rewrite_into_loop_closed_ssa_1 (bitmap, unsigned, int,
28*38fd1498Szrj 					    struct loop *);
29*38fd1498Szrj extern void rewrite_into_loop_closed_ssa (bitmap, unsigned);
30*38fd1498Szrj extern void rewrite_virtuals_into_loop_closed_ssa (struct loop *);
31*38fd1498Szrj extern void verify_loop_closed_ssa (bool, struct loop * = NULL);
32*38fd1498Szrj 
33*38fd1498Szrj static inline void
34*38fd1498Szrj checking_verify_loop_closed_ssa (bool verify_ssa_p, struct loop *loop = NULL)
35*38fd1498Szrj {
36*38fd1498Szrj   if (flag_checking)
37*38fd1498Szrj     verify_loop_closed_ssa (verify_ssa_p, loop);
38*38fd1498Szrj }
39*38fd1498Szrj 
40*38fd1498Szrj extern basic_block split_loop_exit_edge (edge);
41*38fd1498Szrj extern basic_block ip_end_pos (struct loop *);
42*38fd1498Szrj extern basic_block ip_normal_pos (struct loop *);
43*38fd1498Szrj extern void standard_iv_increment_position (struct loop *,
44*38fd1498Szrj 					    gimple_stmt_iterator *, bool *);
45*38fd1498Szrj extern bool gimple_duplicate_loop_to_header_edge (struct loop *, edge,
46*38fd1498Szrj 						  unsigned int, sbitmap,
47*38fd1498Szrj 						  edge, vec<edge> *,
48*38fd1498Szrj 						  int);
49*38fd1498Szrj extern bool can_unroll_loop_p (struct loop *loop, unsigned factor,
50*38fd1498Szrj 			       struct tree_niter_desc *niter);
51*38fd1498Szrj extern gcov_type niter_for_unrolled_loop (struct loop *, unsigned);
52*38fd1498Szrj extern void tree_transform_and_unroll_loop (struct loop *, unsigned,
53*38fd1498Szrj 					    edge, struct tree_niter_desc *,
54*38fd1498Szrj 					    transform_callback, void *);
55*38fd1498Szrj extern void tree_unroll_loop (struct loop *, unsigned,
56*38fd1498Szrj 			      edge, struct tree_niter_desc *);
57*38fd1498Szrj extern tree canonicalize_loop_ivs (struct loop *, tree *, bool);
58*38fd1498Szrj 
59*38fd1498Szrj 
60*38fd1498Szrj 
61*38fd1498Szrj #endif /* GCC_TREE_SSA_LOOP_MANIP_H */
62