Mercurial > hg > CbC > CbC_gcc
annotate gcc/tree-inline.h @ 120:f93fa5091070
fix conv1.c
author | mir3636 |
---|---|
date | Thu, 08 Mar 2018 14:53:42 +0900 |
parents | 04ced10e8804 |
children | 84e7813d76e9 |
rev | line source |
---|---|
0 | 1 /* Tree inlining hooks and declarations. |
111 | 2 Copyright (C) 2001-2017 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 /* The VAR_DECL for the return bounds. */ |
67 tree retbnd; | |
68 | |
69 /* Assign statements that need bounds copy. */ | |
70 vec<gimple *> assign_stmts; | |
71 | |
0 | 72 /* The map from local declarations in the inlined function to |
73 equivalents in the function into which it is being inlined. */ | |
111 | 74 hash_map<tree, tree> *decl_map; |
0 | 75 |
76 /* Create a new decl to replace DECL in the destination function. */ | |
77 tree (*copy_decl) (tree, struct copy_body_data *); | |
78 | |
79 /* Current BLOCK. */ | |
80 tree block; | |
81 | |
82 /* GIMPLE_CALL if va arg parameter packs should be expanded or NULL | |
83 is not. */ | |
111 | 84 gcall *call_stmt; |
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 /* 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 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
116 /* True if trees should not be unshared. */ |
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 |
0 | 119 /* > 0 if we are remapping a type currently. */ |
120 int remapping_type_depth; | |
121 | |
122 /* A function to be called when duplicating BLOCK nodes. */ | |
123 void (*transform_lang_insert_block) (tree); | |
124 | |
125 /* Statements that might be possibly folded. */ | |
111 | 126 hash_set<gimple *> *statements_to_fold; |
0 | 127 |
128 /* Entry basic block to currently copied body. */ | |
111 | 129 basic_block entry_bb; |
130 | |
131 /* For partial function versioning, bitmap of bbs to be copied, | |
132 otherwise NULL. */ | |
133 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
|
134 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
135 /* Debug statements that need processing. */ |
111 | 136 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
|
137 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
138 /* 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
|
139 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
|
140 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
|
141 variable. */ |
111 | 142 hash_map<tree, tree> *debug_map; |
143 | |
144 /* A map from the inlined functions dependence info cliques to | |
145 equivalents in the function into which it is being inlined. */ | |
146 hash_map<dependence_hash, unsigned short> *dependence_map; | |
147 | |
148 /* A list of addressable local variables remapped into the caller | |
149 when inlining a call within an OpenMP SIMD-on-SIMT loop. */ | |
150 vec<tree> *dst_simt_vars; | |
151 | |
152 /* Cilk keywords currently need to replace some variables that | |
153 ordinary nested functions do not. */ | |
154 bool remap_var_for_cilk; | |
155 | |
156 /* Do not create new declarations when within type remapping. */ | |
157 bool prevent_decl_creation_for_types; | |
158 }; | |
0 | 159 |
160 /* Weights of constructions for estimate_num_insns. */ | |
161 | |
111 | 162 struct eni_weights |
0 | 163 { |
164 /* Cost per call. */ | |
165 unsigned call_cost; | |
166 | |
111 | 167 /* Cost per indirect call. */ |
168 unsigned indirect_call_cost; | |
169 | |
0 | 170 /* Cost per call to a target specific builtin */ |
171 unsigned target_builtin_call_cost; | |
172 | |
173 /* Cost of "expensive" div and mod operations. */ | |
174 unsigned div_mod_cost; | |
175 | |
176 /* Cost for omp construct. */ | |
177 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
|
178 |
111 | 179 /* Cost for tm transaction. */ |
180 unsigned tm_cost; | |
181 | |
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
|
182 /* 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
|
183 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
|
184 |
111 | 185 /* True when time of statement should be estimated. Thus, the |
186 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
|
187 of cases. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
188 bool time_based; |
111 | 189 }; |
0 | 190 |
191 /* Weights that estimate_num_insns uses for heuristics in inlining. */ | |
192 | |
193 extern eni_weights eni_inlining_weights; | |
194 | |
195 /* Weights that estimate_num_insns uses to estimate the size of the | |
196 produced code. */ | |
197 | |
198 extern eni_weights eni_size_weights; | |
199 | |
200 /* Weights that estimate_num_insns uses to estimate the time necessary | |
201 to execute the produced code. */ | |
202 | |
203 extern eni_weights eni_time_weights; | |
204 | |
205 /* Function prototypes. */ | |
111 | 206 void init_inline_once (void); |
0 | 207 extern tree copy_tree_body_r (tree *, int *, void *); |
208 extern void insert_decl_map (copy_body_data *, tree, tree); | |
209 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
|
210 tree maybe_inline_call_in_expr (tree); |
0 | 211 bool tree_inlinable_function_p (tree); |
212 tree copy_tree_r (tree *, int *, void *); | |
213 tree copy_decl_no_change (tree decl, copy_body_data *id); | |
111 | 214 int estimate_move_cost (tree type, bool); |
215 int estimate_num_insns (gimple *, eni_weights *); | |
0 | 216 int estimate_num_insns_fn (tree, eni_weights *); |
111 | 217 int estimate_num_insns_seq (gimple_seq, eni_weights *); |
0 | 218 bool tree_versionable_function_p (tree); |
219 extern tree remap_decl (tree decl, copy_body_data *id); | |
220 extern tree remap_type (tree type, copy_body_data *id); | |
221 extern gimple_seq copy_gimple_seq_and_replace_locals (gimple_seq seq); | |
111 | 222 extern bool debug_find_tree (tree, tree); |
223 extern tree copy_fn (tree, tree&, tree&); | |
224 extern const char *copy_forbidden (struct function *fun); | |
225 extern tree copy_decl_for_dup_finish (copy_body_data *id, tree decl, tree copy); | |
0 | 226 |
111 | 227 /* This is in tree-inline.c since the routine uses |
228 data structures from the inliner. */ | |
229 extern tree build_duplicate_type (tree); | |
0 | 230 |
231 #endif /* GCC_TREE_INLINE_H */ |