/* Header file for High-level loop manipulation functions.
   Copyright (C) 2013-2014 Free Software Foundation, Inc.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */

#ifndef GCC_TREE_SSA_LOOP_MANIP_H
#define GCC_TREE_SSA_LOOP_MANIP_H

typedef void (*transform_callback)(struct loop *, void *);

extern void create_iv (tree, tree, tree, struct loop *, gimple_stmt_iterator *,
		       bool, tree *, tree *);
extern void rewrite_into_loop_closed_ssa (bitmap, unsigned);
extern void verify_loop_closed_ssa (bool);
extern basic_block split_loop_exit_edge (edge);
extern basic_block ip_end_pos (struct loop *);
extern basic_block ip_normal_pos (struct loop *);
extern void standard_iv_increment_position (struct loop *,
					    gimple_stmt_iterator *, bool *);
extern bool gimple_duplicate_loop_to_header_edge (struct loop *, edge,
						  unsigned int, sbitmap,
						  edge, vec<edge> *,
						  int);
extern bool can_unroll_loop_p (struct loop *loop, unsigned factor,
			       struct tree_niter_desc *niter);
extern void tree_transform_and_unroll_loop (struct loop *, unsigned,
					    edge, struct tree_niter_desc *,
					    transform_callback, void *);
extern void tree_unroll_loop (struct loop *, unsigned,
			      edge, struct tree_niter_desc *);
extern tree canonicalize_loop_ivs (struct loop *, tree *, bool);



#endif /* GCC_TREE_SSA_LOOP_MANIP_H */
