Mercurial > hg > CbC > CbC_gcc
annotate gcc/passes.c @ 56:3c8a44c06a95
Added tag gcc-4.4.5 for changeset 77e2b8dfacca
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 12 Feb 2010 23:41:23 +0900 |
parents | 77e2b8dfacca |
children | 326d9e06c2e3 b7f97abdc517 |
rev | line source |
---|---|
0 | 1 /* Top level of GCC compilers (cc1, cc1plus, etc.) |
2 Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, | |
3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 | |
4 Free Software Foundation, Inc. | |
5 | |
6 This file is part of GCC. | |
7 | |
8 GCC is free software; you can redistribute it and/or modify it under | |
9 the terms of the GNU General Public License as published by the Free | |
10 Software Foundation; either version 3, or (at your option) any later | |
11 version. | |
12 | |
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
19 along with GCC; see the file COPYING3. If not see | |
20 <http://www.gnu.org/licenses/>. */ | |
21 | |
22 /* This is the top level of cc1/c++. | |
23 It parses command args, opens files, invokes the various passes | |
24 in the proper order, and counts the time used by each. | |
25 Error messages and low-level interface to malloc also handled here. */ | |
26 | |
27 #include "config.h" | |
28 #undef FLOAT /* This is for hpux. They should change hpux. */ | |
29 #undef FFS /* Some systems define this in param.h. */ | |
30 #include "system.h" | |
31 #include "coretypes.h" | |
32 #include "tm.h" | |
33 #include <signal.h> | |
34 | |
35 #ifdef HAVE_SYS_RESOURCE_H | |
36 # include <sys/resource.h> | |
37 #endif | |
38 | |
39 #ifdef HAVE_SYS_TIMES_H | |
40 # include <sys/times.h> | |
41 #endif | |
42 | |
43 #include "line-map.h" | |
44 #include "input.h" | |
45 #include "tree.h" | |
46 #include "rtl.h" | |
47 #include "tm_p.h" | |
48 #include "flags.h" | |
49 #include "insn-attr.h" | |
50 #include "insn-config.h" | |
51 #include "insn-flags.h" | |
52 #include "hard-reg-set.h" | |
53 #include "recog.h" | |
54 #include "output.h" | |
55 #include "except.h" | |
56 #include "function.h" | |
57 #include "toplev.h" | |
58 #include "expr.h" | |
59 #include "basic-block.h" | |
60 #include "intl.h" | |
61 #include "ggc.h" | |
62 #include "graph.h" | |
63 #include "regs.h" | |
64 #include "timevar.h" | |
65 #include "diagnostic.h" | |
66 #include "params.h" | |
67 #include "reload.h" | |
68 #include "dwarf2asm.h" | |
69 #include "integrate.h" | |
70 #include "real.h" | |
71 #include "debug.h" | |
72 #include "target.h" | |
73 #include "langhooks.h" | |
74 #include "cfglayout.h" | |
75 #include "cfgloop.h" | |
76 #include "hosthooks.h" | |
77 #include "cgraph.h" | |
78 #include "opts.h" | |
79 #include "coverage.h" | |
80 #include "value-prof.h" | |
81 #include "tree-inline.h" | |
82 #include "tree-flow.h" | |
83 #include "tree-pass.h" | |
84 #include "tree-dump.h" | |
85 #include "df.h" | |
86 #include "predict.h" | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
87 #include "lto-streamer.h" |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
88 #include "plugin.h" |
0 | 89 |
90 #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO) | |
91 #include "dwarf2out.h" | |
92 #endif | |
93 | |
94 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO) | |
95 #include "dbxout.h" | |
96 #endif | |
97 | |
98 #ifdef SDB_DEBUGGING_INFO | |
99 #include "sdbout.h" | |
100 #endif | |
101 | |
102 #ifdef XCOFF_DEBUGGING_INFO | |
103 #include "xcoffout.h" /* Needed for external data | |
104 declarations for e.g. AIX 4.x. */ | |
105 #endif | |
106 | |
107 /* This is used for debugging. It allows the current pass to printed | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
108 from anywhere in compilation. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
109 The variable current_pass is also used for statistics and plugins. */ |
0 | 110 struct opt_pass *current_pass; |
111 | |
112 /* Call from anywhere to find out what pass this is. Useful for | |
113 printing out debugging information deep inside an service | |
114 routine. */ | |
115 void | |
116 print_current_pass (FILE *file) | |
117 { | |
118 if (current_pass) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
119 fprintf (file, "current pass = %s (%d)\n", |
0 | 120 current_pass->name, current_pass->static_pass_number); |
121 else | |
122 fprintf (file, "no current pass.\n"); | |
123 } | |
124 | |
125 | |
126 /* Call from the debugger to get the current pass name. */ | |
127 void | |
128 debug_pass (void) | |
129 { | |
130 print_current_pass (stderr); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
131 } |
0 | 132 |
133 | |
134 | |
135 /* Global variables used to communicate with passes. */ | |
136 int dump_flags; | |
137 bool in_gimple_form; | |
138 bool first_pass_instance; | |
139 | |
140 | |
141 /* This is called from various places for FUNCTION_DECL, VAR_DECL, | |
142 and TYPE_DECL nodes. | |
143 | |
144 This does nothing for local (non-static) variables, unless the | |
145 variable is a register variable with DECL_ASSEMBLER_NAME set. In | |
146 that case, or if the variable is not an automatic, it sets up the | |
147 RTL and outputs any assembler code (label definition, storage | |
148 allocation and initialization). | |
149 | |
150 DECL is the declaration. TOP_LEVEL is nonzero | |
151 if this declaration is not within a function. */ | |
152 | |
153 void | |
154 rest_of_decl_compilation (tree decl, | |
155 int top_level, | |
156 int at_end) | |
157 { | |
158 /* We deferred calling assemble_alias so that we could collect | |
159 other attributes such as visibility. Emit the alias now. */ | |
160 { | |
161 tree alias; | |
162 alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl)); | |
163 if (alias) | |
164 { | |
165 alias = TREE_VALUE (TREE_VALUE (alias)); | |
166 alias = get_identifier (TREE_STRING_POINTER (alias)); | |
167 assemble_alias (decl, alias); | |
168 } | |
169 } | |
170 | |
171 /* Can't defer this, because it needs to happen before any | |
172 later function definitions are processed. */ | |
173 if (DECL_ASSEMBLER_NAME_SET_P (decl) && DECL_REGISTER (decl)) | |
174 make_decl_rtl (decl); | |
175 | |
176 /* Forward declarations for nested functions are not "external", | |
177 but we need to treat them as if they were. */ | |
178 if (TREE_STATIC (decl) || DECL_EXTERNAL (decl) | |
179 || TREE_CODE (decl) == FUNCTION_DECL) | |
180 { | |
181 timevar_push (TV_VARCONST); | |
182 | |
183 /* Don't output anything when a tentative file-scope definition | |
184 is seen. But at end of compilation, do output code for them. | |
185 | |
186 We do output all variables and rely on | |
187 callgraph code to defer them except for forward declarations | |
188 (see gcc.c-torture/compile/920624-1.c) */ | |
189 if ((at_end | |
190 || !DECL_DEFER_OUTPUT (decl) | |
191 || DECL_INITIAL (decl)) | |
192 && !DECL_EXTERNAL (decl)) | |
193 { | |
194 if (TREE_CODE (decl) != FUNCTION_DECL) | |
195 varpool_finalize_decl (decl); | |
196 else | |
197 assemble_variable (decl, top_level, at_end, 0); | |
198 } | |
199 | |
200 #ifdef ASM_FINISH_DECLARE_OBJECT | |
201 if (decl == last_assemble_variable_decl) | |
202 { | |
203 ASM_FINISH_DECLARE_OBJECT (asm_out_file, decl, | |
204 top_level, at_end); | |
205 } | |
206 #endif | |
207 | |
208 timevar_pop (TV_VARCONST); | |
209 } | |
210 else if (TREE_CODE (decl) == TYPE_DECL | |
211 /* Like in rest_of_type_compilation, avoid confusing the debug | |
212 information machinery when there are errors. */ | |
213 && !(sorrycount || errorcount)) | |
214 { | |
215 timevar_push (TV_SYMOUT); | |
216 debug_hooks->type_decl (decl, !top_level); | |
217 timevar_pop (TV_SYMOUT); | |
218 } | |
219 | |
220 /* Let cgraph know about the existence of variables. */ | |
221 if (TREE_CODE (decl) == VAR_DECL && !DECL_EXTERNAL (decl)) | |
222 varpool_node (decl); | |
223 } | |
224 | |
225 /* Called after finishing a record, union or enumeral type. */ | |
226 | |
227 void | |
228 rest_of_type_compilation (tree type, int toplev) | |
229 { | |
230 /* Avoid confusing the debug information machinery when there are | |
231 errors. */ | |
232 if (errorcount != 0 || sorrycount != 0) | |
233 return; | |
234 | |
235 timevar_push (TV_SYMOUT); | |
236 debug_hooks->type_decl (TYPE_STUB_DECL (type), !toplev); | |
237 timevar_pop (TV_SYMOUT); | |
238 } | |
239 | |
240 | |
241 | |
242 void | |
243 finish_optimization_passes (void) | |
244 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
245 int i; |
0 | 246 struct dump_file_info *dfi; |
247 char *name; | |
248 | |
249 timevar_push (TV_DUMP); | |
250 if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities) | |
251 { | |
252 dump_file = dump_begin (pass_profile.pass.static_pass_number, NULL); | |
253 end_branch_prob (); | |
254 if (dump_file) | |
255 dump_end (pass_profile.pass.static_pass_number, dump_file); | |
256 } | |
257 | |
258 if (optimize > 0) | |
259 { | |
260 dump_file = dump_begin (pass_combine.pass.static_pass_number, NULL); | |
261 if (dump_file) | |
262 { | |
263 dump_combine_total_stats (dump_file); | |
264 dump_end (pass_combine.pass.static_pass_number, dump_file); | |
265 } | |
266 } | |
267 | |
268 /* Do whatever is necessary to finish printing the graphs. */ | |
269 if (graph_dump_format != no_graph) | |
270 for (i = TDI_end; (dfi = get_dump_file_info (i)) != NULL; ++i) | |
271 if (dump_initialized_p (i) | |
272 && (dfi->flags & TDF_GRAPH) != 0 | |
273 && (name = get_dump_file_name (i)) != NULL) | |
274 { | |
275 finish_graph_dump_file (name); | |
276 free (name); | |
277 } | |
278 | |
279 timevar_pop (TV_DUMP); | |
280 } | |
281 | |
282 static bool | |
283 gate_rest_of_compilation (void) | |
284 { | |
285 /* Early return if there were errors. We can run afoul of our | |
286 consistency checks, and there's not really much point in fixing them. */ | |
287 return !(rtl_dump_and_exit || flag_syntax_only || errorcount || sorrycount); | |
288 } | |
289 | |
290 struct gimple_opt_pass pass_rest_of_compilation = | |
291 { | |
292 { | |
293 GIMPLE_PASS, | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
294 "*rest_of_compilation", /* name */ |
0 | 295 gate_rest_of_compilation, /* gate */ |
296 NULL, /* execute */ | |
297 NULL, /* sub */ | |
298 NULL, /* next */ | |
299 0, /* static_pass_number */ | |
300 TV_REST_OF_COMPILATION, /* tv_id */ | |
301 PROP_rtl, /* properties_required */ | |
302 0, /* properties_provided */ | |
303 0, /* properties_destroyed */ | |
304 0, /* todo_flags_start */ | |
305 TODO_ggc_collect /* todo_flags_finish */ | |
306 } | |
307 }; | |
308 | |
309 static bool | |
310 gate_postreload (void) | |
311 { | |
312 return reload_completed; | |
313 } | |
314 | |
315 struct rtl_opt_pass pass_postreload = | |
316 { | |
317 { | |
318 RTL_PASS, | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
319 "*all-postreload", /* name */ |
0 | 320 gate_postreload, /* gate */ |
321 NULL, /* execute */ | |
322 NULL, /* sub */ | |
323 NULL, /* next */ | |
324 0, /* static_pass_number */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
325 TV_NONE, /* tv_id */ |
0 | 326 PROP_rtl, /* properties_required */ |
327 0, /* properties_provided */ | |
328 0, /* properties_destroyed */ | |
329 0, /* todo_flags_start */ | |
330 TODO_ggc_collect | TODO_verify_rtl_sharing /* todo_flags_finish */ | |
331 } | |
332 }; | |
333 | |
334 | |
335 | |
336 /* The root of the compilation pass tree, once constructed. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
337 struct opt_pass *all_passes, *all_small_ipa_passes, *all_lowering_passes, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
338 *all_regular_ipa_passes, *all_lto_gen_passes; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
339 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
340 /* This is used by plugins, and should also be used in register_pass. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
341 #define DEF_PASS_LIST(LIST) &LIST, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
342 struct opt_pass **gcc_pass_lists[] = { GCC_PASS_LISTS NULL }; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
343 #undef DEF_PASS_LIST |
0 | 344 |
345 /* A map from static pass id to optimization pass. */ | |
346 struct opt_pass **passes_by_id; | |
347 int passes_by_id_size; | |
348 | |
349 /* Set the static pass number of pass PASS to ID and record that | |
350 in the mapping from static pass number to pass. */ | |
351 | |
352 static void | |
353 set_pass_for_id (int id, struct opt_pass *pass) | |
354 { | |
355 pass->static_pass_number = id; | |
356 if (passes_by_id_size <= id) | |
357 { | |
358 passes_by_id = XRESIZEVEC (struct opt_pass *, passes_by_id, id + 1); | |
359 memset (passes_by_id + passes_by_id_size, 0, | |
360 (id + 1 - passes_by_id_size) * sizeof (void *)); | |
361 passes_by_id_size = id + 1; | |
362 } | |
363 passes_by_id[id] = pass; | |
364 } | |
365 | |
366 /* Return the pass with the static pass number ID. */ | |
367 | |
368 struct opt_pass * | |
369 get_pass_for_id (int id) | |
370 { | |
371 if (id >= passes_by_id_size) | |
372 return NULL; | |
373 return passes_by_id[id]; | |
374 } | |
375 | |
376 /* Iterate over the pass tree allocating dump file numbers. We want | |
377 to do this depth first, and independent of whether the pass is | |
378 enabled or not. */ | |
379 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
380 void |
0 | 381 register_one_dump_file (struct opt_pass *pass) |
382 { | |
383 char *dot_name, *flag_name, *glob_name; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
384 const char *name, *prefix; |
0 | 385 char num[10]; |
386 int flags, id; | |
387 | |
388 /* See below in next_pass_1. */ | |
389 num[0] = '\0'; | |
390 if (pass->static_pass_number != -1) | |
391 sprintf (num, "%d", ((int) pass->static_pass_number < 0 | |
392 ? 1 : pass->static_pass_number)); | |
393 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
394 /* The name is both used to identify the pass for the purposes of plugins, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
395 and to specify dump file name and option. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
396 The latter two might want something short which is not quite unique; for |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
397 that reason, we may have a disambiguating prefix, followed by a space |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
398 to mark the start of the following dump file name / option string. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
399 name = strchr (pass->name, ' '); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
400 name = name ? name + 1 : pass->name; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
401 dot_name = concat (".", name, num, NULL); |
0 | 402 if (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS) |
403 prefix = "ipa-", flags = TDF_IPA; | |
404 else if (pass->type == GIMPLE_PASS) | |
405 prefix = "tree-", flags = TDF_TREE; | |
406 else | |
407 prefix = "rtl-", flags = TDF_RTL; | |
408 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
409 flag_name = concat (prefix, name, num, NULL); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
410 glob_name = concat (prefix, name, NULL); |
0 | 411 id = dump_register (dot_name, flag_name, glob_name, flags); |
412 set_pass_for_id (id, pass); | |
413 } | |
414 | |
415 /* Recursive worker function for register_dump_files. */ | |
416 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
417 static int |
0 | 418 register_dump_files_1 (struct opt_pass *pass, int properties) |
419 { | |
420 do | |
421 { | |
422 int new_properties = (properties | pass->properties_provided) | |
423 & ~pass->properties_destroyed; | |
424 | |
425 if (pass->name && pass->name[0] != '*') | |
426 register_one_dump_file (pass); | |
427 | |
428 if (pass->sub) | |
429 new_properties = register_dump_files_1 (pass->sub, new_properties); | |
430 | |
431 /* If we have a gate, combine the properties that we could have with | |
432 and without the pass being examined. */ | |
433 if (pass->gate) | |
434 properties &= new_properties; | |
435 else | |
436 properties = new_properties; | |
437 | |
438 pass = pass->next; | |
439 } | |
440 while (pass); | |
441 | |
442 return properties; | |
443 } | |
444 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
445 /* Register the dump files for the pipeline starting at PASS. |
0 | 446 PROPERTIES reflects the properties that are guaranteed to be available at |
447 the beginning of the pipeline. */ | |
448 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
449 static void |
0 | 450 register_dump_files (struct opt_pass *pass,int properties) |
451 { | |
452 pass->properties_required |= properties; | |
453 register_dump_files_1 (pass, properties); | |
454 } | |
455 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
456 /* Look at the static_pass_number and duplicate the pass |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
457 if it is already added to a list. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
458 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
459 static struct opt_pass * |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
460 make_pass_instance (struct opt_pass *pass, bool track_duplicates) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
461 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
462 /* A nonzero static_pass_number indicates that the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
463 pass is already in the list. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
464 if (pass->static_pass_number) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
465 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
466 struct opt_pass *new_pass; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
467 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
468 if (pass->type == GIMPLE_PASS |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
469 || pass->type == RTL_PASS |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
470 || pass->type == SIMPLE_IPA_PASS) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
471 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
472 new_pass = XNEW (struct opt_pass); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
473 memcpy (new_pass, pass, sizeof (struct opt_pass)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
474 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
475 else if (pass->type == IPA_PASS) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
476 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
477 new_pass = (struct opt_pass *)XNEW (struct ipa_opt_pass_d); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
478 memcpy (new_pass, pass, sizeof (struct ipa_opt_pass_d)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
479 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
480 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
481 gcc_unreachable (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
482 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
483 new_pass->next = NULL; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
484 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
485 new_pass->todo_flags_start &= ~TODO_mark_first_instance; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
486 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
487 /* Indicate to register_dump_files that this pass has duplicates, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
488 and so it should rename the dump file. The first instance will |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
489 be -1, and be number of duplicates = -static_pass_number - 1. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
490 Subsequent instances will be > 0 and just the duplicate number. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
491 if ((pass->name && pass->name[0] != '*') || track_duplicates) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
492 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
493 pass->static_pass_number -= 1; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
494 new_pass->static_pass_number = -pass->static_pass_number; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
495 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
496 return new_pass; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
497 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
498 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
499 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
500 pass->todo_flags_start |= TODO_mark_first_instance; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
501 pass->static_pass_number = -1; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
502 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
503 invoke_plugin_callbacks (PLUGIN_NEW_PASS, pass); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
504 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
505 return pass; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
506 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
507 |
0 | 508 /* Add a pass to the pass list. Duplicate the pass if it's already |
509 in the list. */ | |
510 | |
511 static struct opt_pass ** | |
512 next_pass_1 (struct opt_pass **list, struct opt_pass *pass) | |
513 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
514 /* Every pass should have a name so that plugins can refer to them. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
515 gcc_assert (pass->name != NULL); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
516 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
517 *list = make_pass_instance (pass, false); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
518 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
519 return &(*list)->next; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
520 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
521 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
522 /* List node for an inserted pass instance. We need to keep track of all |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
523 the newly-added pass instances (with 'added_pass_nodes' defined below) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
524 so that we can register their dump files after pass-positioning is finished. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
525 Registering dumping files needs to be post-processed or the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
526 static_pass_number of the opt_pass object would be modified and mess up |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
527 the dump file names of future pass instances to be added. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
528 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
529 struct pass_list_node |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
530 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
531 struct opt_pass *pass; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
532 struct pass_list_node *next; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
533 }; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
534 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
535 static struct pass_list_node *added_pass_nodes = NULL; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
536 static struct pass_list_node *prev_added_pass_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
537 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
538 /* Insert the pass at the proper position. Return true if the pass |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
539 is successfully added. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
540 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
541 NEW_PASS_INFO - new pass to be inserted |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
542 PASS_LIST - root of the pass list to insert the new pass to */ |
0 | 543 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
544 static bool |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
545 position_pass (struct register_pass_info *new_pass_info, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
546 struct opt_pass **pass_list) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
547 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
548 struct opt_pass *pass = *pass_list, *prev_pass = NULL; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
549 bool success = false; |
0 | 550 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
551 for ( ; pass; prev_pass = pass, pass = pass->next) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
552 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
553 /* Check if the current pass is of the same type as the new pass and |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
554 matches the name and the instance number of the reference pass. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
555 if (pass->type == new_pass_info->pass->type |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
556 && pass->name |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
557 && !strcmp (pass->name, new_pass_info->reference_pass_name) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
558 && ((new_pass_info->ref_pass_instance_number == 0) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
559 || (new_pass_info->ref_pass_instance_number == |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
560 pass->static_pass_number) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
561 || (new_pass_info->ref_pass_instance_number == 1 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
562 && pass->todo_flags_start & TODO_mark_first_instance))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
563 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
564 struct opt_pass *new_pass; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
565 struct pass_list_node *new_pass_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
566 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
567 new_pass = make_pass_instance (new_pass_info->pass, true); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
568 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
569 /* Insert the new pass instance based on the positioning op. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
570 switch (new_pass_info->pos_op) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
571 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
572 case PASS_POS_INSERT_AFTER: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
573 new_pass->next = pass->next; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
574 pass->next = new_pass; |
0 | 575 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
576 /* Skip newly inserted pass to avoid repeated |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
577 insertions in the case where the new pass and the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
578 existing one have the same name. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
579 pass = new_pass; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
580 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
581 case PASS_POS_INSERT_BEFORE: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
582 new_pass->next = pass; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
583 if (prev_pass) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
584 prev_pass->next = new_pass; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
585 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
586 *pass_list = new_pass; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
587 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
588 case PASS_POS_REPLACE: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
589 new_pass->next = pass->next; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
590 if (prev_pass) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
591 prev_pass->next = new_pass; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
592 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
593 *pass_list = new_pass; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
594 new_pass->sub = pass->sub; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
595 new_pass->tv_id = pass->tv_id; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
596 pass = new_pass; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
597 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
598 default: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
599 error ("Invalid pass positioning operation"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
600 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
601 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
602 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
603 /* Save the newly added pass (instance) in the added_pass_nodes |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
604 list so that we can register its dump file later. Note that |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
605 we cannot register the dump file now because doing so will modify |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
606 the static_pass_number of the opt_pass object and therefore |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
607 mess up the dump file name of future instances. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
608 new_pass_node = XCNEW (struct pass_list_node); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
609 new_pass_node->pass = new_pass; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
610 if (!added_pass_nodes) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
611 added_pass_nodes = new_pass_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
612 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
613 prev_added_pass_node->next = new_pass_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
614 prev_added_pass_node = new_pass_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
615 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
616 success = true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
617 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
618 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
619 if (pass->sub && position_pass (new_pass_info, &pass->sub)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
620 success = true; |
0 | 621 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
622 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
623 return success; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
624 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
625 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
626 /* Hooks a new pass into the pass lists. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
627 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
628 PASS_INFO - pass information that specifies the opt_pass object, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
629 reference pass, instance number, and how to position |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
630 the pass */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
631 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
632 void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
633 register_pass (struct register_pass_info *pass_info) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
634 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
635 /* The checks below could fail in buggy plugins. Existing GCC |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
636 passes should never fail these checks, so we mention plugin in |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
637 the messages. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
638 if (!pass_info->pass) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
639 fatal_error ("plugin cannot register a missing pass"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
640 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
641 if (!pass_info->pass->name) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
642 fatal_error ("plugin cannot register an unnamed pass"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
643 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
644 if (!pass_info->reference_pass_name) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
645 fatal_error |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
646 ("plugin cannot register pass %qs without reference pass name", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
647 pass_info->pass->name); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
648 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
649 /* Try to insert the new pass to the pass lists. We need to check |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
650 all three lists as the reference pass could be in one (or all) of |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
651 them. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
652 if (!position_pass (pass_info, &all_lowering_passes) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
653 && !position_pass (pass_info, &all_small_ipa_passes) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
654 && !position_pass (pass_info, &all_regular_ipa_passes) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
655 && !position_pass (pass_info, &all_lto_gen_passes) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
656 && !position_pass (pass_info, &all_passes)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
657 fatal_error |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
658 ("pass %qs not found but is referenced by new pass %qs", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
659 pass_info->reference_pass_name, pass_info->pass->name); |
0 | 660 else |
661 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
662 /* OK, we have successfully inserted the new pass. We need to register |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
663 the dump files for the newly added pass and its duplicates (if any). |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
664 Because the registration of plugin/backend passes happens after the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
665 command-line options are parsed, the options that specify single |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
666 pass dumping (e.g. -fdump-tree-PASSNAME) cannot be used for new |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
667 passes. Therefore we currently can only enable dumping of |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
668 new passes when the 'dump-all' flags (e.g. -fdump-tree-all) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
669 are specified. While doing so, we also delete the pass_list_node |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
670 objects created during pass positioning. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
671 while (added_pass_nodes) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
672 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
673 struct pass_list_node *next_node = added_pass_nodes->next; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
674 enum tree_dump_index tdi; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
675 register_one_dump_file (added_pass_nodes->pass); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
676 if (added_pass_nodes->pass->type == SIMPLE_IPA_PASS |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
677 || added_pass_nodes->pass->type == IPA_PASS) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
678 tdi = TDI_ipa_all; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
679 else if (added_pass_nodes->pass->type == GIMPLE_PASS) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
680 tdi = TDI_tree_all; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
681 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
682 tdi = TDI_rtl_all; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
683 /* Check if dump-all flag is specified. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
684 if (get_dump_file_info (tdi)->state) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
685 get_dump_file_info (added_pass_nodes->pass->static_pass_number) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
686 ->state = get_dump_file_info (tdi)->state; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
687 XDELETE (added_pass_nodes); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
688 added_pass_nodes = next_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
689 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
690 } |
0 | 691 } |
692 | |
693 /* Construct the pass tree. The sequencing of passes is driven by | |
694 the cgraph routines: | |
695 | |
696 cgraph_finalize_compilation_unit () | |
697 for each node N in the cgraph | |
698 cgraph_analyze_function (N) | |
699 cgraph_lower_function (N) -> all_lowering_passes | |
700 | |
701 If we are optimizing, cgraph_optimize is then invoked: | |
702 | |
703 cgraph_optimize () | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
704 ipa_passes () -> all_small_ipa_passes |
0 | 705 cgraph_expand_all_functions () |
706 for each node N in the cgraph | |
707 cgraph_expand_function (N) | |
708 tree_rest_of_compilation (DECL (N)) -> all_passes | |
709 */ | |
710 | |
711 void | |
712 init_optimization_passes (void) | |
713 { | |
714 struct opt_pass **p; | |
715 | |
716 #define NEXT_PASS(PASS) (p = next_pass_1 (p, &((PASS).pass))) | |
717 | |
718 /* All passes needed to lower the function into shape optimizers can | |
719 operate on. These passes are always run first on the function, but | |
720 backend might produce already lowered functions that are not processed | |
721 by these passes. */ | |
722 p = &all_lowering_passes; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
723 NEXT_PASS (pass_warn_unused_result); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
724 NEXT_PASS (pass_diagnose_omp_blocks); |
0 | 725 NEXT_PASS (pass_mudflap_1); |
726 NEXT_PASS (pass_lower_omp); | |
727 NEXT_PASS (pass_lower_cf); | |
728 NEXT_PASS (pass_refactor_eh); | |
729 NEXT_PASS (pass_lower_eh); | |
730 NEXT_PASS (pass_build_cfg); | |
731 NEXT_PASS (pass_lower_complex_O0); | |
732 NEXT_PASS (pass_lower_vector); | |
733 NEXT_PASS (pass_warn_function_return); | |
734 NEXT_PASS (pass_build_cgraph_edges); | |
735 NEXT_PASS (pass_inline_parameters); | |
736 *p = NULL; | |
737 | |
738 /* Interprocedural optimization passes. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
739 p = &all_small_ipa_passes; |
0 | 740 NEXT_PASS (pass_ipa_function_and_variable_visibility); |
741 NEXT_PASS (pass_ipa_early_inline); | |
742 { | |
743 struct opt_pass **p = &pass_ipa_early_inline.pass.sub; | |
744 NEXT_PASS (pass_early_inline); | |
745 NEXT_PASS (pass_inline_parameters); | |
746 NEXT_PASS (pass_rebuild_cgraph_edges); | |
747 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
748 NEXT_PASS (pass_ipa_free_lang_data); |
0 | 749 NEXT_PASS (pass_early_local_passes); |
750 { | |
751 struct opt_pass **p = &pass_early_local_passes.pass.sub; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
752 NEXT_PASS (pass_fixup_cfg); |
0 | 753 NEXT_PASS (pass_tree_profile); |
754 NEXT_PASS (pass_cleanup_cfg); | |
755 NEXT_PASS (pass_init_datastructures); | |
756 NEXT_PASS (pass_expand_omp); | |
757 | |
758 NEXT_PASS (pass_referenced_vars); | |
759 NEXT_PASS (pass_build_ssa); | |
760 NEXT_PASS (pass_early_warn_uninitialized); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
761 /* Note that it is not strictly necessary to schedule an early |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
762 inline pass here. However, some test cases (e.g., |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
763 g++.dg/other/p334435.C g++.dg/other/i386-1.C) expect extern |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
764 inline functions to be inlined even at -O0. This does not |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
765 happen during the first early inline pass. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
766 NEXT_PASS (pass_rebuild_cgraph_edges); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
767 NEXT_PASS (pass_early_inline); |
0 | 768 NEXT_PASS (pass_all_early_optimizations); |
769 { | |
770 struct opt_pass **p = &pass_all_early_optimizations.pass.sub; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
771 NEXT_PASS (pass_remove_cgraph_callee_edges); |
0 | 772 NEXT_PASS (pass_rename_ssa_copies); |
773 NEXT_PASS (pass_ccp); | |
774 NEXT_PASS (pass_forwprop); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
775 /* pass_build_ealias is a dummy pass that ensures that we |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
776 execute TODO_rebuild_alias at this point. Re-building |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
777 alias information also rewrites no longer addressed |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
778 locals into SSA form if possible. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
779 NEXT_PASS (pass_build_ealias); |
0 | 780 NEXT_PASS (pass_sra_early); |
781 NEXT_PASS (pass_copy_prop); | |
782 NEXT_PASS (pass_merge_phi); | |
783 NEXT_PASS (pass_cd_dce); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
784 NEXT_PASS (pass_early_ipa_sra); |
0 | 785 NEXT_PASS (pass_tail_recursion); |
786 NEXT_PASS (pass_convert_switch); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
787 NEXT_PASS (pass_cleanup_eh); |
0 | 788 NEXT_PASS (pass_profile); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
789 NEXT_PASS (pass_local_pure_const); |
0 | 790 } |
791 NEXT_PASS (pass_release_ssa_names); | |
792 NEXT_PASS (pass_rebuild_cgraph_edges); | |
793 NEXT_PASS (pass_inline_parameters); | |
794 } | |
795 NEXT_PASS (pass_ipa_increase_alignment); | |
796 NEXT_PASS (pass_ipa_matrix_reorg); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
797 *p = NULL; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
798 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
799 p = &all_regular_ipa_passes; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
800 NEXT_PASS (pass_ipa_whole_program_visibility); |
0 | 801 NEXT_PASS (pass_ipa_cp); |
802 NEXT_PASS (pass_ipa_inline); | |
803 NEXT_PASS (pass_ipa_reference); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
804 NEXT_PASS (pass_ipa_pure_const); |
0 | 805 NEXT_PASS (pass_ipa_type_escape); |
806 NEXT_PASS (pass_ipa_pta); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
807 NEXT_PASS (pass_ipa_struct_reorg); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
808 *p = NULL; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
809 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
810 p = &all_lto_gen_passes; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
811 NEXT_PASS (pass_ipa_lto_gimple_out); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
812 NEXT_PASS (pass_ipa_lto_wpa_fixup); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
813 NEXT_PASS (pass_ipa_lto_finish_out); /* This must be the last LTO pass. */ |
0 | 814 *p = NULL; |
815 | |
816 /* These passes are run after IPA passes on every function that is being | |
817 output to the assembler file. */ | |
818 p = &all_passes; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
819 NEXT_PASS (pass_lower_eh_dispatch); |
0 | 820 NEXT_PASS (pass_all_optimizations); |
821 { | |
822 struct opt_pass **p = &pass_all_optimizations.pass.sub; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
823 NEXT_PASS (pass_remove_cgraph_callee_edges); |
0 | 824 /* Initial scalar cleanups before alias computation. |
825 They ensure memory accesses are not indirect wherever possible. */ | |
826 NEXT_PASS (pass_strip_predict_hints); | |
827 NEXT_PASS (pass_update_address_taken); | |
828 NEXT_PASS (pass_rename_ssa_copies); | |
829 NEXT_PASS (pass_complete_unrolli); | |
830 NEXT_PASS (pass_ccp); | |
831 NEXT_PASS (pass_forwprop); | |
832 NEXT_PASS (pass_call_cdce); | |
833 /* pass_build_alias is a dummy pass that ensures that we | |
834 execute TODO_rebuild_alias at this point. Re-building | |
835 alias information also rewrites no longer addressed | |
836 locals into SSA form if possible. */ | |
837 NEXT_PASS (pass_build_alias); | |
838 NEXT_PASS (pass_return_slot); | |
839 NEXT_PASS (pass_phiprop); | |
840 NEXT_PASS (pass_fre); | |
841 NEXT_PASS (pass_copy_prop); | |
842 NEXT_PASS (pass_merge_phi); | |
843 NEXT_PASS (pass_vrp); | |
844 NEXT_PASS (pass_dce); | |
845 NEXT_PASS (pass_cselim); | |
846 NEXT_PASS (pass_tree_ifcombine); | |
847 NEXT_PASS (pass_phiopt); | |
848 NEXT_PASS (pass_tail_recursion); | |
849 NEXT_PASS (pass_ch); | |
850 NEXT_PASS (pass_stdarg); | |
851 NEXT_PASS (pass_lower_complex); | |
852 NEXT_PASS (pass_sra); | |
853 NEXT_PASS (pass_rename_ssa_copies); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
854 /* The dom pass will also resolve all __builtin_constant_p calls |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
855 that are still there to 0. This has to be done after some |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
856 propagations have already run, but before some more dead code |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
857 is removed, and this place fits nicely. Remember this when |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
858 trying to move or duplicate pass_dominator somewhere earlier. */ |
0 | 859 NEXT_PASS (pass_dominator); |
860 /* The only const/copy propagation opportunities left after | |
861 DOM should be due to degenerate PHI nodes. So rather than | |
862 run the full propagators, run a specialized pass which | |
863 only examines PHIs to discover const/copy propagation | |
864 opportunities. */ | |
865 NEXT_PASS (pass_phi_only_cprop); | |
866 NEXT_PASS (pass_dse); | |
867 NEXT_PASS (pass_reassoc); | |
868 NEXT_PASS (pass_dce); | |
869 NEXT_PASS (pass_forwprop); | |
870 NEXT_PASS (pass_phiopt); | |
871 NEXT_PASS (pass_object_sizes); | |
872 NEXT_PASS (pass_ccp); | |
873 NEXT_PASS (pass_copy_prop); | |
874 NEXT_PASS (pass_cse_sincos); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
875 NEXT_PASS (pass_optimize_bswap); |
0 | 876 NEXT_PASS (pass_split_crit_edges); |
877 NEXT_PASS (pass_pre); | |
878 NEXT_PASS (pass_sink_code); | |
879 NEXT_PASS (pass_tree_loop); | |
880 { | |
881 struct opt_pass **p = &pass_tree_loop.pass.sub; | |
882 NEXT_PASS (pass_tree_loop_init); | |
883 NEXT_PASS (pass_copy_prop); | |
884 NEXT_PASS (pass_dce_loop); | |
885 NEXT_PASS (pass_lim); | |
886 NEXT_PASS (pass_tree_unswitch); | |
887 NEXT_PASS (pass_scev_cprop); | |
888 NEXT_PASS (pass_record_bounds); | |
889 NEXT_PASS (pass_check_data_deps); | |
890 NEXT_PASS (pass_loop_distribution); | |
891 NEXT_PASS (pass_linear_transform); | |
892 NEXT_PASS (pass_graphite_transforms); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
893 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
894 struct opt_pass **p = &pass_graphite_transforms.pass.sub; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
895 NEXT_PASS (pass_dce_loop); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
896 NEXT_PASS (pass_lim); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
897 } |
0 | 898 NEXT_PASS (pass_iv_canon); |
899 NEXT_PASS (pass_if_conversion); | |
900 NEXT_PASS (pass_vectorize); | |
901 { | |
902 struct opt_pass **p = &pass_vectorize.pass.sub; | |
903 NEXT_PASS (pass_lower_vector_ssa); | |
904 NEXT_PASS (pass_dce_loop); | |
905 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
906 NEXT_PASS (pass_predcom); |
0 | 907 NEXT_PASS (pass_complete_unroll); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
908 NEXT_PASS (pass_slp_vectorize); |
0 | 909 NEXT_PASS (pass_parallelize_loops); |
910 NEXT_PASS (pass_loop_prefetch); | |
911 NEXT_PASS (pass_iv_optimize); | |
912 NEXT_PASS (pass_tree_loop_done); | |
913 } | |
914 NEXT_PASS (pass_cse_reciprocals); | |
915 NEXT_PASS (pass_reassoc); | |
916 NEXT_PASS (pass_vrp); | |
917 NEXT_PASS (pass_dominator); | |
918 /* The only const/copy propagation opportunities left after | |
919 DOM should be due to degenerate PHI nodes. So rather than | |
920 run the full propagators, run a specialized pass which | |
921 only examines PHIs to discover const/copy propagation | |
922 opportunities. */ | |
923 NEXT_PASS (pass_phi_only_cprop); | |
924 NEXT_PASS (pass_cd_dce); | |
925 NEXT_PASS (pass_tracer); | |
926 | |
927 /* FIXME: If DCE is not run before checking for uninitialized uses, | |
928 we may get false warnings (e.g., testsuite/gcc.dg/uninit-5.c). | |
929 However, this also causes us to misdiagnose cases that should be | |
930 real warnings (e.g., testsuite/gcc.dg/pr18501.c). | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
931 |
0 | 932 To fix the false positives in uninit-5.c, we would have to |
933 account for the predicates protecting the set and the use of each | |
934 variable. Using a representation like Gated Single Assignment | |
935 may help. */ | |
936 NEXT_PASS (pass_late_warn_uninitialized); | |
937 NEXT_PASS (pass_dse); | |
938 NEXT_PASS (pass_forwprop); | |
939 NEXT_PASS (pass_phiopt); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
940 NEXT_PASS (pass_fold_builtins); |
0 | 941 NEXT_PASS (pass_tail_calls); |
942 NEXT_PASS (pass_rename_ssa_copies); | |
943 NEXT_PASS (pass_uncprop); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
944 NEXT_PASS (pass_local_pure_const); |
0 | 945 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
946 NEXT_PASS (pass_cleanup_eh); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
947 NEXT_PASS (pass_lower_resx); |
0 | 948 NEXT_PASS (pass_nrv); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
949 NEXT_PASS (pass_mudflap_2); |
0 | 950 NEXT_PASS (pass_cleanup_cfg_post_optimizing); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
951 NEXT_PASS (pass_warn_function_noreturn); |
0 | 952 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
953 NEXT_PASS (pass_expand); |
0 | 954 |
955 NEXT_PASS (pass_rest_of_compilation); | |
956 { | |
957 struct opt_pass **p = &pass_rest_of_compilation.pass.sub; | |
958 NEXT_PASS (pass_init_function); | |
959 NEXT_PASS (pass_jump); | |
960 NEXT_PASS (pass_rtl_eh); | |
961 NEXT_PASS (pass_initial_value_sets); | |
962 NEXT_PASS (pass_unshare_all_rtl); | |
963 NEXT_PASS (pass_instantiate_virtual_regs); | |
964 NEXT_PASS (pass_into_cfg_layout_mode); | |
965 NEXT_PASS (pass_jump2); | |
966 NEXT_PASS (pass_lower_subreg); | |
967 NEXT_PASS (pass_df_initialize_opt); | |
968 NEXT_PASS (pass_cse); | |
969 NEXT_PASS (pass_rtl_fwprop); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
970 NEXT_PASS (pass_rtl_cprop); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
971 NEXT_PASS (pass_rtl_pre); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
972 NEXT_PASS (pass_rtl_hoist); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
973 NEXT_PASS (pass_rtl_cprop); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
974 NEXT_PASS (pass_rtl_store_motion); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
975 NEXT_PASS (pass_cse_after_global_opts); |
0 | 976 NEXT_PASS (pass_rtl_ifcvt); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
977 NEXT_PASS (pass_reginfo_init); |
0 | 978 /* Perform loop optimizations. It might be better to do them a bit |
979 sooner, but we want the profile feedback to work more | |
980 efficiently. */ | |
981 NEXT_PASS (pass_loop2); | |
982 { | |
983 struct opt_pass **p = &pass_loop2.pass.sub; | |
984 NEXT_PASS (pass_rtl_loop_init); | |
985 NEXT_PASS (pass_rtl_move_loop_invariants); | |
986 NEXT_PASS (pass_rtl_unswitch); | |
987 NEXT_PASS (pass_rtl_unroll_and_peel_loops); | |
988 NEXT_PASS (pass_rtl_doloop); | |
989 NEXT_PASS (pass_rtl_loop_done); | |
990 *p = NULL; | |
991 } | |
992 NEXT_PASS (pass_web); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
993 NEXT_PASS (pass_rtl_cprop); |
0 | 994 NEXT_PASS (pass_cse2); |
995 NEXT_PASS (pass_rtl_dse1); | |
996 NEXT_PASS (pass_rtl_fwprop_addr); | |
997 NEXT_PASS (pass_inc_dec); | |
998 NEXT_PASS (pass_initialize_regs); | |
999 NEXT_PASS (pass_ud_rtl_dce); | |
1000 NEXT_PASS (pass_combine); | |
1001 NEXT_PASS (pass_if_after_combine); | |
1002 NEXT_PASS (pass_partition_blocks); | |
1003 NEXT_PASS (pass_regmove); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1004 NEXT_PASS (pass_outof_cfg_layout_mode); |
0 | 1005 NEXT_PASS (pass_split_all_insns); |
1006 NEXT_PASS (pass_lower_subreg2); | |
1007 NEXT_PASS (pass_df_initialize_no_opt); | |
1008 NEXT_PASS (pass_stack_ptr_mod); | |
1009 NEXT_PASS (pass_mode_switching); | |
1010 NEXT_PASS (pass_match_asm_constraints); | |
1011 NEXT_PASS (pass_sms); | |
1012 NEXT_PASS (pass_sched); | |
1013 NEXT_PASS (pass_ira); | |
1014 NEXT_PASS (pass_postreload); | |
1015 { | |
1016 struct opt_pass **p = &pass_postreload.pass.sub; | |
1017 NEXT_PASS (pass_postreload_cse); | |
1018 NEXT_PASS (pass_gcse2); | |
1019 NEXT_PASS (pass_split_after_reload); | |
1020 NEXT_PASS (pass_branch_target_load_optimize1); | |
1021 NEXT_PASS (pass_thread_prologue_and_epilogue); | |
1022 NEXT_PASS (pass_rtl_dse2); | |
1023 NEXT_PASS (pass_stack_adjustments); | |
1024 NEXT_PASS (pass_peephole2); | |
1025 NEXT_PASS (pass_if_after_reload); | |
1026 NEXT_PASS (pass_regrename); | |
1027 NEXT_PASS (pass_cprop_hardreg); | |
1028 NEXT_PASS (pass_fast_rtl_dce); | |
1029 NEXT_PASS (pass_reorder_blocks); | |
1030 NEXT_PASS (pass_branch_target_load_optimize2); | |
1031 NEXT_PASS (pass_leaf_regs); | |
1032 NEXT_PASS (pass_split_before_sched2); | |
1033 NEXT_PASS (pass_sched2); | |
1034 NEXT_PASS (pass_stack_regs); | |
1035 { | |
1036 struct opt_pass **p = &pass_stack_regs.pass.sub; | |
1037 NEXT_PASS (pass_split_before_regstack); | |
1038 NEXT_PASS (pass_stack_regs_run); | |
1039 } | |
1040 NEXT_PASS (pass_compute_alignments); | |
1041 NEXT_PASS (pass_duplicate_computed_gotos); | |
1042 NEXT_PASS (pass_variable_tracking); | |
1043 NEXT_PASS (pass_free_cfg); | |
1044 NEXT_PASS (pass_machine_reorg); | |
1045 NEXT_PASS (pass_cleanup_barriers); | |
1046 NEXT_PASS (pass_delay_slots); | |
1047 NEXT_PASS (pass_split_for_shorten_branches); | |
1048 NEXT_PASS (pass_convert_to_eh_region_ranges); | |
1049 NEXT_PASS (pass_shorten_branches); | |
1050 NEXT_PASS (pass_set_nothrow_function_flags); | |
1051 NEXT_PASS (pass_final); | |
1052 } | |
1053 NEXT_PASS (pass_df_finish); | |
1054 } | |
1055 NEXT_PASS (pass_clean_state); | |
1056 *p = NULL; | |
1057 | |
1058 #undef NEXT_PASS | |
1059 | |
1060 /* Register the passes with the tree dump code. */ | |
1061 register_dump_files (all_lowering_passes, PROP_gimple_any); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1062 register_dump_files (all_small_ipa_passes, |
0 | 1063 PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh |
1064 | PROP_cfg); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1065 register_dump_files (all_regular_ipa_passes, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1066 PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1067 | PROP_cfg); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1068 register_dump_files (all_lto_gen_passes, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1069 PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1070 | PROP_cfg); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1071 register_dump_files (all_passes, |
0 | 1072 PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh |
1073 | PROP_cfg); | |
1074 } | |
1075 | |
1076 /* If we are in IPA mode (i.e., current_function_decl is NULL), call | |
1077 function CALLBACK for every function in the call graph. Otherwise, | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1078 call CALLBACK on the current function. */ |
0 | 1079 |
1080 static void | |
1081 do_per_function (void (*callback) (void *data), void *data) | |
1082 { | |
1083 if (current_function_decl) | |
1084 callback (data); | |
1085 else | |
1086 { | |
1087 struct cgraph_node *node; | |
1088 for (node = cgraph_nodes; node; node = node->next) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1089 if (node->analyzed && gimple_has_body_p (node->decl) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1090 && (!node->clone_of || node->decl != node->clone_of->decl)) |
0 | 1091 { |
1092 push_cfun (DECL_STRUCT_FUNCTION (node->decl)); | |
1093 current_function_decl = node->decl; | |
1094 callback (data); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1095 if (!flag_wpa) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1096 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1097 free_dominance_info (CDI_DOMINATORS); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1098 free_dominance_info (CDI_POST_DOMINATORS); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1099 } |
0 | 1100 current_function_decl = NULL; |
1101 pop_cfun (); | |
1102 ggc_collect (); | |
1103 } | |
1104 } | |
1105 } | |
1106 | |
1107 /* Because inlining might remove no-longer reachable nodes, we need to | |
1108 keep the array visible to garbage collector to avoid reading collected | |
1109 out nodes. */ | |
1110 static int nnodes; | |
1111 static GTY ((length ("nnodes"))) struct cgraph_node **order; | |
1112 | |
1113 /* If we are in IPA mode (i.e., current_function_decl is NULL), call | |
1114 function CALLBACK for every function in the call graph. Otherwise, | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1115 call CALLBACK on the current function. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1116 This function is global so that plugins can use it. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1117 void |
0 | 1118 do_per_function_toporder (void (*callback) (void *data), void *data) |
1119 { | |
1120 int i; | |
1121 | |
1122 if (current_function_decl) | |
1123 callback (data); | |
1124 else | |
1125 { | |
1126 gcc_assert (!order); | |
1127 order = GGC_NEWVEC (struct cgraph_node *, cgraph_n_nodes); | |
1128 nnodes = cgraph_postorder (order); | |
1129 for (i = nnodes - 1; i >= 0; i--) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1130 order[i]->process = 1; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1131 for (i = nnodes - 1; i >= 0; i--) |
0 | 1132 { |
1133 struct cgraph_node *node = order[i]; | |
1134 | |
1135 /* Allow possibly removed nodes to be garbage collected. */ | |
1136 order[i] = NULL; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1137 node->process = 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1138 if (node->analyzed) |
0 | 1139 { |
1140 push_cfun (DECL_STRUCT_FUNCTION (node->decl)); | |
1141 current_function_decl = node->decl; | |
1142 callback (data); | |
1143 free_dominance_info (CDI_DOMINATORS); | |
1144 free_dominance_info (CDI_POST_DOMINATORS); | |
1145 current_function_decl = NULL; | |
1146 pop_cfun (); | |
1147 ggc_collect (); | |
1148 } | |
1149 } | |
1150 } | |
1151 ggc_free (order); | |
1152 order = NULL; | |
1153 nnodes = 0; | |
1154 } | |
1155 | |
1156 /* Perform all TODO actions that ought to be done on each function. */ | |
1157 | |
1158 static void | |
1159 execute_function_todo (void *data) | |
1160 { | |
1161 unsigned int flags = (size_t)data; | |
1162 if (cfun->curr_properties & PROP_ssa) | |
1163 flags |= TODO_verify_ssa; | |
1164 flags &= ~cfun->last_verified; | |
1165 if (!flags) | |
1166 return; | |
1167 | |
1168 statistics_fini_pass (); | |
1169 | |
1170 /* Always cleanup the CFG before trying to update SSA. */ | |
1171 if (flags & TODO_cleanup_cfg) | |
1172 { | |
1173 bool cleanup = cleanup_tree_cfg (); | |
1174 | |
1175 if (cleanup && (cfun->curr_properties & PROP_ssa)) | |
1176 flags |= TODO_remove_unused_locals; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1177 |
0 | 1178 /* When cleanup_tree_cfg merges consecutive blocks, it may |
1179 perform some simplistic propagation when removing single | |
1180 valued PHI nodes. This propagation may, in turn, cause the | |
1181 SSA form to become out-of-date (see PR 22037). So, even | |
1182 if the parent pass had not scheduled an SSA update, we may | |
1183 still need to do one. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1184 if (!(flags & TODO_update_ssa_any) && need_ssa_update_p (cfun)) |
0 | 1185 flags |= TODO_update_ssa; |
1186 } | |
1187 | |
1188 if (flags & TODO_update_ssa_any) | |
1189 { | |
1190 unsigned update_flags = flags & TODO_update_ssa_any; | |
1191 update_ssa (update_flags); | |
1192 cfun->last_verified &= ~TODO_verify_ssa; | |
1193 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1194 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1195 if (flags & TODO_update_address_taken) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1196 execute_update_addresses_taken (true); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1197 |
0 | 1198 if (flags & TODO_rebuild_alias) |
1199 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1200 if (!(flags & TODO_update_address_taken)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1201 execute_update_addresses_taken (true); |
0 | 1202 compute_may_aliases (); |
1203 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1204 |
0 | 1205 if (flags & TODO_remove_unused_locals) |
1206 remove_unused_locals (); | |
1207 | |
1208 if ((flags & TODO_dump_func) && dump_file && current_function_decl) | |
1209 { | |
1210 if (cfun->curr_properties & PROP_trees) | |
1211 dump_function_to_file (current_function_decl, dump_file, dump_flags); | |
1212 else | |
1213 { | |
1214 if (dump_flags & TDF_SLIM) | |
1215 print_rtl_slim_with_bb (dump_file, get_insns (), dump_flags); | |
1216 else if ((cfun->curr_properties & PROP_cfg) | |
1217 && (dump_flags & TDF_BLOCKS)) | |
1218 print_rtl_with_bb (dump_file, get_insns ()); | |
1219 else | |
1220 print_rtl (dump_file, get_insns ()); | |
1221 | |
1222 if ((cfun->curr_properties & PROP_cfg) | |
1223 && graph_dump_format != no_graph | |
1224 && (dump_flags & TDF_GRAPH)) | |
1225 print_rtl_graph_with_bb (dump_file_name, get_insns ()); | |
1226 } | |
1227 | |
1228 /* Flush the file. If verification fails, we won't be able to | |
1229 close the file before aborting. */ | |
1230 fflush (dump_file); | |
1231 } | |
1232 | |
1233 if (flags & TODO_rebuild_frequencies) | |
1234 { | |
1235 if (profile_status == PROFILE_GUESSED) | |
1236 { | |
1237 loop_optimizer_init (0); | |
1238 add_noreturn_fake_exit_edges (); | |
1239 mark_irreducible_loops (); | |
1240 connect_infinite_loops_to_exit (); | |
1241 estimate_bb_frequencies (); | |
1242 remove_fake_exit_edges (); | |
1243 loop_optimizer_finalize (); | |
1244 } | |
1245 else if (profile_status == PROFILE_READ) | |
1246 counts_to_freqs (); | |
1247 else | |
1248 gcc_unreachable (); | |
1249 } | |
1250 | |
1251 #if defined ENABLE_CHECKING | |
1252 if (flags & TODO_verify_ssa) | |
1253 verify_ssa (true); | |
1254 if (flags & TODO_verify_flow) | |
1255 verify_flow_info (); | |
1256 if (flags & TODO_verify_stmts) | |
1257 verify_stmts (); | |
1258 if (flags & TODO_verify_loops) | |
1259 verify_loop_closed_ssa (); | |
1260 if (flags & TODO_verify_rtl_sharing) | |
1261 verify_rtl_sharing (); | |
1262 #endif | |
1263 | |
1264 cfun->last_verified = flags & TODO_verify_all; | |
1265 } | |
1266 | |
1267 /* Perform all TODO actions. */ | |
1268 static void | |
1269 execute_todo (unsigned int flags) | |
1270 { | |
1271 #if defined ENABLE_CHECKING | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1272 if (cfun |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1273 && need_ssa_update_p (cfun)) |
0 | 1274 gcc_assert (flags & TODO_update_ssa_any); |
1275 #endif | |
1276 | |
1277 /* Inform the pass whether it is the first time it is run. */ | |
1278 first_pass_instance = (flags & TODO_mark_first_instance) != 0; | |
1279 | |
1280 do_per_function (execute_function_todo, (void *)(size_t) flags); | |
1281 | |
1282 /* Always remove functions just as before inlining: IPA passes might be | |
1283 interested to see bodies of extern inline functions that are not inlined | |
1284 to analyze side effects. The full removal is done just at the end | |
1285 of IPA pass queue. */ | |
1286 if (flags & TODO_remove_functions) | |
1287 { | |
1288 gcc_assert (!cfun); | |
1289 cgraph_remove_unreachable_nodes (true, dump_file); | |
1290 } | |
1291 | |
1292 if ((flags & TODO_dump_cgraph) && dump_file && !current_function_decl) | |
1293 { | |
1294 gcc_assert (!cfun); | |
1295 dump_cgraph (dump_file); | |
1296 /* Flush the file. If verification fails, we won't be able to | |
1297 close the file before aborting. */ | |
1298 fflush (dump_file); | |
1299 } | |
1300 | |
1301 if (flags & TODO_ggc_collect) | |
1302 ggc_collect (); | |
1303 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1304 /* Now that the dumping has been done, we can get rid of the optional |
0 | 1305 df problems. */ |
1306 if (flags & TODO_df_finish) | |
1307 df_finish_pass ((flags & TODO_df_verify) != 0); | |
1308 } | |
1309 | |
1310 /* Verify invariants that should hold between passes. This is a place | |
1311 to put simple sanity checks. */ | |
1312 | |
1313 static void | |
1314 verify_interpass_invariants (void) | |
1315 { | |
1316 #ifdef ENABLE_CHECKING | |
1317 gcc_assert (!fold_deferring_overflow_warnings_p ()); | |
1318 #endif | |
1319 } | |
1320 | |
1321 /* Clear the last verified flag. */ | |
1322 | |
1323 static void | |
1324 clear_last_verified (void *data ATTRIBUTE_UNUSED) | |
1325 { | |
1326 cfun->last_verified = 0; | |
1327 } | |
1328 | |
1329 /* Helper function. Verify that the properties has been turn into the | |
1330 properties expected by the pass. */ | |
1331 | |
1332 #ifdef ENABLE_CHECKING | |
1333 static void | |
1334 verify_curr_properties (void *data) | |
1335 { | |
1336 unsigned int props = (size_t)data; | |
1337 gcc_assert ((cfun->curr_properties & props) == props); | |
1338 } | |
1339 #endif | |
1340 | |
1341 /* Initialize pass dump file. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1342 /* This is non-static so that the plugins can use it. */ |
0 | 1343 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1344 bool |
0 | 1345 pass_init_dump_file (struct opt_pass *pass) |
1346 { | |
1347 /* If a dump file name is present, open it if enabled. */ | |
1348 if (pass->static_pass_number != -1) | |
1349 { | |
1350 bool initializing_dump = !dump_initialized_p (pass->static_pass_number); | |
1351 dump_file_name = get_dump_file_name (pass->static_pass_number); | |
1352 dump_file = dump_begin (pass->static_pass_number, &dump_flags); | |
1353 if (dump_file && current_function_decl) | |
1354 { | |
1355 const char *dname, *aname; | |
1356 dname = lang_hooks.decl_printable_name (current_function_decl, 2); | |
1357 aname = (IDENTIFIER_POINTER | |
1358 (DECL_ASSEMBLER_NAME (current_function_decl))); | |
1359 fprintf (dump_file, "\n;; Function %s (%s)%s\n\n", dname, aname, | |
1360 cfun->function_frequency == FUNCTION_FREQUENCY_HOT | |
1361 ? " (hot)" | |
1362 : cfun->function_frequency == FUNCTION_FREQUENCY_UNLIKELY_EXECUTED | |
1363 ? " (unlikely executed)" | |
1364 : ""); | |
1365 } | |
1366 return initializing_dump; | |
1367 } | |
1368 else | |
1369 return false; | |
1370 } | |
1371 | |
1372 /* Flush PASS dump file. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1373 /* This is non-static so that plugins can use it. */ |
0 | 1374 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1375 void |
0 | 1376 pass_fini_dump_file (struct opt_pass *pass) |
1377 { | |
1378 /* Flush and close dump file. */ | |
1379 if (dump_file_name) | |
1380 { | |
1381 free (CONST_CAST (char *, dump_file_name)); | |
1382 dump_file_name = NULL; | |
1383 } | |
1384 | |
1385 if (dump_file) | |
1386 { | |
1387 dump_end (pass->static_pass_number, dump_file); | |
1388 dump_file = NULL; | |
1389 } | |
1390 } | |
1391 | |
1392 /* After executing the pass, apply expected changes to the function | |
1393 properties. */ | |
1394 | |
1395 static void | |
1396 update_properties_after_pass (void *data) | |
1397 { | |
1398 struct opt_pass *pass = (struct opt_pass *) data; | |
1399 cfun->curr_properties = (cfun->curr_properties | pass->properties_provided) | |
1400 & ~pass->properties_destroyed; | |
1401 } | |
1402 | |
1403 /* Execute summary generation for all of the passes in IPA_PASS. */ | |
1404 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1405 void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1406 execute_ipa_summary_passes (struct ipa_opt_pass_d *ipa_pass) |
0 | 1407 { |
1408 while (ipa_pass) | |
1409 { | |
1410 struct opt_pass *pass = &ipa_pass->pass; | |
1411 | |
1412 /* Execute all of the IPA_PASSes in the list. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1413 if (ipa_pass->pass.type == IPA_PASS |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1414 && (!pass->gate || pass->gate ()) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1415 && ipa_pass->generate_summary) |
0 | 1416 { |
1417 pass_init_dump_file (pass); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1418 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1419 /* If a timevar is present, start it. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1420 if (pass->tv_id) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1421 timevar_push (pass->tv_id); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1422 |
0 | 1423 ipa_pass->generate_summary (); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1424 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1425 /* Stop timevar. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1426 if (pass->tv_id) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1427 timevar_pop (pass->tv_id); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1428 |
0 | 1429 pass_fini_dump_file (pass); |
1430 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1431 ipa_pass = (struct ipa_opt_pass_d *)ipa_pass->pass.next; |
0 | 1432 } |
1433 } | |
1434 | |
1435 /* Execute IPA_PASS function transform on NODE. */ | |
1436 | |
1437 static void | |
1438 execute_one_ipa_transform_pass (struct cgraph_node *node, | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1439 struct ipa_opt_pass_d *ipa_pass) |
0 | 1440 { |
1441 struct opt_pass *pass = &ipa_pass->pass; | |
1442 unsigned int todo_after = 0; | |
1443 | |
1444 current_pass = pass; | |
1445 if (!ipa_pass->function_transform) | |
1446 return; | |
1447 | |
1448 /* Note that the folders should only create gimple expressions. | |
1449 This is a hack until the new folder is ready. */ | |
1450 in_gimple_form = (cfun && (cfun->curr_properties & PROP_trees)) != 0; | |
1451 | |
1452 pass_init_dump_file (pass); | |
1453 | |
1454 /* Run pre-pass verification. */ | |
1455 execute_todo (ipa_pass->function_transform_todo_flags_start); | |
1456 | |
1457 /* If a timevar is present, start it. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1458 if (pass->tv_id != TV_NONE) |
0 | 1459 timevar_push (pass->tv_id); |
1460 | |
1461 /* Do it! */ | |
1462 todo_after = ipa_pass->function_transform (node); | |
1463 | |
1464 /* Stop timevar. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1465 if (pass->tv_id != TV_NONE) |
0 | 1466 timevar_pop (pass->tv_id); |
1467 | |
1468 /* Run post-pass cleanup and verification. */ | |
1469 execute_todo (todo_after); | |
1470 verify_interpass_invariants (); | |
1471 | |
1472 pass_fini_dump_file (pass); | |
1473 | |
1474 current_pass = NULL; | |
1475 } | |
1476 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1477 /* For the current function, execute all ipa transforms. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1478 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1479 void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1480 execute_all_ipa_transforms (void) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1481 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1482 struct cgraph_node *node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1483 if (!cfun) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1484 return; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1485 node = cgraph_node (current_function_decl); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1486 if (node->ipa_transforms_to_apply) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1487 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1488 unsigned int i; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1489 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1490 for (i = 0; i < VEC_length (ipa_opt_pass, node->ipa_transforms_to_apply); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1491 i++) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1492 execute_one_ipa_transform_pass (node, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1493 VEC_index (ipa_opt_pass, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1494 node->ipa_transforms_to_apply, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1495 i)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1496 VEC_free (ipa_opt_pass, heap, node->ipa_transforms_to_apply); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1497 node->ipa_transforms_to_apply = NULL; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1498 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1499 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1500 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1501 /* Execute PASS. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1502 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1503 bool |
0 | 1504 execute_one_pass (struct opt_pass *pass) |
1505 { | |
1506 bool initializing_dump; | |
1507 unsigned int todo_after = 0; | |
1508 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1509 bool gate_status; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1510 |
0 | 1511 /* IPA passes are executed on whole program, so cfun should be NULL. |
1512 Other passes need function context set. */ | |
1513 if (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS) | |
1514 gcc_assert (!cfun && !current_function_decl); | |
1515 else | |
1516 gcc_assert (cfun && current_function_decl); | |
1517 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1518 current_pass = pass; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1519 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1520 /* Check whether gate check should be avoided. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1521 User controls the value of the gate through the parameter "gate_status". */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1522 gate_status = (pass->gate == NULL) ? true : pass->gate(); |
0 | 1523 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1524 /* Override gate with plugin. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1525 invoke_plugin_callbacks (PLUGIN_OVERRIDE_GATE, &gate_status); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1526 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1527 if (!gate_status) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1528 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1529 current_pass = NULL; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1530 return false; |
0 | 1531 } |
1532 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1533 /* Pass execution event trigger: useful to identify passes being |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1534 executed. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1535 invoke_plugin_callbacks (PLUGIN_PASS_EXECUTION, pass); |
0 | 1536 |
1537 if (!quiet_flag && !cfun) | |
1538 fprintf (stderr, " <%s>", pass->name ? pass->name : ""); | |
1539 | |
1540 /* Note that the folders should only create gimple expressions. | |
1541 This is a hack until the new folder is ready. */ | |
1542 in_gimple_form = (cfun && (cfun->curr_properties & PROP_trees)) != 0; | |
1543 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1544 initializing_dump = pass_init_dump_file (pass); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1545 |
0 | 1546 /* Run pre-pass verification. */ |
1547 execute_todo (pass->todo_flags_start); | |
1548 | |
1549 #ifdef ENABLE_CHECKING | |
1550 do_per_function (verify_curr_properties, | |
1551 (void *)(size_t)pass->properties_required); | |
1552 #endif | |
1553 | |
1554 /* If a timevar is present, start it. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1555 if (pass->tv_id != TV_NONE) |
0 | 1556 timevar_push (pass->tv_id); |
1557 | |
1558 /* Do it! */ | |
1559 if (pass->execute) | |
1560 { | |
1561 todo_after = pass->execute (); | |
1562 do_per_function (clear_last_verified, NULL); | |
1563 } | |
1564 | |
1565 /* Stop timevar. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1566 if (pass->tv_id != TV_NONE) |
0 | 1567 timevar_pop (pass->tv_id); |
1568 | |
1569 do_per_function (update_properties_after_pass, pass); | |
1570 | |
1571 if (initializing_dump | |
1572 && dump_file | |
1573 && graph_dump_format != no_graph | |
1574 && cfun | |
1575 && (cfun->curr_properties & (PROP_cfg | PROP_rtl)) | |
1576 == (PROP_cfg | PROP_rtl)) | |
1577 { | |
1578 get_dump_file_info (pass->static_pass_number)->flags |= TDF_GRAPH; | |
1579 dump_flags |= TDF_GRAPH; | |
1580 clean_graph_dump_file (dump_file_name); | |
1581 } | |
1582 | |
1583 /* Run post-pass cleanup and verification. */ | |
1584 execute_todo (todo_after | pass->todo_flags_finish); | |
1585 verify_interpass_invariants (); | |
1586 if (pass->type == IPA_PASS) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1587 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1588 struct cgraph_node *node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1589 for (node = cgraph_nodes; node; node = node->next) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1590 if (node->analyzed) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1591 VEC_safe_push (ipa_opt_pass, heap, node->ipa_transforms_to_apply, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1592 (struct ipa_opt_pass_d *)pass); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1593 } |
0 | 1594 |
1595 if (!current_function_decl) | |
1596 cgraph_process_new_functions (); | |
1597 | |
1598 pass_fini_dump_file (pass); | |
1599 | |
1600 if (pass->type != SIMPLE_IPA_PASS && pass->type != IPA_PASS) | |
1601 gcc_assert (!(cfun->curr_properties & PROP_trees) | |
1602 || pass->type != RTL_PASS); | |
1603 | |
1604 current_pass = NULL; | |
1605 | |
1606 return true; | |
1607 } | |
1608 | |
1609 void | |
1610 execute_pass_list (struct opt_pass *pass) | |
1611 { | |
1612 do | |
1613 { | |
1614 gcc_assert (pass->type == GIMPLE_PASS | |
1615 || pass->type == RTL_PASS); | |
1616 if (execute_one_pass (pass) && pass->sub) | |
1617 execute_pass_list (pass->sub); | |
1618 pass = pass->next; | |
1619 } | |
1620 while (pass); | |
1621 } | |
1622 | |
1623 /* Same as execute_pass_list but assume that subpasses of IPA passes | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1624 are local passes. If SET is not NULL, write out summaries of only |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1625 those node in SET. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1626 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1627 static void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1628 ipa_write_summaries_2 (struct opt_pass *pass, cgraph_node_set set, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1629 struct lto_out_decl_state *state) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1630 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1631 while (pass) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1632 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1633 struct ipa_opt_pass_d *ipa_pass = (struct ipa_opt_pass_d *)pass; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1634 gcc_assert (!current_function_decl); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1635 gcc_assert (!cfun); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1636 gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1637 if (pass->type == IPA_PASS |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1638 && ipa_pass->write_summary |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1639 && (!pass->gate || pass->gate ())) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1640 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1641 /* If a timevar is present, start it. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1642 if (pass->tv_id) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1643 timevar_push (pass->tv_id); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1644 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1645 ipa_pass->write_summary (set); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1646 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1647 /* If a timevar is present, start it. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1648 if (pass->tv_id) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1649 timevar_pop (pass->tv_id); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1650 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1651 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1652 if (pass->sub && pass->sub->type != GIMPLE_PASS) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1653 ipa_write_summaries_2 (pass->sub, set, state); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1654 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1655 pass = pass->next; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1656 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1657 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1658 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1659 /* Helper function of ipa_write_summaries. Creates and destroys the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1660 decl state and calls ipa_write_summaries_2 for all passes that have |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1661 summaries. SET is the set of nodes to be written. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1662 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1663 static void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1664 ipa_write_summaries_1 (cgraph_node_set set) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1665 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1666 struct lto_out_decl_state *state = lto_new_out_decl_state (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1667 lto_push_out_decl_state (state); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1668 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1669 if (!flag_wpa) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1670 ipa_write_summaries_2 (all_regular_ipa_passes, set, state); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1671 ipa_write_summaries_2 (all_lto_gen_passes, set, state); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1672 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1673 gcc_assert (lto_get_out_decl_state () == state); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1674 lto_pop_out_decl_state (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1675 lto_delete_out_decl_state (state); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1676 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1677 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1678 /* Write out summaries for all the nodes in the callgraph. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1679 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1680 void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1681 ipa_write_summaries (void) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1682 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1683 cgraph_node_set set; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1684 struct cgraph_node **order; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1685 int i, order_pos; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1686 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1687 if (!flag_generate_lto || errorcount || sorrycount) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1688 return; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1689 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1690 lto_new_extern_inline_states (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1691 set = cgraph_node_set_new (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1692 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1693 /* Create the callgraph set in the same order used in |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1694 cgraph_expand_all_functions. This mostly facilitates debugging, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1695 since it causes the gimple file to be processed in the same order |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1696 as the source code. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1697 order = XCNEWVEC (struct cgraph_node *, cgraph_n_nodes); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1698 order_pos = cgraph_postorder (order); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1699 gcc_assert (order_pos == cgraph_n_nodes); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1700 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1701 for (i = order_pos - 1; i >= 0; i--) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1702 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1703 struct cgraph_node *node = order[i]; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1704 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1705 if (node->analyzed) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1706 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1707 /* When streaming out references to statements as part of some IPA |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1708 pass summary, the statements need to have uids assigned and the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1709 following does that for all the IPA passes here. Naturally, this |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1710 ordering then matches the one IPA-passes get in their stmt_fixup |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1711 hooks. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1712 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1713 push_cfun (DECL_STRUCT_FUNCTION (node->decl)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1714 renumber_gimple_stmt_uids (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1715 pop_cfun (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1716 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1717 cgraph_node_set_add (set, node); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1718 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1719 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1720 ipa_write_summaries_1 (set); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1721 lto_delete_extern_inline_states (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1722 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1723 free (order); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1724 ggc_free (set); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1725 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1726 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1727 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1728 /* Write all the summaries for the cgraph nodes in SET. If SET is |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1729 NULL, write out all summaries of all nodes. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1730 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1731 void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1732 ipa_write_summaries_of_cgraph_node_set (cgraph_node_set set) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1733 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1734 if (flag_generate_lto && !(errorcount || sorrycount)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1735 ipa_write_summaries_1 (set); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1736 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1737 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1738 /* Same as execute_pass_list but assume that subpasses of IPA passes |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1739 are local passes. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1740 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1741 static void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1742 ipa_read_summaries_1 (struct opt_pass *pass) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1743 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1744 while (pass) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1745 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1746 struct ipa_opt_pass_d *ipa_pass = (struct ipa_opt_pass_d *) pass; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1747 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1748 gcc_assert (!current_function_decl); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1749 gcc_assert (!cfun); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1750 gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1751 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1752 if (pass->gate == NULL || pass->gate ()) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1753 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1754 if (pass->type == IPA_PASS && ipa_pass->read_summary) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1755 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1756 /* If a timevar is present, start it. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1757 if (pass->tv_id) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1758 timevar_push (pass->tv_id); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1759 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1760 ipa_pass->read_summary (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1761 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1762 /* Stop timevar. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1763 if (pass->tv_id) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1764 timevar_pop (pass->tv_id); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1765 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1766 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1767 if (pass->sub && pass->sub->type != GIMPLE_PASS) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1768 ipa_read_summaries_1 (pass->sub); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1769 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1770 pass = pass->next; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1771 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1772 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1773 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1774 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1775 /* Read all the summaries for all_regular_ipa_passes and all_lto_gen_passes. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1776 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1777 void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1778 ipa_read_summaries (void) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1779 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1780 if (!flag_ltrans) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1781 ipa_read_summaries_1 (all_regular_ipa_passes); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1782 ipa_read_summaries_1 (all_lto_gen_passes); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1783 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1784 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1785 /* Same as execute_pass_list but assume that subpasses of IPA passes |
0 | 1786 are local passes. */ |
1787 void | |
1788 execute_ipa_pass_list (struct opt_pass *pass) | |
1789 { | |
1790 do | |
1791 { | |
1792 gcc_assert (!current_function_decl); | |
1793 gcc_assert (!cfun); | |
1794 gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS); | |
1795 if (execute_one_pass (pass) && pass->sub) | |
1796 { | |
1797 if (pass->sub->type == GIMPLE_PASS) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1798 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1799 invoke_plugin_callbacks (PLUGIN_EARLY_GIMPLE_PASSES_START, NULL); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1800 do_per_function_toporder ((void (*)(void *))execute_pass_list, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1801 pass->sub); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1802 invoke_plugin_callbacks (PLUGIN_EARLY_GIMPLE_PASSES_END, NULL); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1803 } |
0 | 1804 else if (pass->sub->type == SIMPLE_IPA_PASS |
1805 || pass->sub->type == IPA_PASS) | |
1806 execute_ipa_pass_list (pass->sub); | |
1807 else | |
1808 gcc_unreachable (); | |
1809 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1810 gcc_assert (!current_function_decl); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1811 cgraph_process_new_functions (); |
0 | 1812 pass = pass->next; |
1813 } | |
1814 while (pass); | |
1815 } | |
1816 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1817 /* Execute stmt fixup hooks of all passes in PASS for NODE and STMTS. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1818 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1819 static void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1820 execute_ipa_stmt_fixups (struct opt_pass *pass, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1821 struct cgraph_node *node, gimple *stmts) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1822 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1823 while (pass) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1824 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1825 /* Execute all of the IPA_PASSes in the list. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1826 if (pass->type == IPA_PASS |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1827 && (!pass->gate || pass->gate ())) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1828 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1829 struct ipa_opt_pass_d *ipa_pass = (struct ipa_opt_pass_d *) pass; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1830 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1831 if (ipa_pass->stmt_fixup) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1832 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1833 pass_init_dump_file (pass); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1834 /* If a timevar is present, start it. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1835 if (pass->tv_id) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1836 timevar_push (pass->tv_id); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1837 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1838 ipa_pass->stmt_fixup (node, stmts); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1839 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1840 /* Stop timevar. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1841 if (pass->tv_id) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1842 timevar_pop (pass->tv_id); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1843 pass_fini_dump_file (pass); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1844 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1845 if (pass->sub) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1846 execute_ipa_stmt_fixups (pass->sub, node, stmts); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1847 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1848 pass = pass->next; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1849 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1850 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1851 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1852 /* Execute stmt fixup hooks of all IPA passes for NODE and STMTS. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1853 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1854 void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1855 execute_all_ipa_stmt_fixups (struct cgraph_node *node, gimple *stmts) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1856 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1857 execute_ipa_stmt_fixups (all_regular_ipa_passes, node, stmts); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1858 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1859 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1860 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1861 extern void debug_properties (unsigned int); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1862 extern void dump_properties (FILE *, unsigned int); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1863 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1864 void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1865 dump_properties (FILE *dump, unsigned int props) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1866 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1867 fprintf (dump, "Properties:\n"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1868 if (props & PROP_gimple_any) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1869 fprintf (dump, "PROP_gimple_any\n"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1870 if (props & PROP_gimple_lcf) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1871 fprintf (dump, "PROP_gimple_lcf\n"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1872 if (props & PROP_gimple_leh) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1873 fprintf (dump, "PROP_gimple_leh\n"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1874 if (props & PROP_cfg) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1875 fprintf (dump, "PROP_cfg\n"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1876 if (props & PROP_referenced_vars) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1877 fprintf (dump, "PROP_referenced_vars\n"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1878 if (props & PROP_ssa) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1879 fprintf (dump, "PROP_ssa\n"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1880 if (props & PROP_no_crit_edges) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1881 fprintf (dump, "PROP_no_crit_edges\n"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1882 if (props & PROP_rtl) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1883 fprintf (dump, "PROP_rtl\n"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1884 if (props & PROP_gimple_lomp) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1885 fprintf (dump, "PROP_gimple_lomp\n"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1886 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1887 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1888 void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1889 debug_properties (unsigned int props) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1890 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1891 dump_properties (stderr, props); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1892 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1893 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1894 /* Called by local passes to see if function is called by already processed nodes. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1895 Because we process nodes in topological order, this means that function is |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1896 in recursive cycle or we introduced new direct calls. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1897 bool |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1898 function_called_by_processed_nodes_p (void) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1899 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1900 struct cgraph_edge *e; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1901 for (e = cgraph_node (current_function_decl)->callers; e; e = e->next_caller) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1902 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1903 if (e->caller->decl == current_function_decl) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1904 continue; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1905 if (!e->caller->analyzed) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1906 continue; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1907 if (TREE_ASM_WRITTEN (e->caller->decl)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1908 continue; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1909 if (!e->caller->process && !e->caller->global.inlined_to) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1910 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1911 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1912 if (dump_file && e) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1913 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1914 fprintf (dump_file, "Already processed call to:\n"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1915 dump_cgraph_node (dump_file, e->caller); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1916 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1917 return e != NULL; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1918 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1919 |
0 | 1920 #include "gt-passes.h" |