Mercurial > hg > CbC > CbC_gcc
annotate gcc/tree-inline.h @ 138:fc828634a951
merge
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 08 Nov 2018 14:17:14 +0900 |
parents | 84e7813d76e9 |
children | 1830386684a0 |
rev | line source |
---|---|
0 | 1 /* Tree inlining hooks and declarations. |
131 | 2 Copyright (C) 2001-2018 Free Software Foundation, Inc. |
0 | 3 Contributed by Alexandre Oliva <aoliva@redhat.com> |
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 GCC_TREE_INLINE_H | |
22 #define GCC_TREE_INLINE_H | |
23 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
24 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
25 struct cgraph_edge; |
0 | 26 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
27 /* Indicate the desired behavior wrt call graph edges. We can either |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
28 duplicate the edge (inlining, cloning), move the edge (versioning, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
29 parallelization), or move the edges of the clones (saving). */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
30 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
31 enum copy_body_cge_which |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
32 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
33 CB_CGE_DUPLICATE, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
34 CB_CGE_MOVE, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
35 CB_CGE_MOVE_CLONES |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
36 }; |
0 | 37 |
111 | 38 typedef int_hash <unsigned short, 0> dependence_hash; |
39 | |
0 | 40 /* Data required for function body duplication. */ |
41 | |
111 | 42 struct copy_body_data |
0 | 43 { |
44 /* FUNCTION_DECL for function being inlined, or in general the | |
45 source function providing the original trees. */ | |
46 tree src_fn; | |
47 | |
48 /* FUNCTION_DECL for function being inlined into, or in general | |
49 the destination function receiving the new trees. */ | |
50 tree dst_fn; | |
51 | |
52 /* Callgraph node of the source function. */ | |
53 struct cgraph_node *src_node; | |
54 | |
55 /* Callgraph node of the destination function. */ | |
56 struct cgraph_node *dst_node; | |
57 | |
58 /* struct function for function being inlined. Usually this is the same | |
59 as DECL_STRUCT_FUNCTION (src_fn), but can be different if saved_cfg | |
60 and saved_eh are in use. */ | |
61 struct function *src_cfun; | |
62 | |
63 /* The VAR_DECL for the return value. */ | |
64 tree retvar; | |
65 | |
111 | 66 /* Assign statements that need bounds copy. */ |
67 vec<gimple *> assign_stmts; | |
68 | |
0 | 69 /* The map from local declarations in the inlined function to |
70 equivalents in the function into which it is being inlined. */ | |
111 | 71 hash_map<tree, tree> *decl_map; |
0 | 72 |
73 /* Create a new decl to replace DECL in the destination function. */ | |
74 tree (*copy_decl) (tree, struct copy_body_data *); | |
75 | |
76 /* Current BLOCK. */ | |
77 tree block; | |
78 | |
79 /* GIMPLE_CALL if va arg parameter packs should be expanded or NULL | |
80 is not. */ | |
111 | 81 gcall *call_stmt; |
0 | 82 |
131 | 83 /* > 0 if we are remapping a type currently. */ |
84 int remapping_type_depth; | |
85 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
86 /* Exception landing pad the inlined call lies in. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
87 int eh_lp_nr; |
0 | 88 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
89 /* Maps region and landing pad structures from the function being copied |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
90 to duplicates created within the function we inline into. */ |
111 | 91 hash_map<void *, void *> *eh_map; |
0 | 92 |
93 /* We use the same mechanism do all sorts of different things. Rather | |
94 than enumerating the different cases, we categorize the behavior | |
95 in the various situations. */ | |
96 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
97 /* What to do with call graph edges. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
98 enum copy_body_cge_which transform_call_graph_edges; |
0 | 99 |
100 /* True if a new CFG should be created. False for inlining, true for | |
101 everything else. */ | |
102 bool transform_new_cfg; | |
103 | |
104 /* True if RETURN_EXPRs should be transformed to just the contained | |
105 MODIFY_EXPR. The branch semantics of the return will be handled | |
106 by manipulating the CFG rather than a statement. */ | |
107 bool transform_return_to_modify; | |
108 | |
111 | 109 /* True if the parameters of the source function are transformed. |
110 Only true for inlining. */ | |
111 bool transform_parameter; | |
112 | |
0 | 113 /* True if this statement will need to be regimplified. */ |
114 bool regimplify; | |
115 | |
131 | 116 /* True if trees may not be unshared. */ |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
117 bool do_not_unshare; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
118 |
131 | 119 /* True if new declarations may not be created during type remapping. */ |
120 bool prevent_decl_creation_for_types; | |
121 | |
122 /* True if the location information will need to be reset. */ | |
123 bool reset_location; | |
0 | 124 |
125 /* A function to be called when duplicating BLOCK nodes. */ | |
126 void (*transform_lang_insert_block) (tree); | |
127 | |
128 /* Statements that might be possibly folded. */ | |
111 | 129 hash_set<gimple *> *statements_to_fold; |
0 | 130 |
131 /* Entry basic block to currently copied body. */ | |
111 | 132 basic_block entry_bb; |
133 | |
134 /* For partial function versioning, bitmap of bbs to be copied, | |
135 otherwise NULL. */ | |
136 bitmap blocks_to_copy; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
137 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
138 /* Debug statements that need processing. */ |
111 | 139 vec<gdebug *> debug_stmts; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
140 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
141 /* A map from local declarations in the inlined function to |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
142 equivalents in the function into which it is being inlined, where |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
143 the originals have been mapped to a value rather than to a |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
144 variable. */ |
111 | 145 hash_map<tree, tree> *debug_map; |
146 | |
147 /* A map from the inlined functions dependence info cliques to | |
148 equivalents in the function into which it is being inlined. */ | |
149 hash_map<dependence_hash, unsigned short> *dependence_map; | |
150 | |
151 /* A list of addressable local variables remapped into the caller | |
152 when inlining a call within an OpenMP SIMD-on-SIMT loop. */ | |
153 vec<tree> *dst_simt_vars; | |
154 }; | |
0 | 155 |
156 /* Weights of constructions for estimate_num_insns. */ | |
157 | |
111 | 158 struct eni_weights |
0 | 159 { |
160 /* Cost per call. */ | |
161 unsigned call_cost; | |
162 | |
111 | 163 /* Cost per indirect call. */ |
164 unsigned indirect_call_cost; | |
165 | |
0 | 166 /* Cost per call to a target specific builtin */ |
167 unsigned target_builtin_call_cost; | |
168 | |
169 /* Cost of "expensive" div and mod operations. */ | |
170 unsigned div_mod_cost; | |
171 | |
172 /* Cost for omp construct. */ | |
173 unsigned omp_cost; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
174 |
111 | 175 /* Cost for tm transaction. */ |
176 unsigned tm_cost; | |
177 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
178 /* Cost of return. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
179 unsigned return_cost; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
180 |
111 | 181 /* True when time of statement should be estimated. Thus, the |
182 cost of a switch statement is logarithmic rather than linear in number | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
183 of cases. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
184 bool time_based; |
111 | 185 }; |
0 | 186 |
187 /* Weights that estimate_num_insns uses for heuristics in inlining. */ | |
188 | |
189 extern eni_weights eni_inlining_weights; | |
190 | |
191 /* Weights that estimate_num_insns uses to estimate the size of the | |
192 produced code. */ | |
193 | |
194 extern eni_weights eni_size_weights; | |
195 | |
196 /* Weights that estimate_num_insns uses to estimate the time necessary | |
197 to execute the produced code. */ | |
198 | |
199 extern eni_weights eni_time_weights; | |
200 | |
201 /* Function prototypes. */ | |
111 | 202 void init_inline_once (void); |
0 | 203 extern tree copy_tree_body_r (tree *, int *, void *); |
204 extern void insert_decl_map (copy_body_data *, tree, tree); | |
205 unsigned int optimize_inline_calls (tree); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
206 tree maybe_inline_call_in_expr (tree); |
0 | 207 bool tree_inlinable_function_p (tree); |
208 tree copy_tree_r (tree *, int *, void *); | |
209 tree copy_decl_no_change (tree decl, copy_body_data *id); | |
111 | 210 int estimate_move_cost (tree type, bool); |
211 int estimate_num_insns (gimple *, eni_weights *); | |
0 | 212 int estimate_num_insns_fn (tree, eni_weights *); |
111 | 213 int estimate_num_insns_seq (gimple_seq, eni_weights *); |
0 | 214 bool tree_versionable_function_p (tree); |
215 extern tree remap_decl (tree decl, copy_body_data *id); | |
216 extern tree remap_type (tree type, copy_body_data *id); | |
217 extern gimple_seq copy_gimple_seq_and_replace_locals (gimple_seq seq); | |
111 | 218 extern bool debug_find_tree (tree, tree); |
219 extern tree copy_fn (tree, tree&, tree&); | |
220 extern const char *copy_forbidden (struct function *fun); | |
221 extern tree copy_decl_for_dup_finish (copy_body_data *id, tree decl, tree copy); | |
0 | 222 |
111 | 223 /* This is in tree-inline.c since the routine uses |
224 data structures from the inliner. */ | |
225 extern tree build_duplicate_type (tree); | |
0 | 226 |
227 #endif /* GCC_TREE_INLINE_H */ |