Mercurial > hg > CbC > CbC_gcc
annotate gcc/tree-inline.h @ 158:494b0b89df80 default tip
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 18:13:55 +0900 |
parents | 1830386684a0 |
children |
rev | line source |
---|---|
0 | 1 /* Tree inlining hooks and declarations. |
145 | 2 Copyright (C) 2001-2020 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 | |
66 /* The map from local declarations in the inlined function to | |
67 equivalents in the function into which it is being inlined. */ | |
111 | 68 hash_map<tree, tree> *decl_map; |
0 | 69 |
70 /* Create a new decl to replace DECL in the destination function. */ | |
71 tree (*copy_decl) (tree, struct copy_body_data *); | |
72 | |
73 /* Current BLOCK. */ | |
74 tree block; | |
75 | |
76 /* GIMPLE_CALL if va arg parameter packs should be expanded or NULL | |
77 is not. */ | |
111 | 78 gcall *call_stmt; |
0 | 79 |
131 | 80 /* > 0 if we are remapping a type currently. */ |
81 int remapping_type_depth; | |
82 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
83 /* 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
|
84 int eh_lp_nr; |
0 | 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 /* 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
|
87 to duplicates created within the function we inline into. */ |
111 | 88 hash_map<void *, void *> *eh_map; |
0 | 89 |
90 /* We use the same mechanism do all sorts of different things. Rather | |
91 than enumerating the different cases, we categorize the behavior | |
92 in the various situations. */ | |
93 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
94 /* 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
|
95 enum copy_body_cge_which transform_call_graph_edges; |
0 | 96 |
97 /* True if a new CFG should be created. False for inlining, true for | |
98 everything else. */ | |
99 bool transform_new_cfg; | |
100 | |
101 /* True if RETURN_EXPRs should be transformed to just the contained | |
102 MODIFY_EXPR. The branch semantics of the return will be handled | |
103 by manipulating the CFG rather than a statement. */ | |
104 bool transform_return_to_modify; | |
105 | |
111 | 106 /* True if the parameters of the source function are transformed. |
107 Only true for inlining. */ | |
108 bool transform_parameter; | |
109 | |
0 | 110 /* True if this statement will need to be regimplified. */ |
111 bool regimplify; | |
112 | |
131 | 113 /* 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
|
114 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
|
115 |
145 | 116 /* True if trees should not be folded during the copying. */ |
117 bool do_not_fold; | |
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 |
145 | 125 /* Replace error_mark_node as upper bound of array types with |
126 an uninitialized VAR_DECL temporary. */ | |
127 bool adjust_array_error_bounds; | |
128 | |
129 /* Usually copy_decl callback always creates new decls, in that case | |
130 we want to remap all variably_modified_type_p types. If this flag | |
131 is set, remap_type will do further checks to see if remap_decl | |
132 of any decls mentioned in the type will remap to anything but itself | |
133 and only in that case will actually remap the type. */ | |
134 bool dont_remap_vla_if_no_change; | |
135 | |
0 | 136 /* A function to be called when duplicating BLOCK nodes. */ |
137 void (*transform_lang_insert_block) (tree); | |
138 | |
139 /* Statements that might be possibly folded. */ | |
111 | 140 hash_set<gimple *> *statements_to_fold; |
0 | 141 |
142 /* Entry basic block to currently copied body. */ | |
111 | 143 basic_block entry_bb; |
144 | |
145 /* For partial function versioning, bitmap of bbs to be copied, | |
146 otherwise NULL. */ | |
147 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
|
148 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
149 /* Debug statements that need processing. */ |
111 | 150 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
|
151 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
152 /* 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
|
153 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
|
154 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
|
155 variable. */ |
111 | 156 hash_map<tree, tree> *debug_map; |
157 | |
158 /* A map from the inlined functions dependence info cliques to | |
159 equivalents in the function into which it is being inlined. */ | |
160 hash_map<dependence_hash, unsigned short> *dependence_map; | |
161 | |
162 /* A list of addressable local variables remapped into the caller | |
163 when inlining a call within an OpenMP SIMD-on-SIMT loop. */ | |
164 vec<tree> *dst_simt_vars; | |
145 | 165 |
166 /* Basic block to which clobbers for local variables from the inline | |
167 function that need to live in memory should be added. */ | |
168 basic_block eh_landing_pad_dest; | |
169 | |
170 /* If clobbers for local variables from the inline function | |
171 that need to live in memory should be added to EH landing pads | |
172 outside of the inlined function, this should be the number | |
173 of basic blocks in the caller before inlining. Zero otherwise. */ | |
174 int add_clobbers_to_eh_landing_pads; | |
175 | |
176 /* Class managing changes to function parameters and return value planned | |
177 during IPA stage. */ | |
178 class ipa_param_body_adjustments *param_body_adjs; | |
179 | |
180 /* Hash set of SSA names that have been killed during call graph edge | |
181 redirection and should not be introduced into debug statements or NULL if no | |
182 SSA_NAME was deleted during redirections happened. */ | |
183 hash_set <tree> *killed_new_ssa_names; | |
111 | 184 }; |
0 | 185 |
186 /* Weights of constructions for estimate_num_insns. */ | |
187 | |
111 | 188 struct eni_weights |
0 | 189 { |
190 /* Cost per call. */ | |
191 unsigned call_cost; | |
192 | |
111 | 193 /* Cost per indirect call. */ |
194 unsigned indirect_call_cost; | |
195 | |
0 | 196 /* Cost per call to a target specific builtin */ |
197 unsigned target_builtin_call_cost; | |
198 | |
199 /* Cost of "expensive" div and mod operations. */ | |
200 unsigned div_mod_cost; | |
201 | |
202 /* Cost for omp construct. */ | |
203 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
|
204 |
111 | 205 /* Cost for tm transaction. */ |
206 unsigned tm_cost; | |
207 | |
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
|
208 /* 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
|
209 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
|
210 |
111 | 211 /* True when time of statement should be estimated. Thus, the |
212 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
|
213 of cases. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
214 bool time_based; |
111 | 215 }; |
0 | 216 |
217 /* Weights that estimate_num_insns uses for heuristics in inlining. */ | |
218 | |
219 extern eni_weights eni_inlining_weights; | |
220 | |
221 /* Weights that estimate_num_insns uses to estimate the size of the | |
222 produced code. */ | |
223 | |
224 extern eni_weights eni_size_weights; | |
225 | |
226 /* Weights that estimate_num_insns uses to estimate the time necessary | |
227 to execute the produced code. */ | |
228 | |
229 extern eni_weights eni_time_weights; | |
230 | |
231 /* Function prototypes. */ | |
111 | 232 void init_inline_once (void); |
0 | 233 extern tree copy_tree_body_r (tree *, int *, void *); |
234 extern void insert_decl_map (copy_body_data *, tree, tree); | |
235 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
|
236 tree maybe_inline_call_in_expr (tree); |
0 | 237 bool tree_inlinable_function_p (tree); |
238 tree copy_tree_r (tree *, int *, void *); | |
239 tree copy_decl_no_change (tree decl, copy_body_data *id); | |
111 | 240 int estimate_move_cost (tree type, bool); |
241 int estimate_num_insns (gimple *, eni_weights *); | |
0 | 242 int estimate_num_insns_fn (tree, eni_weights *); |
111 | 243 int estimate_num_insns_seq (gimple_seq, eni_weights *); |
0 | 244 bool tree_versionable_function_p (tree); |
245 extern tree remap_decl (tree decl, copy_body_data *id); | |
246 extern tree remap_type (tree type, copy_body_data *id); | |
247 extern gimple_seq copy_gimple_seq_and_replace_locals (gimple_seq seq); | |
111 | 248 extern bool debug_find_tree (tree, tree); |
249 extern tree copy_fn (tree, tree&, tree&); | |
250 extern const char *copy_forbidden (struct function *fun); | |
251 extern tree copy_decl_for_dup_finish (copy_body_data *id, tree decl, tree copy); | |
145 | 252 extern tree copy_decl_to_var (tree, copy_body_data *); |
253 extern tree force_value_to_type (tree type, tree value); | |
0 | 254 |
111 | 255 /* This is in tree-inline.c since the routine uses |
256 data structures from the inliner. */ | |
257 extern tree build_duplicate_type (tree); | |
0 | 258 |
259 #endif /* GCC_TREE_INLINE_H */ |