1 /* Communication between registering jump thread requests and
2    updating the SSA/CFG for jump threading.
3    Copyright (C) 2013-2018 Free Software Foundation, Inc.
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11 
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License 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 _TREE_SSA_THREADUPDATE_H
22 #define _TREE_SSA_THREADUPDATE_H 1
23 
24 /* In tree-ssa-threadupdate.c.  */
25 extern bool thread_through_all_blocks (bool);
26 enum jump_thread_edge_type
27 {
28   EDGE_START_JUMP_THREAD,
29   EDGE_FSM_THREAD,
30   EDGE_COPY_SRC_BLOCK,
31   EDGE_COPY_SRC_JOINER_BLOCK,
32   EDGE_NO_COPY_SRC_BLOCK
33 };
34 
35 class jump_thread_edge
36 {
37 public:
38   jump_thread_edge (edge e, enum jump_thread_edge_type type)
39     : e (e), type (type) {}
40 
41   edge e;
42   enum jump_thread_edge_type type;
43 };
44 
45 extern void register_jump_thread (vec <class jump_thread_edge *> *);
46 extern void remove_jump_threads_including (edge);
47 extern void delete_jump_thread_path (vec <class jump_thread_edge *> *);
48 extern void remove_ctrl_stmt_and_useless_edges (basic_block, basic_block);
49 extern void free_dom_edge_info (edge);
50 extern unsigned int estimate_threading_killed_stmts (basic_block);
51 
52 enum bb_dom_status
53 {
54   /* BB does not dominate latch of the LOOP.  */
55   DOMST_NONDOMINATING,
56   /* The LOOP is broken (there is no path from the header to its latch.  */
57   DOMST_LOOP_BROKEN,
58   /* BB dominates the latch of the LOOP.  */
59   DOMST_DOMINATING
60 };
61 
62 enum bb_dom_status determine_bb_domination_status (struct loop *, basic_block);
63 
64 #endif
65