annotate gcc/passes.c @ 117:f81c5aa9f14f

fix
author mir3636
date Tue, 28 Nov 2017 21:17:15 +0900
parents ab0bcb71f44d
children d34655255c78
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 /* Top level of GCC compilers (cc1, cc1plus, etc.)
111
kono
parents: 67
diff changeset
2 Copyright (C) 1987-2017 Free Software Foundation, Inc.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 This file is part of GCC.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 GCC is free software; you can redistribute it and/or modify it under
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 the terms of the GNU General Public License as published by the Free
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 Software Foundation; either version 3, or (at your option) any later
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 version.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 for more details.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 along with GCC; see the file COPYING3. If not see
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 <http://www.gnu.org/licenses/>. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 /* This is the top level of cc1/c++.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 It parses command args, opens files, invokes the various passes
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 in the proper order, and counts the time used by each.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 Error messages and low-level interface to malloc also handled here. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 #include "config.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 #include "system.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 #include "coretypes.h"
111
kono
parents: 67
diff changeset
28 #include "backend.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 #include "target.h"
111
kono
parents: 67
diff changeset
30 #include "rtl.h"
kono
parents: 67
diff changeset
31 #include "tree.h"
kono
parents: 67
diff changeset
32 #include "gimple.h"
kono
parents: 67
diff changeset
33 #include "cfghooks.h"
kono
parents: 67
diff changeset
34 #include "df.h"
kono
parents: 67
diff changeset
35 #include "memmodel.h"
kono
parents: 67
diff changeset
36 #include "tm_p.h"
kono
parents: 67
diff changeset
37 #include "ssa.h"
kono
parents: 67
diff changeset
38 #include "emit-rtl.h"
kono
parents: 67
diff changeset
39 #include "cgraph.h"
kono
parents: 67
diff changeset
40 #include "lto-streamer.h"
kono
parents: 67
diff changeset
41 #include "fold-const.h"
kono
parents: 67
diff changeset
42 #include "varasm.h"
kono
parents: 67
diff changeset
43 #include "output.h"
kono
parents: 67
diff changeset
44 #include "graph.h"
kono
parents: 67
diff changeset
45 #include "debug.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 #include "cfgloop.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 #include "value-prof.h"
111
kono
parents: 67
diff changeset
48 #include "tree-cfg.h"
kono
parents: 67
diff changeset
49 #include "tree-ssa-loop-manip.h"
kono
parents: 67
diff changeset
50 #include "tree-into-ssa.h"
kono
parents: 67
diff changeset
51 #include "tree-dfa.h"
kono
parents: 67
diff changeset
52 #include "tree-ssa.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 #include "tree-pass.h"
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
54 #include "plugin.h"
111
kono
parents: 67
diff changeset
55 #include "ipa-utils.h"
kono
parents: 67
diff changeset
56 #include "tree-pretty-print.h" /* for dump_function_header */
kono
parents: 67
diff changeset
57 #include "context.h"
kono
parents: 67
diff changeset
58 #include "pass_manager.h"
kono
parents: 67
diff changeset
59 #include "cfgrtl.h"
kono
parents: 67
diff changeset
60 #include "tree-ssa-live.h" /* For remove_unused_locals. */
kono
parents: 67
diff changeset
61 #include "tree-cfgcleanup.h"
kono
parents: 67
diff changeset
62 #include "insn-addr.h" /* for INSN_ADDRESSES_ALLOC. */
kono
parents: 67
diff changeset
63 #include "diagnostic-core.h" /* for fnotice */
kono
parents: 67
diff changeset
64 #include "stringpool.h"
kono
parents: 67
diff changeset
65 #include "attribs.h"
kono
parents: 67
diff changeset
66
kono
parents: 67
diff changeset
67 using namespace gcc;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 /* 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
70 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
71 The variable current_pass is also used for statistics and plugins. */
111
kono
parents: 67
diff changeset
72 opt_pass *current_pass;
kono
parents: 67
diff changeset
73
kono
parents: 67
diff changeset
74 /* Most passes are single-instance (within their context) and thus don't
kono
parents: 67
diff changeset
75 need to implement cloning, but passes that support multiple instances
kono
parents: 67
diff changeset
76 *must* provide their own implementation of the clone method.
kono
parents: 67
diff changeset
77
kono
parents: 67
diff changeset
78 Handle this by providing a default implemenation, but make it a fatal
kono
parents: 67
diff changeset
79 error to call it. */
kono
parents: 67
diff changeset
80
kono
parents: 67
diff changeset
81 opt_pass *
kono
parents: 67
diff changeset
82 opt_pass::clone ()
kono
parents: 67
diff changeset
83 {
kono
parents: 67
diff changeset
84 internal_error ("pass %s does not support cloning", name);
kono
parents: 67
diff changeset
85 }
kono
parents: 67
diff changeset
86
kono
parents: 67
diff changeset
87 void
kono
parents: 67
diff changeset
88 opt_pass::set_pass_param (unsigned int, bool)
kono
parents: 67
diff changeset
89 {
kono
parents: 67
diff changeset
90 internal_error ("pass %s needs a set_pass_param implementation to handle the"
kono
parents: 67
diff changeset
91 " extra argument in NEXT_PASS", name);
kono
parents: 67
diff changeset
92 }
kono
parents: 67
diff changeset
93
kono
parents: 67
diff changeset
94 bool
kono
parents: 67
diff changeset
95 opt_pass::gate (function *)
kono
parents: 67
diff changeset
96 {
kono
parents: 67
diff changeset
97 return true;
kono
parents: 67
diff changeset
98 }
kono
parents: 67
diff changeset
99
kono
parents: 67
diff changeset
100 unsigned int
kono
parents: 67
diff changeset
101 opt_pass::execute (function *)
kono
parents: 67
diff changeset
102 {
kono
parents: 67
diff changeset
103 return 0;
kono
parents: 67
diff changeset
104 }
kono
parents: 67
diff changeset
105
kono
parents: 67
diff changeset
106 opt_pass::opt_pass (const pass_data &data, context *ctxt)
kono
parents: 67
diff changeset
107 : pass_data (data),
kono
parents: 67
diff changeset
108 sub (NULL),
kono
parents: 67
diff changeset
109 next (NULL),
kono
parents: 67
diff changeset
110 static_pass_number (0),
kono
parents: 67
diff changeset
111 m_ctxt (ctxt)
kono
parents: 67
diff changeset
112 {
kono
parents: 67
diff changeset
113 }
kono
parents: 67
diff changeset
114
kono
parents: 67
diff changeset
115
kono
parents: 67
diff changeset
116 void
kono
parents: 67
diff changeset
117 pass_manager::execute_early_local_passes ()
kono
parents: 67
diff changeset
118 {
kono
parents: 67
diff changeset
119 execute_pass_list (cfun, pass_build_ssa_passes_1->sub);
kono
parents: 67
diff changeset
120 if (flag_check_pointer_bounds)
kono
parents: 67
diff changeset
121 execute_pass_list (cfun, pass_chkp_instrumentation_passes_1->sub);
kono
parents: 67
diff changeset
122 execute_pass_list (cfun, pass_local_optimization_passes_1->sub);
kono
parents: 67
diff changeset
123 }
kono
parents: 67
diff changeset
124
kono
parents: 67
diff changeset
125 unsigned int
kono
parents: 67
diff changeset
126 pass_manager::execute_pass_mode_switching ()
kono
parents: 67
diff changeset
127 {
kono
parents: 67
diff changeset
128 return pass_mode_switching_1->execute (cfun);
kono
parents: 67
diff changeset
129 }
kono
parents: 67
diff changeset
130
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 /* Call from anywhere to find out what pass this is. Useful for
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 printing out debugging information deep inside an service
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 routine. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 print_current_pass (FILE *file)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 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
139 fprintf (file, "current pass = %s (%d)\n",
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 current_pass->name, current_pass->static_pass_number);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 fprintf (file, "no current pass.\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 /* Call from the debugger to get the current pass name. */
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
147 DEBUG_FUNCTION void
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 debug_pass (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 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
151 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
152
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 /* Global variables used to communicate with passes. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 bool in_gimple_form;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 /* This is called from various places for FUNCTION_DECL, VAR_DECL,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 and TYPE_DECL nodes.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 This does nothing for local (non-static) variables, unless the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 variable is a register variable with DECL_ASSEMBLER_NAME set. In
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 that case, or if the variable is not an automatic, it sets up the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 RTL and outputs any assembler code (label definition, storage
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 allocation and initialization).
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 DECL is the declaration. TOP_LEVEL is nonzero
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 if this declaration is not within a function. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 rest_of_decl_compilation (tree decl,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 int top_level,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 int at_end)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 {
111
kono
parents: 67
diff changeset
176 bool finalize = true;
kono
parents: 67
diff changeset
177
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 /* We deferred calling assemble_alias so that we could collect
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 other attributes such as visibility. Emit the alias now. */
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
180 if (!in_lto_p)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 tree alias;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 if (alias)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 alias = TREE_VALUE (TREE_VALUE (alias));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 alias = get_identifier (TREE_STRING_POINTER (alias));
111
kono
parents: 67
diff changeset
188 /* A quirk of the initial implementation of aliases required that the
kono
parents: 67
diff changeset
189 user add "extern" to all of them. Which is silly, but now
kono
parents: 67
diff changeset
190 historical. Do note that the symbol is in fact locally defined. */
kono
parents: 67
diff changeset
191 DECL_EXTERNAL (decl) = 0;
kono
parents: 67
diff changeset
192 TREE_STATIC (decl) = 1;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 assemble_alias (decl, alias);
111
kono
parents: 67
diff changeset
194 finalize = false;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 /* Can't defer this, because it needs to happen before any
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 later function definitions are processed. */
111
kono
parents: 67
diff changeset
200 if (HAS_DECL_ASSEMBLER_NAME_P (decl)
kono
parents: 67
diff changeset
201 && DECL_ASSEMBLER_NAME_SET_P (decl)
kono
parents: 67
diff changeset
202 && DECL_REGISTER (decl))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 make_decl_rtl (decl);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
204
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 /* Forward declarations for nested functions are not "external",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 but we need to treat them as if they were. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 || TREE_CODE (decl) == FUNCTION_DECL)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 timevar_push (TV_VARCONST);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 /* Don't output anything when a tentative file-scope definition
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 is seen. But at end of compilation, do output code for them.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 We do output all variables and rely on
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 callgraph code to defer them except for forward declarations
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 (see gcc.c-torture/compile/920624-1.c) */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 if ((at_end
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 || !DECL_DEFER_OUTPUT (decl)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 || DECL_INITIAL (decl))
111
kono
parents: 67
diff changeset
221 && (!VAR_P (decl) || !DECL_HAS_VALUE_EXPR_P (decl))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 && !DECL_EXTERNAL (decl))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 {
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
224 /* When reading LTO unit, we also read varpool, so do not
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
225 rebuild it. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
226 if (in_lto_p && !at_end)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
227 ;
111
kono
parents: 67
diff changeset
228 else if (finalize && TREE_CODE (decl) != FUNCTION_DECL)
kono
parents: 67
diff changeset
229 varpool_node::finalize_decl (decl);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
231
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 #ifdef ASM_FINISH_DECLARE_OBJECT
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 if (decl == last_assemble_variable_decl)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 ASM_FINISH_DECLARE_OBJECT (asm_out_file, decl,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 top_level, at_end);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
239
111
kono
parents: 67
diff changeset
240 /* Now that we have activated any function-specific attributes
kono
parents: 67
diff changeset
241 that might affect function decl, particularly align, relayout it. */
kono
parents: 67
diff changeset
242 if (TREE_CODE (decl) == FUNCTION_DECL)
kono
parents: 67
diff changeset
243 targetm.target_option.relayout_function (decl);
kono
parents: 67
diff changeset
244
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 timevar_pop (TV_VARCONST);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 else if (TREE_CODE (decl) == TYPE_DECL
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 /* Like in rest_of_type_compilation, avoid confusing the debug
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 information machinery when there are errors. */
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
250 && !seen_error ())
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 timevar_push (TV_SYMOUT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
253 debug_hooks->type_decl (decl, !top_level);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 timevar_pop (TV_SYMOUT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
256
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
257 /* Let cgraph know about the existence of variables. */
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
258 if (in_lto_p && !at_end)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
259 ;
111
kono
parents: 67
diff changeset
260 else if (VAR_P (decl) && !DECL_EXTERNAL (decl)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
261 && TREE_STATIC (decl))
111
kono
parents: 67
diff changeset
262 varpool_node::get_create (decl);
kono
parents: 67
diff changeset
263
kono
parents: 67
diff changeset
264 /* Generate early debug for global variables. Any local variables will
kono
parents: 67
diff changeset
265 be handled by either handling reachable functions from
kono
parents: 67
diff changeset
266 finalize_compilation_unit (and by consequence, locally scoped
kono
parents: 67
diff changeset
267 symbols), or by rest_of_type_compilation below.
kono
parents: 67
diff changeset
268
kono
parents: 67
diff changeset
269 For Go's hijack of the debug_hooks to implement -fdump-go-spec, pick up
kono
parents: 67
diff changeset
270 function prototypes. Go's debug_hooks will not forward them to the
kono
parents: 67
diff changeset
271 wrapped hooks. */
kono
parents: 67
diff changeset
272 if (!in_lto_p
kono
parents: 67
diff changeset
273 && (TREE_CODE (decl) != FUNCTION_DECL
kono
parents: 67
diff changeset
274 /* This will pick up function prototypes with no bodies,
kono
parents: 67
diff changeset
275 which are not visible in finalize_compilation_unit()
kono
parents: 67
diff changeset
276 while iterating with FOR_EACH_*_FUNCTION through the
kono
parents: 67
diff changeset
277 symbol table. */
kono
parents: 67
diff changeset
278 || (flag_dump_go_spec != NULL
kono
parents: 67
diff changeset
279 && !DECL_SAVED_TREE (decl)
kono
parents: 67
diff changeset
280 && DECL_STRUCT_FUNCTION (decl) == NULL))
kono
parents: 67
diff changeset
281
kono
parents: 67
diff changeset
282 /* We need to check both decl_function_context and
kono
parents: 67
diff changeset
283 current_function_decl here to make sure local extern
kono
parents: 67
diff changeset
284 declarations end up with the correct context.
kono
parents: 67
diff changeset
285
kono
parents: 67
diff changeset
286 For local extern declarations, decl_function_context is
kono
parents: 67
diff changeset
287 empty, but current_function_decl is set to the function where
kono
parents: 67
diff changeset
288 the extern was declared . Without the check for
kono
parents: 67
diff changeset
289 !current_function_decl below, the local extern ends up
kono
parents: 67
diff changeset
290 incorrectly with a top-level context.
kono
parents: 67
diff changeset
291
kono
parents: 67
diff changeset
292 For example:
kono
parents: 67
diff changeset
293
kono
parents: 67
diff changeset
294 namespace S
kono
parents: 67
diff changeset
295 {
kono
parents: 67
diff changeset
296 int
kono
parents: 67
diff changeset
297 f()
kono
parents: 67
diff changeset
298 {
kono
parents: 67
diff changeset
299 {
kono
parents: 67
diff changeset
300 int i = 42;
kono
parents: 67
diff changeset
301 {
kono
parents: 67
diff changeset
302 extern int i; // Local extern declaration.
kono
parents: 67
diff changeset
303 return i;
kono
parents: 67
diff changeset
304 }
kono
parents: 67
diff changeset
305 }
kono
parents: 67
diff changeset
306 }
kono
parents: 67
diff changeset
307 }
kono
parents: 67
diff changeset
308 */
kono
parents: 67
diff changeset
309 && !decl_function_context (decl)
kono
parents: 67
diff changeset
310 && !current_function_decl
kono
parents: 67
diff changeset
311 && DECL_SOURCE_LOCATION (decl) != BUILTINS_LOCATION
kono
parents: 67
diff changeset
312 && (!decl_type_context (decl)
kono
parents: 67
diff changeset
313 /* If we created a varpool node for the decl make sure to
kono
parents: 67
diff changeset
314 call early_global_decl. Otherwise we miss changes
kono
parents: 67
diff changeset
315 introduced by member definitions like
kono
parents: 67
diff changeset
316 struct A { static int staticdatamember; };
kono
parents: 67
diff changeset
317 int A::staticdatamember;
kono
parents: 67
diff changeset
318 and thus have incomplete early debug and late debug
kono
parents: 67
diff changeset
319 called from varpool node removal fails to handle it
kono
parents: 67
diff changeset
320 properly. */
kono
parents: 67
diff changeset
321 || (finalize
kono
parents: 67
diff changeset
322 && VAR_P (decl)
kono
parents: 67
diff changeset
323 && TREE_STATIC (decl) && !DECL_EXTERNAL (decl)))
kono
parents: 67
diff changeset
324 /* Avoid confusing the debug information machinery when there are
kono
parents: 67
diff changeset
325 errors. */
kono
parents: 67
diff changeset
326 && !seen_error ())
kono
parents: 67
diff changeset
327 (*debug_hooks->early_global_decl) (decl);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
328 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
329
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
330 /* Called after finishing a record, union or enumeral type. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
331
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
332 void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
333 rest_of_type_compilation (tree type, int toplev)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
334 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
335 /* Avoid confusing the debug information machinery when there are
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
336 errors. */
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
337 if (seen_error ())
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
338 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
339
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
340 timevar_push (TV_SYMOUT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
341 debug_hooks->type_decl (TYPE_STUB_DECL (type), !toplev);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
342 timevar_pop (TV_SYMOUT);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
343 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
344
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
345
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
346
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
347 void
111
kono
parents: 67
diff changeset
348 pass_manager::
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
349 finish_optimization_passes (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
350 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
351 int i;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
352 struct dump_file_info *dfi;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
353 char *name;
111
kono
parents: 67
diff changeset
354 gcc::dump_manager *dumps = m_ctxt->get_dumps ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
355
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
356 timevar_push (TV_DUMP);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
357 if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
358 {
111
kono
parents: 67
diff changeset
359 dumps->dump_start (pass_profile_1->static_pass_number, NULL);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
360 end_branch_prob ();
111
kono
parents: 67
diff changeset
361 dumps->dump_finish (pass_profile_1->static_pass_number);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
362 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
363
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
364 if (optimize > 0)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
365 {
111
kono
parents: 67
diff changeset
366 dumps->dump_start (pass_profile_1->static_pass_number, NULL);
kono
parents: 67
diff changeset
367 print_combine_total_stats ();
kono
parents: 67
diff changeset
368 dumps->dump_finish (pass_profile_1->static_pass_number);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
369 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
370
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
371 /* Do whatever is necessary to finish printing the graphs. */
111
kono
parents: 67
diff changeset
372 for (i = TDI_end; (dfi = dumps->get_dump_file_info (i)) != NULL; ++i)
kono
parents: 67
diff changeset
373 if (dfi->graph_dump_initialized)
kono
parents: 67
diff changeset
374 {
kono
parents: 67
diff changeset
375 name = dumps->get_dump_file_name (dfi);
kono
parents: 67
diff changeset
376 finish_graph_dump_file (name);
kono
parents: 67
diff changeset
377 free (name);
kono
parents: 67
diff changeset
378 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
379
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
380 timevar_pop (TV_DUMP);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
381 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
382
111
kono
parents: 67
diff changeset
383 static unsigned int
kono
parents: 67
diff changeset
384 execute_build_ssa_passes (void)
kono
parents: 67
diff changeset
385 {
kono
parents: 67
diff changeset
386 /* Once this pass (and its sub-passes) are complete, all functions
kono
parents: 67
diff changeset
387 will be in SSA form. Technically this state change is happening
kono
parents: 67
diff changeset
388 a tad early, since the sub-passes have not yet run, but since
kono
parents: 67
diff changeset
389 none of the sub-passes are IPA passes and do not create new
kono
parents: 67
diff changeset
390 functions, this is ok. We're setting this value for the benefit
kono
parents: 67
diff changeset
391 of IPA passes that follow. */
kono
parents: 67
diff changeset
392 if (symtab->state < IPA_SSA)
kono
parents: 67
diff changeset
393 symtab->state = IPA_SSA;
kono
parents: 67
diff changeset
394 return 0;
kono
parents: 67
diff changeset
395 }
kono
parents: 67
diff changeset
396
kono
parents: 67
diff changeset
397 namespace {
kono
parents: 67
diff changeset
398
kono
parents: 67
diff changeset
399 const pass_data pass_data_build_ssa_passes =
kono
parents: 67
diff changeset
400 {
kono
parents: 67
diff changeset
401 SIMPLE_IPA_PASS, /* type */
kono
parents: 67
diff changeset
402 "build_ssa_passes", /* name */
kono
parents: 67
diff changeset
403 OPTGROUP_NONE, /* optinfo_flags */
kono
parents: 67
diff changeset
404 TV_EARLY_LOCAL, /* tv_id */
kono
parents: 67
diff changeset
405 0, /* properties_required */
kono
parents: 67
diff changeset
406 0, /* properties_provided */
kono
parents: 67
diff changeset
407 0, /* properties_destroyed */
kono
parents: 67
diff changeset
408 0, /* todo_flags_start */
kono
parents: 67
diff changeset
409 /* todo_flags_finish is executed before subpases. For this reason
kono
parents: 67
diff changeset
410 it makes no sense to remove unreachable functions here. */
kono
parents: 67
diff changeset
411 0, /* todo_flags_finish */
kono
parents: 67
diff changeset
412 };
kono
parents: 67
diff changeset
413
kono
parents: 67
diff changeset
414 class pass_build_ssa_passes : public simple_ipa_opt_pass
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
415 {
111
kono
parents: 67
diff changeset
416 public:
kono
parents: 67
diff changeset
417 pass_build_ssa_passes (gcc::context *ctxt)
kono
parents: 67
diff changeset
418 : simple_ipa_opt_pass (pass_data_build_ssa_passes, ctxt)
kono
parents: 67
diff changeset
419 {}
kono
parents: 67
diff changeset
420
kono
parents: 67
diff changeset
421 /* opt_pass methods: */
kono
parents: 67
diff changeset
422 virtual bool gate (function *)
kono
parents: 67
diff changeset
423 {
kono
parents: 67
diff changeset
424 /* Don't bother doing anything if the program has errors. */
kono
parents: 67
diff changeset
425 return (!seen_error () && !in_lto_p);
kono
parents: 67
diff changeset
426 }
kono
parents: 67
diff changeset
427
kono
parents: 67
diff changeset
428 virtual unsigned int execute (function *)
kono
parents: 67
diff changeset
429 {
kono
parents: 67
diff changeset
430 return execute_build_ssa_passes ();
kono
parents: 67
diff changeset
431 }
kono
parents: 67
diff changeset
432
kono
parents: 67
diff changeset
433 }; // class pass_build_ssa_passes
kono
parents: 67
diff changeset
434
kono
parents: 67
diff changeset
435 const pass_data pass_data_chkp_instrumentation_passes =
kono
parents: 67
diff changeset
436 {
kono
parents: 67
diff changeset
437 SIMPLE_IPA_PASS, /* type */
kono
parents: 67
diff changeset
438 "chkp_passes", /* name */
kono
parents: 67
diff changeset
439 OPTGROUP_NONE, /* optinfo_flags */
kono
parents: 67
diff changeset
440 TV_NONE, /* tv_id */
kono
parents: 67
diff changeset
441 0, /* properties_required */
kono
parents: 67
diff changeset
442 0, /* properties_provided */
kono
parents: 67
diff changeset
443 0, /* properties_destroyed */
kono
parents: 67
diff changeset
444 0, /* todo_flags_start */
kono
parents: 67
diff changeset
445 0, /* todo_flags_finish */
kono
parents: 67
diff changeset
446 };
kono
parents: 67
diff changeset
447
kono
parents: 67
diff changeset
448 class pass_chkp_instrumentation_passes : public simple_ipa_opt_pass
kono
parents: 67
diff changeset
449 {
kono
parents: 67
diff changeset
450 public:
kono
parents: 67
diff changeset
451 pass_chkp_instrumentation_passes (gcc::context *ctxt)
kono
parents: 67
diff changeset
452 : simple_ipa_opt_pass (pass_data_chkp_instrumentation_passes, ctxt)
kono
parents: 67
diff changeset
453 {}
kono
parents: 67
diff changeset
454
kono
parents: 67
diff changeset
455 /* opt_pass methods: */
kono
parents: 67
diff changeset
456 virtual bool gate (function *)
kono
parents: 67
diff changeset
457 {
kono
parents: 67
diff changeset
458 /* Don't bother doing anything if the program has errors. */
kono
parents: 67
diff changeset
459 return (flag_check_pointer_bounds
kono
parents: 67
diff changeset
460 && !seen_error () && !in_lto_p);
kono
parents: 67
diff changeset
461 }
kono
parents: 67
diff changeset
462
kono
parents: 67
diff changeset
463 }; // class pass_chkp_instrumentation_passes
kono
parents: 67
diff changeset
464
kono
parents: 67
diff changeset
465 const pass_data pass_data_local_optimization_passes =
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
466 {
111
kono
parents: 67
diff changeset
467 SIMPLE_IPA_PASS, /* type */
kono
parents: 67
diff changeset
468 "opt_local_passes", /* name */
kono
parents: 67
diff changeset
469 OPTGROUP_NONE, /* optinfo_flags */
kono
parents: 67
diff changeset
470 TV_NONE, /* tv_id */
kono
parents: 67
diff changeset
471 0, /* properties_required */
kono
parents: 67
diff changeset
472 0, /* properties_provided */
kono
parents: 67
diff changeset
473 0, /* properties_destroyed */
kono
parents: 67
diff changeset
474 0, /* todo_flags_start */
kono
parents: 67
diff changeset
475 0, /* todo_flags_finish */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
476 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
477
111
kono
parents: 67
diff changeset
478 class pass_local_optimization_passes : public simple_ipa_opt_pass
kono
parents: 67
diff changeset
479 {
kono
parents: 67
diff changeset
480 public:
kono
parents: 67
diff changeset
481 pass_local_optimization_passes (gcc::context *ctxt)
kono
parents: 67
diff changeset
482 : simple_ipa_opt_pass (pass_data_local_optimization_passes, ctxt)
kono
parents: 67
diff changeset
483 {}
kono
parents: 67
diff changeset
484
kono
parents: 67
diff changeset
485 /* opt_pass methods: */
kono
parents: 67
diff changeset
486 virtual bool gate (function *)
kono
parents: 67
diff changeset
487 {
kono
parents: 67
diff changeset
488 /* Don't bother doing anything if the program has errors. */
kono
parents: 67
diff changeset
489 return (!seen_error () && !in_lto_p);
kono
parents: 67
diff changeset
490 }
kono
parents: 67
diff changeset
491
kono
parents: 67
diff changeset
492 }; // class pass_local_optimization_passes
kono
parents: 67
diff changeset
493
kono
parents: 67
diff changeset
494 } // anon namespace
kono
parents: 67
diff changeset
495
kono
parents: 67
diff changeset
496 simple_ipa_opt_pass *
kono
parents: 67
diff changeset
497 make_pass_build_ssa_passes (gcc::context *ctxt)
kono
parents: 67
diff changeset
498 {
kono
parents: 67
diff changeset
499 return new pass_build_ssa_passes (ctxt);
kono
parents: 67
diff changeset
500 }
kono
parents: 67
diff changeset
501
kono
parents: 67
diff changeset
502 simple_ipa_opt_pass *
kono
parents: 67
diff changeset
503 make_pass_chkp_instrumentation_passes (gcc::context *ctxt)
kono
parents: 67
diff changeset
504 {
kono
parents: 67
diff changeset
505 return new pass_chkp_instrumentation_passes (ctxt);
kono
parents: 67
diff changeset
506 }
kono
parents: 67
diff changeset
507
kono
parents: 67
diff changeset
508 simple_ipa_opt_pass *
kono
parents: 67
diff changeset
509 make_pass_local_optimization_passes (gcc::context *ctxt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
510 {
111
kono
parents: 67
diff changeset
511 return new pass_local_optimization_passes (ctxt);
kono
parents: 67
diff changeset
512 }
kono
parents: 67
diff changeset
513
kono
parents: 67
diff changeset
514 namespace {
kono
parents: 67
diff changeset
515
kono
parents: 67
diff changeset
516 const pass_data pass_data_all_early_optimizations =
kono
parents: 67
diff changeset
517 {
kono
parents: 67
diff changeset
518 GIMPLE_PASS, /* type */
kono
parents: 67
diff changeset
519 "early_optimizations", /* name */
kono
parents: 67
diff changeset
520 OPTGROUP_NONE, /* optinfo_flags */
kono
parents: 67
diff changeset
521 TV_NONE, /* tv_id */
kono
parents: 67
diff changeset
522 0, /* properties_required */
kono
parents: 67
diff changeset
523 0, /* properties_provided */
kono
parents: 67
diff changeset
524 0, /* properties_destroyed */
kono
parents: 67
diff changeset
525 0, /* todo_flags_start */
kono
parents: 67
diff changeset
526 0, /* todo_flags_finish */
kono
parents: 67
diff changeset
527 };
kono
parents: 67
diff changeset
528
kono
parents: 67
diff changeset
529 class pass_all_early_optimizations : public gimple_opt_pass
kono
parents: 67
diff changeset
530 {
kono
parents: 67
diff changeset
531 public:
kono
parents: 67
diff changeset
532 pass_all_early_optimizations (gcc::context *ctxt)
kono
parents: 67
diff changeset
533 : gimple_opt_pass (pass_data_all_early_optimizations, ctxt)
kono
parents: 67
diff changeset
534 {}
kono
parents: 67
diff changeset
535
kono
parents: 67
diff changeset
536 /* opt_pass methods: */
kono
parents: 67
diff changeset
537 virtual bool gate (function *)
kono
parents: 67
diff changeset
538 {
kono
parents: 67
diff changeset
539 return (optimize >= 1
kono
parents: 67
diff changeset
540 /* Don't bother doing anything if the program has errors. */
kono
parents: 67
diff changeset
541 && !seen_error ());
kono
parents: 67
diff changeset
542 }
kono
parents: 67
diff changeset
543
kono
parents: 67
diff changeset
544 }; // class pass_all_early_optimizations
kono
parents: 67
diff changeset
545
kono
parents: 67
diff changeset
546 } // anon namespace
kono
parents: 67
diff changeset
547
kono
parents: 67
diff changeset
548 static gimple_opt_pass *
kono
parents: 67
diff changeset
549 make_pass_all_early_optimizations (gcc::context *ctxt)
kono
parents: 67
diff changeset
550 {
kono
parents: 67
diff changeset
551 return new pass_all_early_optimizations (ctxt);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
552 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
553
111
kono
parents: 67
diff changeset
554 namespace {
kono
parents: 67
diff changeset
555
kono
parents: 67
diff changeset
556 const pass_data pass_data_all_optimizations =
kono
parents: 67
diff changeset
557 {
kono
parents: 67
diff changeset
558 GIMPLE_PASS, /* type */
kono
parents: 67
diff changeset
559 "*all_optimizations", /* name */
kono
parents: 67
diff changeset
560 OPTGROUP_NONE, /* optinfo_flags */
kono
parents: 67
diff changeset
561 TV_OPTIMIZE, /* tv_id */
kono
parents: 67
diff changeset
562 0, /* properties_required */
kono
parents: 67
diff changeset
563 0, /* properties_provided */
kono
parents: 67
diff changeset
564 0, /* properties_destroyed */
kono
parents: 67
diff changeset
565 0, /* todo_flags_start */
kono
parents: 67
diff changeset
566 0, /* todo_flags_finish */
kono
parents: 67
diff changeset
567 };
kono
parents: 67
diff changeset
568
kono
parents: 67
diff changeset
569 class pass_all_optimizations : public gimple_opt_pass
kono
parents: 67
diff changeset
570 {
kono
parents: 67
diff changeset
571 public:
kono
parents: 67
diff changeset
572 pass_all_optimizations (gcc::context *ctxt)
kono
parents: 67
diff changeset
573 : gimple_opt_pass (pass_data_all_optimizations, ctxt)
kono
parents: 67
diff changeset
574 {}
kono
parents: 67
diff changeset
575
kono
parents: 67
diff changeset
576 /* opt_pass methods: */
kono
parents: 67
diff changeset
577 virtual bool gate (function *) { return optimize >= 1 && !optimize_debug; }
kono
parents: 67
diff changeset
578
kono
parents: 67
diff changeset
579 }; // class pass_all_optimizations
kono
parents: 67
diff changeset
580
kono
parents: 67
diff changeset
581 } // anon namespace
kono
parents: 67
diff changeset
582
kono
parents: 67
diff changeset
583 static gimple_opt_pass *
kono
parents: 67
diff changeset
584 make_pass_all_optimizations (gcc::context *ctxt)
kono
parents: 67
diff changeset
585 {
kono
parents: 67
diff changeset
586 return new pass_all_optimizations (ctxt);
kono
parents: 67
diff changeset
587 }
kono
parents: 67
diff changeset
588
kono
parents: 67
diff changeset
589 namespace {
kono
parents: 67
diff changeset
590
kono
parents: 67
diff changeset
591 const pass_data pass_data_all_optimizations_g =
kono
parents: 67
diff changeset
592 {
kono
parents: 67
diff changeset
593 GIMPLE_PASS, /* type */
kono
parents: 67
diff changeset
594 "*all_optimizations_g", /* name */
kono
parents: 67
diff changeset
595 OPTGROUP_NONE, /* optinfo_flags */
kono
parents: 67
diff changeset
596 TV_OPTIMIZE, /* tv_id */
kono
parents: 67
diff changeset
597 0, /* properties_required */
kono
parents: 67
diff changeset
598 0, /* properties_provided */
kono
parents: 67
diff changeset
599 0, /* properties_destroyed */
kono
parents: 67
diff changeset
600 0, /* todo_flags_start */
kono
parents: 67
diff changeset
601 0, /* todo_flags_finish */
kono
parents: 67
diff changeset
602 };
kono
parents: 67
diff changeset
603
kono
parents: 67
diff changeset
604 class pass_all_optimizations_g : public gimple_opt_pass
kono
parents: 67
diff changeset
605 {
kono
parents: 67
diff changeset
606 public:
kono
parents: 67
diff changeset
607 pass_all_optimizations_g (gcc::context *ctxt)
kono
parents: 67
diff changeset
608 : gimple_opt_pass (pass_data_all_optimizations_g, ctxt)
kono
parents: 67
diff changeset
609 {}
kono
parents: 67
diff changeset
610
kono
parents: 67
diff changeset
611 /* opt_pass methods: */
kono
parents: 67
diff changeset
612 virtual bool gate (function *) { return optimize >= 1 && optimize_debug; }
kono
parents: 67
diff changeset
613
kono
parents: 67
diff changeset
614 }; // class pass_all_optimizations_g
kono
parents: 67
diff changeset
615
kono
parents: 67
diff changeset
616 } // anon namespace
kono
parents: 67
diff changeset
617
kono
parents: 67
diff changeset
618 static gimple_opt_pass *
kono
parents: 67
diff changeset
619 make_pass_all_optimizations_g (gcc::context *ctxt)
kono
parents: 67
diff changeset
620 {
kono
parents: 67
diff changeset
621 return new pass_all_optimizations_g (ctxt);
kono
parents: 67
diff changeset
622 }
kono
parents: 67
diff changeset
623
kono
parents: 67
diff changeset
624 namespace {
kono
parents: 67
diff changeset
625
kono
parents: 67
diff changeset
626 const pass_data pass_data_rest_of_compilation =
kono
parents: 67
diff changeset
627 {
kono
parents: 67
diff changeset
628 RTL_PASS, /* type */
kono
parents: 67
diff changeset
629 "*rest_of_compilation", /* name */
kono
parents: 67
diff changeset
630 OPTGROUP_NONE, /* optinfo_flags */
kono
parents: 67
diff changeset
631 TV_REST_OF_COMPILATION, /* tv_id */
kono
parents: 67
diff changeset
632 PROP_rtl, /* properties_required */
kono
parents: 67
diff changeset
633 0, /* properties_provided */
kono
parents: 67
diff changeset
634 0, /* properties_destroyed */
kono
parents: 67
diff changeset
635 0, /* todo_flags_start */
kono
parents: 67
diff changeset
636 0, /* todo_flags_finish */
kono
parents: 67
diff changeset
637 };
kono
parents: 67
diff changeset
638
kono
parents: 67
diff changeset
639 class pass_rest_of_compilation : public rtl_opt_pass
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
640 {
111
kono
parents: 67
diff changeset
641 public:
kono
parents: 67
diff changeset
642 pass_rest_of_compilation (gcc::context *ctxt)
kono
parents: 67
diff changeset
643 : rtl_opt_pass (pass_data_rest_of_compilation, ctxt)
kono
parents: 67
diff changeset
644 {}
kono
parents: 67
diff changeset
645
kono
parents: 67
diff changeset
646 /* opt_pass methods: */
kono
parents: 67
diff changeset
647 virtual bool gate (function *)
kono
parents: 67
diff changeset
648 {
kono
parents: 67
diff changeset
649 /* Early return if there were errors. We can run afoul of our
kono
parents: 67
diff changeset
650 consistency checks, and there's not really much point in fixing them. */
kono
parents: 67
diff changeset
651 return !(rtl_dump_and_exit || flag_syntax_only || seen_error ());
kono
parents: 67
diff changeset
652 }
kono
parents: 67
diff changeset
653
kono
parents: 67
diff changeset
654 }; // class pass_rest_of_compilation
kono
parents: 67
diff changeset
655
kono
parents: 67
diff changeset
656 } // anon namespace
kono
parents: 67
diff changeset
657
kono
parents: 67
diff changeset
658 static rtl_opt_pass *
kono
parents: 67
diff changeset
659 make_pass_rest_of_compilation (gcc::context *ctxt)
kono
parents: 67
diff changeset
660 {
kono
parents: 67
diff changeset
661 return new pass_rest_of_compilation (ctxt);
kono
parents: 67
diff changeset
662 }
kono
parents: 67
diff changeset
663
kono
parents: 67
diff changeset
664 namespace {
kono
parents: 67
diff changeset
665
kono
parents: 67
diff changeset
666 const pass_data pass_data_postreload =
kono
parents: 67
diff changeset
667 {
kono
parents: 67
diff changeset
668 RTL_PASS, /* type */
kono
parents: 67
diff changeset
669 "*all-postreload", /* name */
kono
parents: 67
diff changeset
670 OPTGROUP_NONE, /* optinfo_flags */
kono
parents: 67
diff changeset
671 TV_POSTRELOAD, /* tv_id */
kono
parents: 67
diff changeset
672 PROP_rtl, /* properties_required */
kono
parents: 67
diff changeset
673 0, /* properties_provided */
kono
parents: 67
diff changeset
674 0, /* properties_destroyed */
kono
parents: 67
diff changeset
675 0, /* todo_flags_start */
kono
parents: 67
diff changeset
676 0, /* todo_flags_finish */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
677 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
678
111
kono
parents: 67
diff changeset
679 class pass_postreload : public rtl_opt_pass
kono
parents: 67
diff changeset
680 {
kono
parents: 67
diff changeset
681 public:
kono
parents: 67
diff changeset
682 pass_postreload (gcc::context *ctxt)
kono
parents: 67
diff changeset
683 : rtl_opt_pass (pass_data_postreload, ctxt)
kono
parents: 67
diff changeset
684 {}
kono
parents: 67
diff changeset
685
kono
parents: 67
diff changeset
686 /* opt_pass methods: */
kono
parents: 67
diff changeset
687 virtual bool gate (function *) { return reload_completed; }
kono
parents: 67
diff changeset
688
kono
parents: 67
diff changeset
689 }; // class pass_postreload
kono
parents: 67
diff changeset
690
kono
parents: 67
diff changeset
691 } // anon namespace
kono
parents: 67
diff changeset
692
kono
parents: 67
diff changeset
693 static rtl_opt_pass *
kono
parents: 67
diff changeset
694 make_pass_postreload (gcc::context *ctxt)
kono
parents: 67
diff changeset
695 {
kono
parents: 67
diff changeset
696 return new pass_postreload (ctxt);
kono
parents: 67
diff changeset
697 }
kono
parents: 67
diff changeset
698
kono
parents: 67
diff changeset
699 namespace {
kono
parents: 67
diff changeset
700
kono
parents: 67
diff changeset
701 const pass_data pass_data_late_compilation =
kono
parents: 67
diff changeset
702 {
kono
parents: 67
diff changeset
703 RTL_PASS, /* type */
kono
parents: 67
diff changeset
704 "*all-late_compilation", /* name */
kono
parents: 67
diff changeset
705 OPTGROUP_NONE, /* optinfo_flags */
kono
parents: 67
diff changeset
706 TV_LATE_COMPILATION, /* tv_id */
kono
parents: 67
diff changeset
707 PROP_rtl, /* properties_required */
kono
parents: 67
diff changeset
708 0, /* properties_provided */
kono
parents: 67
diff changeset
709 0, /* properties_destroyed */
kono
parents: 67
diff changeset
710 0, /* todo_flags_start */
kono
parents: 67
diff changeset
711 0, /* todo_flags_finish */
kono
parents: 67
diff changeset
712 };
kono
parents: 67
diff changeset
713
kono
parents: 67
diff changeset
714 class pass_late_compilation : public rtl_opt_pass
kono
parents: 67
diff changeset
715 {
kono
parents: 67
diff changeset
716 public:
kono
parents: 67
diff changeset
717 pass_late_compilation (gcc::context *ctxt)
kono
parents: 67
diff changeset
718 : rtl_opt_pass (pass_data_late_compilation, ctxt)
kono
parents: 67
diff changeset
719 {}
kono
parents: 67
diff changeset
720
kono
parents: 67
diff changeset
721 /* opt_pass methods: */
kono
parents: 67
diff changeset
722 virtual bool gate (function *)
kono
parents: 67
diff changeset
723 {
kono
parents: 67
diff changeset
724 return reload_completed || targetm.no_register_allocation;
kono
parents: 67
diff changeset
725 }
kono
parents: 67
diff changeset
726
kono
parents: 67
diff changeset
727 }; // class pass_late_compilation
kono
parents: 67
diff changeset
728
kono
parents: 67
diff changeset
729 } // anon namespace
kono
parents: 67
diff changeset
730
kono
parents: 67
diff changeset
731 static rtl_opt_pass *
kono
parents: 67
diff changeset
732 make_pass_late_compilation (gcc::context *ctxt)
kono
parents: 67
diff changeset
733 {
kono
parents: 67
diff changeset
734 return new pass_late_compilation (ctxt);
kono
parents: 67
diff changeset
735 }
kono
parents: 67
diff changeset
736
kono
parents: 67
diff changeset
737
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
738
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
739 /* Set the static pass number of pass PASS to ID and record that
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
740 in the mapping from static pass number to pass. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
741
111
kono
parents: 67
diff changeset
742 void
kono
parents: 67
diff changeset
743 pass_manager::
kono
parents: 67
diff changeset
744 set_pass_for_id (int id, opt_pass *pass)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
745 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
746 pass->static_pass_number = id;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
747 if (passes_by_id_size <= id)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
748 {
111
kono
parents: 67
diff changeset
749 passes_by_id = XRESIZEVEC (opt_pass *, passes_by_id, id + 1);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
750 memset (passes_by_id + passes_by_id_size, 0,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
751 (id + 1 - passes_by_id_size) * sizeof (void *));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
752 passes_by_id_size = id + 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
753 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
754 passes_by_id[id] = pass;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
755 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
756
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
757 /* Return the pass with the static pass number ID. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
758
111
kono
parents: 67
diff changeset
759 opt_pass *
kono
parents: 67
diff changeset
760 pass_manager::get_pass_for_id (int id) const
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
761 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
762 if (id >= passes_by_id_size)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
763 return NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
764 return passes_by_id[id];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
765 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
766
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
767 /* Iterate over the pass tree allocating dump file numbers. We want
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
768 to do this depth first, and independent of whether the pass is
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
769 enabled or not. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
770
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
771 void
111
kono
parents: 67
diff changeset
772 register_one_dump_file (opt_pass *pass)
kono
parents: 67
diff changeset
773 {
kono
parents: 67
diff changeset
774 g->get_passes ()->register_one_dump_file (pass);
kono
parents: 67
diff changeset
775 }
kono
parents: 67
diff changeset
776
kono
parents: 67
diff changeset
777 void
kono
parents: 67
diff changeset
778 pass_manager::register_one_dump_file (opt_pass *pass)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
779 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
780 char *dot_name, *flag_name, *glob_name;
111
kono
parents: 67
diff changeset
781 const char *name, *full_name, *prefix;
kono
parents: 67
diff changeset
782
kono
parents: 67
diff changeset
783 /* Buffer big enough to format a 32-bit UINT_MAX into. */
kono
parents: 67
diff changeset
784 char num[11];
kono
parents: 67
diff changeset
785 dump_kind dkind;
kono
parents: 67
diff changeset
786 int id;
kono
parents: 67
diff changeset
787 int optgroup_flags = OPTGROUP_NONE;
kono
parents: 67
diff changeset
788 gcc::dump_manager *dumps = m_ctxt->get_dumps ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
789
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
790 /* See below in next_pass_1. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
791 num[0] = '\0';
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
792 if (pass->static_pass_number != -1)
111
kono
parents: 67
diff changeset
793 sprintf (num, "%u", ((int) pass->static_pass_number < 0
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
794 ? 1 : pass->static_pass_number));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
795
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
796 /* 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
797 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
798 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
799 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
800 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
801 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
802 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
803 dot_name = concat (".", name, num, NULL);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
804 if (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS)
111
kono
parents: 67
diff changeset
805 {
kono
parents: 67
diff changeset
806 prefix = "ipa-";
kono
parents: 67
diff changeset
807 dkind = DK_ipa;
kono
parents: 67
diff changeset
808 optgroup_flags |= OPTGROUP_IPA;
kono
parents: 67
diff changeset
809 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
810 else if (pass->type == GIMPLE_PASS)
111
kono
parents: 67
diff changeset
811 {
kono
parents: 67
diff changeset
812 prefix = "tree-";
kono
parents: 67
diff changeset
813 dkind = DK_tree;
kono
parents: 67
diff changeset
814 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
815 else
111
kono
parents: 67
diff changeset
816 {
kono
parents: 67
diff changeset
817 prefix = "rtl-";
kono
parents: 67
diff changeset
818 dkind = DK_rtl;
kono
parents: 67
diff changeset
819 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
820
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
821 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
822 glob_name = concat (prefix, name, NULL);
111
kono
parents: 67
diff changeset
823 optgroup_flags |= pass->optinfo_flags;
kono
parents: 67
diff changeset
824 /* For any passes that do not have an optgroup set, and which are not
kono
parents: 67
diff changeset
825 IPA passes setup above, set the optgroup to OPTGROUP_OTHER so that
kono
parents: 67
diff changeset
826 any dump messages are emitted properly under -fopt-info(-optall). */
kono
parents: 67
diff changeset
827 if (optgroup_flags == OPTGROUP_NONE)
kono
parents: 67
diff changeset
828 optgroup_flags = OPTGROUP_OTHER;
kono
parents: 67
diff changeset
829 id = dumps->dump_register (dot_name, flag_name, glob_name, dkind,
kono
parents: 67
diff changeset
830 optgroup_flags,
kono
parents: 67
diff changeset
831 true);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
832 set_pass_for_id (id, pass);
111
kono
parents: 67
diff changeset
833 full_name = concat (prefix, pass->name, num, NULL);
kono
parents: 67
diff changeset
834 register_pass_name (pass, full_name);
kono
parents: 67
diff changeset
835 free (CONST_CAST (char *, full_name));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
836 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
837
111
kono
parents: 67
diff changeset
838 /* Register the dump files for the pass_manager starting at PASS. */
kono
parents: 67
diff changeset
839
kono
parents: 67
diff changeset
840 void
kono
parents: 67
diff changeset
841 pass_manager::register_dump_files (opt_pass *pass)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
842 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
843 do
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
844 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
845 if (pass->name && pass->name[0] != '*')
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
846 register_one_dump_file (pass);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
847
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
848 if (pass->sub)
111
kono
parents: 67
diff changeset
849 register_dump_files (pass->sub);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
850
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
851 pass = pass->next;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
852 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
853 while (pass);
111
kono
parents: 67
diff changeset
854 }
kono
parents: 67
diff changeset
855
kono
parents: 67
diff changeset
856 /* Register PASS with NAME. */
kono
parents: 67
diff changeset
857
kono
parents: 67
diff changeset
858 void
kono
parents: 67
diff changeset
859 pass_manager::register_pass_name (opt_pass *pass, const char *name)
kono
parents: 67
diff changeset
860 {
kono
parents: 67
diff changeset
861 if (!m_name_to_pass_map)
kono
parents: 67
diff changeset
862 m_name_to_pass_map = new hash_map<nofree_string_hash, opt_pass *> (256);
kono
parents: 67
diff changeset
863
kono
parents: 67
diff changeset
864 if (m_name_to_pass_map->get (name))
kono
parents: 67
diff changeset
865 return; /* Ignore plugin passes. */
kono
parents: 67
diff changeset
866
kono
parents: 67
diff changeset
867 const char *unique_name = xstrdup (name);
kono
parents: 67
diff changeset
868 m_name_to_pass_map->put (unique_name, pass);
kono
parents: 67
diff changeset
869 }
kono
parents: 67
diff changeset
870
kono
parents: 67
diff changeset
871 /* Map from pass id to canonicalized pass name. */
kono
parents: 67
diff changeset
872
kono
parents: 67
diff changeset
873 typedef const char *char_ptr;
kono
parents: 67
diff changeset
874 static vec<char_ptr> pass_tab;
kono
parents: 67
diff changeset
875
kono
parents: 67
diff changeset
876 /* Callback function for traversing NAME_TO_PASS_MAP. */
kono
parents: 67
diff changeset
877
kono
parents: 67
diff changeset
878 bool
kono
parents: 67
diff changeset
879 passes_pass_traverse (const char *const &name, opt_pass *const &pass, void *)
kono
parents: 67
diff changeset
880 {
kono
parents: 67
diff changeset
881 gcc_assert (pass->static_pass_number > 0);
kono
parents: 67
diff changeset
882 gcc_assert (pass_tab.exists ());
kono
parents: 67
diff changeset
883
kono
parents: 67
diff changeset
884 pass_tab[pass->static_pass_number] = name;
kono
parents: 67
diff changeset
885
kono
parents: 67
diff changeset
886 return 1;
kono
parents: 67
diff changeset
887 }
kono
parents: 67
diff changeset
888
kono
parents: 67
diff changeset
889 /* The function traverses NAME_TO_PASS_MAP and creates a pass info
kono
parents: 67
diff changeset
890 table for dumping purpose. */
kono
parents: 67
diff changeset
891
kono
parents: 67
diff changeset
892 void
kono
parents: 67
diff changeset
893 pass_manager::create_pass_tab (void) const
kono
parents: 67
diff changeset
894 {
kono
parents: 67
diff changeset
895 if (!flag_dump_passes)
kono
parents: 67
diff changeset
896 return;
kono
parents: 67
diff changeset
897
kono
parents: 67
diff changeset
898 pass_tab.safe_grow_cleared (passes_by_id_size + 1);
kono
parents: 67
diff changeset
899 m_name_to_pass_map->traverse <void *, passes_pass_traverse> (NULL);
kono
parents: 67
diff changeset
900 }
kono
parents: 67
diff changeset
901
kono
parents: 67
diff changeset
902 static bool override_gate_status (opt_pass *, tree, bool);
kono
parents: 67
diff changeset
903
kono
parents: 67
diff changeset
904 /* Dump the instantiated name for PASS. IS_ON indicates if PASS
kono
parents: 67
diff changeset
905 is turned on or not. */
kono
parents: 67
diff changeset
906
kono
parents: 67
diff changeset
907 static void
kono
parents: 67
diff changeset
908 dump_one_pass (opt_pass *pass, int pass_indent)
kono
parents: 67
diff changeset
909 {
kono
parents: 67
diff changeset
910 int indent = 3 * pass_indent;
kono
parents: 67
diff changeset
911 const char *pn;
kono
parents: 67
diff changeset
912 bool is_on, is_really_on;
kono
parents: 67
diff changeset
913
kono
parents: 67
diff changeset
914 is_on = pass->gate (cfun);
kono
parents: 67
diff changeset
915 is_really_on = override_gate_status (pass, current_function_decl, is_on);
kono
parents: 67
diff changeset
916
kono
parents: 67
diff changeset
917 if (pass->static_pass_number <= 0)
kono
parents: 67
diff changeset
918 pn = pass->name;
kono
parents: 67
diff changeset
919 else
kono
parents: 67
diff changeset
920 pn = pass_tab[pass->static_pass_number];
kono
parents: 67
diff changeset
921
kono
parents: 67
diff changeset
922 fprintf (stderr, "%*s%-40s%*s:%s%s\n", indent, " ", pn,
kono
parents: 67
diff changeset
923 (15 - indent < 0 ? 0 : 15 - indent), " ",
kono
parents: 67
diff changeset
924 is_on ? " ON" : " OFF",
kono
parents: 67
diff changeset
925 ((!is_on) == (!is_really_on) ? ""
kono
parents: 67
diff changeset
926 : (is_really_on ? " (FORCED_ON)" : " (FORCED_OFF)")));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
927 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
928
111
kono
parents: 67
diff changeset
929 /* Dump pass list PASS with indentation INDENT. */
kono
parents: 67
diff changeset
930
kono
parents: 67
diff changeset
931 static void
kono
parents: 67
diff changeset
932 dump_pass_list (opt_pass *pass, int indent)
kono
parents: 67
diff changeset
933 {
kono
parents: 67
diff changeset
934 do
kono
parents: 67
diff changeset
935 {
kono
parents: 67
diff changeset
936 dump_one_pass (pass, indent);
kono
parents: 67
diff changeset
937 if (pass->sub)
kono
parents: 67
diff changeset
938 dump_pass_list (pass->sub, indent + 1);
kono
parents: 67
diff changeset
939 pass = pass->next;
kono
parents: 67
diff changeset
940 }
kono
parents: 67
diff changeset
941 while (pass);
kono
parents: 67
diff changeset
942 }
kono
parents: 67
diff changeset
943
kono
parents: 67
diff changeset
944 /* Dump all optimization passes. */
kono
parents: 67
diff changeset
945
kono
parents: 67
diff changeset
946 void
kono
parents: 67
diff changeset
947 dump_passes (void)
kono
parents: 67
diff changeset
948 {
kono
parents: 67
diff changeset
949 g->get_passes ()->dump_passes ();
kono
parents: 67
diff changeset
950 }
kono
parents: 67
diff changeset
951
kono
parents: 67
diff changeset
952 void
kono
parents: 67
diff changeset
953 pass_manager::dump_passes () const
kono
parents: 67
diff changeset
954 {
kono
parents: 67
diff changeset
955 push_dummy_function (true);
kono
parents: 67
diff changeset
956
kono
parents: 67
diff changeset
957 create_pass_tab ();
kono
parents: 67
diff changeset
958
kono
parents: 67
diff changeset
959 dump_pass_list (all_lowering_passes, 1);
kono
parents: 67
diff changeset
960 dump_pass_list (all_small_ipa_passes, 1);
kono
parents: 67
diff changeset
961 dump_pass_list (all_regular_ipa_passes, 1);
kono
parents: 67
diff changeset
962 dump_pass_list (all_late_ipa_passes, 1);
kono
parents: 67
diff changeset
963 dump_pass_list (all_passes, 1);
kono
parents: 67
diff changeset
964
kono
parents: 67
diff changeset
965 pop_dummy_function ();
kono
parents: 67
diff changeset
966 }
kono
parents: 67
diff changeset
967
kono
parents: 67
diff changeset
968 /* Returns the pass with NAME. */
kono
parents: 67
diff changeset
969
kono
parents: 67
diff changeset
970 opt_pass *
kono
parents: 67
diff changeset
971 pass_manager::get_pass_by_name (const char *name)
kono
parents: 67
diff changeset
972 {
kono
parents: 67
diff changeset
973 opt_pass **p = m_name_to_pass_map->get (name);
kono
parents: 67
diff changeset
974 if (p)
kono
parents: 67
diff changeset
975 return *p;
kono
parents: 67
diff changeset
976
kono
parents: 67
diff changeset
977 return NULL;
kono
parents: 67
diff changeset
978 }
kono
parents: 67
diff changeset
979
kono
parents: 67
diff changeset
980
kono
parents: 67
diff changeset
981 /* Range [start, last]. */
kono
parents: 67
diff changeset
982
kono
parents: 67
diff changeset
983 struct uid_range
kono
parents: 67
diff changeset
984 {
kono
parents: 67
diff changeset
985 unsigned int start;
kono
parents: 67
diff changeset
986 unsigned int last;
kono
parents: 67
diff changeset
987 const char *assem_name;
kono
parents: 67
diff changeset
988 struct uid_range *next;
kono
parents: 67
diff changeset
989 };
kono
parents: 67
diff changeset
990
kono
parents: 67
diff changeset
991 typedef struct uid_range *uid_range_p;
kono
parents: 67
diff changeset
992
kono
parents: 67
diff changeset
993
kono
parents: 67
diff changeset
994 static vec<uid_range_p> enabled_pass_uid_range_tab;
kono
parents: 67
diff changeset
995 static vec<uid_range_p> disabled_pass_uid_range_tab;
kono
parents: 67
diff changeset
996
kono
parents: 67
diff changeset
997
kono
parents: 67
diff changeset
998 /* Parse option string for -fdisable- and -fenable-
kono
parents: 67
diff changeset
999 The syntax of the options:
kono
parents: 67
diff changeset
1000
kono
parents: 67
diff changeset
1001 -fenable-<pass_name>
kono
parents: 67
diff changeset
1002 -fdisable-<pass_name>
kono
parents: 67
diff changeset
1003
kono
parents: 67
diff changeset
1004 -fenable-<pass_name>=s1:e1,s2:e2,...
kono
parents: 67
diff changeset
1005 -fdisable-<pass_name>=s1:e1,s2:e2,...
kono
parents: 67
diff changeset
1006 */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1007
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1008 static void
111
kono
parents: 67
diff changeset
1009 enable_disable_pass (const char *arg, bool is_enable)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1010 {
111
kono
parents: 67
diff changeset
1011 opt_pass *pass;
kono
parents: 67
diff changeset
1012 char *range_str, *phase_name;
kono
parents: 67
diff changeset
1013 char *argstr = xstrdup (arg);
kono
parents: 67
diff changeset
1014 vec<uid_range_p> *tab = 0;
kono
parents: 67
diff changeset
1015
kono
parents: 67
diff changeset
1016 range_str = strchr (argstr,'=');
kono
parents: 67
diff changeset
1017 if (range_str)
kono
parents: 67
diff changeset
1018 {
kono
parents: 67
diff changeset
1019 *range_str = '\0';
kono
parents: 67
diff changeset
1020 range_str++;
kono
parents: 67
diff changeset
1021 }
kono
parents: 67
diff changeset
1022
kono
parents: 67
diff changeset
1023 phase_name = argstr;
kono
parents: 67
diff changeset
1024 if (!*phase_name)
kono
parents: 67
diff changeset
1025 {
kono
parents: 67
diff changeset
1026 if (is_enable)
kono
parents: 67
diff changeset
1027 error ("unrecognized option -fenable");
kono
parents: 67
diff changeset
1028 else
kono
parents: 67
diff changeset
1029 error ("unrecognized option -fdisable");
kono
parents: 67
diff changeset
1030 free (argstr);
kono
parents: 67
diff changeset
1031 return;
kono
parents: 67
diff changeset
1032 }
kono
parents: 67
diff changeset
1033 pass = g->get_passes ()->get_pass_by_name (phase_name);
kono
parents: 67
diff changeset
1034 if (!pass || pass->static_pass_number == -1)
kono
parents: 67
diff changeset
1035 {
kono
parents: 67
diff changeset
1036 if (is_enable)
kono
parents: 67
diff changeset
1037 error ("unknown pass %s specified in -fenable", phase_name);
kono
parents: 67
diff changeset
1038 else
kono
parents: 67
diff changeset
1039 error ("unknown pass %s specified in -fdisable", phase_name);
kono
parents: 67
diff changeset
1040 free (argstr);
kono
parents: 67
diff changeset
1041 return;
kono
parents: 67
diff changeset
1042 }
kono
parents: 67
diff changeset
1043
kono
parents: 67
diff changeset
1044 if (is_enable)
kono
parents: 67
diff changeset
1045 tab = &enabled_pass_uid_range_tab;
kono
parents: 67
diff changeset
1046 else
kono
parents: 67
diff changeset
1047 tab = &disabled_pass_uid_range_tab;
kono
parents: 67
diff changeset
1048
kono
parents: 67
diff changeset
1049 if ((unsigned) pass->static_pass_number >= tab->length ())
kono
parents: 67
diff changeset
1050 tab->safe_grow_cleared (pass->static_pass_number + 1);
kono
parents: 67
diff changeset
1051
kono
parents: 67
diff changeset
1052 if (!range_str)
kono
parents: 67
diff changeset
1053 {
kono
parents: 67
diff changeset
1054 uid_range_p slot;
kono
parents: 67
diff changeset
1055 uid_range_p new_range = XCNEW (struct uid_range);
kono
parents: 67
diff changeset
1056
kono
parents: 67
diff changeset
1057 new_range->start = 0;
kono
parents: 67
diff changeset
1058 new_range->last = (unsigned)-1;
kono
parents: 67
diff changeset
1059
kono
parents: 67
diff changeset
1060 slot = (*tab)[pass->static_pass_number];
kono
parents: 67
diff changeset
1061 new_range->next = slot;
kono
parents: 67
diff changeset
1062 (*tab)[pass->static_pass_number] = new_range;
kono
parents: 67
diff changeset
1063 if (is_enable)
kono
parents: 67
diff changeset
1064 inform (UNKNOWN_LOCATION, "enable pass %s for functions in the range "
kono
parents: 67
diff changeset
1065 "of [%u, %u]", phase_name, new_range->start, new_range->last);
kono
parents: 67
diff changeset
1066 else
kono
parents: 67
diff changeset
1067 inform (UNKNOWN_LOCATION, "disable pass %s for functions in the range "
kono
parents: 67
diff changeset
1068 "of [%u, %u]", phase_name, new_range->start, new_range->last);
kono
parents: 67
diff changeset
1069 }
kono
parents: 67
diff changeset
1070 else
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1071 {
111
kono
parents: 67
diff changeset
1072 char *next_range = NULL;
kono
parents: 67
diff changeset
1073 char *one_range = range_str;
kono
parents: 67
diff changeset
1074 char *end_val = NULL;
kono
parents: 67
diff changeset
1075
kono
parents: 67
diff changeset
1076 do
kono
parents: 67
diff changeset
1077 {
kono
parents: 67
diff changeset
1078 uid_range_p slot;
kono
parents: 67
diff changeset
1079 uid_range_p new_range;
kono
parents: 67
diff changeset
1080 char *invalid = NULL;
kono
parents: 67
diff changeset
1081 long start;
kono
parents: 67
diff changeset
1082 char *func_name = NULL;
kono
parents: 67
diff changeset
1083
kono
parents: 67
diff changeset
1084 next_range = strchr (one_range, ',');
kono
parents: 67
diff changeset
1085 if (next_range)
kono
parents: 67
diff changeset
1086 {
kono
parents: 67
diff changeset
1087 *next_range = '\0';
kono
parents: 67
diff changeset
1088 next_range++;
kono
parents: 67
diff changeset
1089 }
kono
parents: 67
diff changeset
1090
kono
parents: 67
diff changeset
1091 end_val = strchr (one_range, ':');
kono
parents: 67
diff changeset
1092 if (end_val)
kono
parents: 67
diff changeset
1093 {
kono
parents: 67
diff changeset
1094 *end_val = '\0';
kono
parents: 67
diff changeset
1095 end_val++;
kono
parents: 67
diff changeset
1096 }
kono
parents: 67
diff changeset
1097 start = strtol (one_range, &invalid, 10);
kono
parents: 67
diff changeset
1098 if (*invalid || start < 0)
kono
parents: 67
diff changeset
1099 {
kono
parents: 67
diff changeset
1100 if (end_val || (one_range[0] >= '0'
kono
parents: 67
diff changeset
1101 && one_range[0] <= '9'))
kono
parents: 67
diff changeset
1102 {
kono
parents: 67
diff changeset
1103 error ("Invalid range %s in option %s",
kono
parents: 67
diff changeset
1104 one_range,
kono
parents: 67
diff changeset
1105 is_enable ? "-fenable" : "-fdisable");
kono
parents: 67
diff changeset
1106 free (argstr);
kono
parents: 67
diff changeset
1107 return;
kono
parents: 67
diff changeset
1108 }
kono
parents: 67
diff changeset
1109 func_name = one_range;
kono
parents: 67
diff changeset
1110 }
kono
parents: 67
diff changeset
1111 if (!end_val)
kono
parents: 67
diff changeset
1112 {
kono
parents: 67
diff changeset
1113 new_range = XCNEW (struct uid_range);
kono
parents: 67
diff changeset
1114 if (!func_name)
kono
parents: 67
diff changeset
1115 {
kono
parents: 67
diff changeset
1116 new_range->start = (unsigned) start;
kono
parents: 67
diff changeset
1117 new_range->last = (unsigned) start;
kono
parents: 67
diff changeset
1118 }
kono
parents: 67
diff changeset
1119 else
kono
parents: 67
diff changeset
1120 {
kono
parents: 67
diff changeset
1121 new_range->start = (unsigned) -1;
kono
parents: 67
diff changeset
1122 new_range->last = (unsigned) -1;
kono
parents: 67
diff changeset
1123 new_range->assem_name = xstrdup (func_name);
kono
parents: 67
diff changeset
1124 }
kono
parents: 67
diff changeset
1125 }
kono
parents: 67
diff changeset
1126 else
kono
parents: 67
diff changeset
1127 {
kono
parents: 67
diff changeset
1128 long last = strtol (end_val, &invalid, 10);
kono
parents: 67
diff changeset
1129 if (*invalid || last < start)
kono
parents: 67
diff changeset
1130 {
kono
parents: 67
diff changeset
1131 error ("Invalid range %s in option %s",
kono
parents: 67
diff changeset
1132 end_val,
kono
parents: 67
diff changeset
1133 is_enable ? "-fenable" : "-fdisable");
kono
parents: 67
diff changeset
1134 free (argstr);
kono
parents: 67
diff changeset
1135 return;
kono
parents: 67
diff changeset
1136 }
kono
parents: 67
diff changeset
1137 new_range = XCNEW (struct uid_range);
kono
parents: 67
diff changeset
1138 new_range->start = (unsigned) start;
kono
parents: 67
diff changeset
1139 new_range->last = (unsigned) last;
kono
parents: 67
diff changeset
1140 }
kono
parents: 67
diff changeset
1141
kono
parents: 67
diff changeset
1142 slot = (*tab)[pass->static_pass_number];
kono
parents: 67
diff changeset
1143 new_range->next = slot;
kono
parents: 67
diff changeset
1144 (*tab)[pass->static_pass_number] = new_range;
kono
parents: 67
diff changeset
1145 if (is_enable)
kono
parents: 67
diff changeset
1146 {
kono
parents: 67
diff changeset
1147 if (new_range->assem_name)
kono
parents: 67
diff changeset
1148 inform (UNKNOWN_LOCATION,
kono
parents: 67
diff changeset
1149 "enable pass %s for function %s",
kono
parents: 67
diff changeset
1150 phase_name, new_range->assem_name);
kono
parents: 67
diff changeset
1151 else
kono
parents: 67
diff changeset
1152 inform (UNKNOWN_LOCATION,
kono
parents: 67
diff changeset
1153 "enable pass %s for functions in the range of [%u, %u]",
kono
parents: 67
diff changeset
1154 phase_name, new_range->start, new_range->last);
kono
parents: 67
diff changeset
1155 }
kono
parents: 67
diff changeset
1156 else
kono
parents: 67
diff changeset
1157 {
kono
parents: 67
diff changeset
1158 if (new_range->assem_name)
kono
parents: 67
diff changeset
1159 inform (UNKNOWN_LOCATION,
kono
parents: 67
diff changeset
1160 "disable pass %s for function %s",
kono
parents: 67
diff changeset
1161 phase_name, new_range->assem_name);
kono
parents: 67
diff changeset
1162 else
kono
parents: 67
diff changeset
1163 inform (UNKNOWN_LOCATION,
kono
parents: 67
diff changeset
1164 "disable pass %s for functions in the range of [%u, %u]",
kono
parents: 67
diff changeset
1165 phase_name, new_range->start, new_range->last);
kono
parents: 67
diff changeset
1166 }
kono
parents: 67
diff changeset
1167
kono
parents: 67
diff changeset
1168 one_range = next_range;
kono
parents: 67
diff changeset
1169 } while (next_range);
kono
parents: 67
diff changeset
1170 }
kono
parents: 67
diff changeset
1171
kono
parents: 67
diff changeset
1172 free (argstr);
kono
parents: 67
diff changeset
1173 }
kono
parents: 67
diff changeset
1174
kono
parents: 67
diff changeset
1175 /* Enable pass specified by ARG. */
kono
parents: 67
diff changeset
1176
kono
parents: 67
diff changeset
1177 void
kono
parents: 67
diff changeset
1178 enable_pass (const char *arg)
kono
parents: 67
diff changeset
1179 {
kono
parents: 67
diff changeset
1180 enable_disable_pass (arg, true);
kono
parents: 67
diff changeset
1181 }
kono
parents: 67
diff changeset
1182
kono
parents: 67
diff changeset
1183 /* Disable pass specified by ARG. */
kono
parents: 67
diff changeset
1184
kono
parents: 67
diff changeset
1185 void
kono
parents: 67
diff changeset
1186 disable_pass (const char *arg)
kono
parents: 67
diff changeset
1187 {
kono
parents: 67
diff changeset
1188 enable_disable_pass (arg, false);
kono
parents: 67
diff changeset
1189 }
kono
parents: 67
diff changeset
1190
kono
parents: 67
diff changeset
1191 /* Returns true if PASS is explicitly enabled/disabled for FUNC. */
kono
parents: 67
diff changeset
1192
kono
parents: 67
diff changeset
1193 static bool
kono
parents: 67
diff changeset
1194 is_pass_explicitly_enabled_or_disabled (opt_pass *pass,
kono
parents: 67
diff changeset
1195 tree func,
kono
parents: 67
diff changeset
1196 vec<uid_range_p> tab)
kono
parents: 67
diff changeset
1197 {
kono
parents: 67
diff changeset
1198 uid_range_p slot, range;
kono
parents: 67
diff changeset
1199 int cgraph_uid;
kono
parents: 67
diff changeset
1200 const char *aname = NULL;
kono
parents: 67
diff changeset
1201
kono
parents: 67
diff changeset
1202 if (!tab.exists ()
kono
parents: 67
diff changeset
1203 || (unsigned) pass->static_pass_number >= tab.length ()
kono
parents: 67
diff changeset
1204 || pass->static_pass_number == -1)
kono
parents: 67
diff changeset
1205 return false;
kono
parents: 67
diff changeset
1206
kono
parents: 67
diff changeset
1207 slot = tab[pass->static_pass_number];
kono
parents: 67
diff changeset
1208 if (!slot)
kono
parents: 67
diff changeset
1209 return false;
kono
parents: 67
diff changeset
1210
kono
parents: 67
diff changeset
1211 cgraph_uid = func ? cgraph_node::get (func)->uid : 0;
kono
parents: 67
diff changeset
1212 if (func && DECL_ASSEMBLER_NAME_SET_P (func))
kono
parents: 67
diff changeset
1213 aname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (func));
kono
parents: 67
diff changeset
1214
kono
parents: 67
diff changeset
1215 range = slot;
kono
parents: 67
diff changeset
1216 while (range)
kono
parents: 67
diff changeset
1217 {
kono
parents: 67
diff changeset
1218 if ((unsigned) cgraph_uid >= range->start
kono
parents: 67
diff changeset
1219 && (unsigned) cgraph_uid <= range->last)
kono
parents: 67
diff changeset
1220 return true;
kono
parents: 67
diff changeset
1221 if (range->assem_name && aname
kono
parents: 67
diff changeset
1222 && !strcmp (range->assem_name, aname))
kono
parents: 67
diff changeset
1223 return true;
kono
parents: 67
diff changeset
1224 range = range->next;
kono
parents: 67
diff changeset
1225 }
kono
parents: 67
diff changeset
1226
kono
parents: 67
diff changeset
1227 return false;
kono
parents: 67
diff changeset
1228 }
kono
parents: 67
diff changeset
1229
kono
parents: 67
diff changeset
1230
kono
parents: 67
diff changeset
1231 /* Update static_pass_number for passes (and the flag
kono
parents: 67
diff changeset
1232 TODO_mark_first_instance).
kono
parents: 67
diff changeset
1233
kono
parents: 67
diff changeset
1234 Passes are constructed with static_pass_number preinitialized to 0
kono
parents: 67
diff changeset
1235
kono
parents: 67
diff changeset
1236 This field is used in two different ways: initially as instance numbers
kono
parents: 67
diff changeset
1237 of their kind, and then as ids within the entire pass manager.
kono
parents: 67
diff changeset
1238
kono
parents: 67
diff changeset
1239 Within pass_manager::pass_manager:
kono
parents: 67
diff changeset
1240
kono
parents: 67
diff changeset
1241 * In add_pass_instance(), as called by next_pass_1 in
kono
parents: 67
diff changeset
1242 NEXT_PASS in init_optimization_passes
kono
parents: 67
diff changeset
1243
kono
parents: 67
diff changeset
1244 * When the initial instance of a pass within a pass manager is seen,
kono
parents: 67
diff changeset
1245 it is flagged, and its static_pass_number is set to -1
kono
parents: 67
diff changeset
1246
kono
parents: 67
diff changeset
1247 * On subsequent times that it is seen, the static pass number
kono
parents: 67
diff changeset
1248 is decremented each time, so that if there are e.g. 4 dups,
kono
parents: 67
diff changeset
1249 they have static_pass_number -4, 2, 3, 4 respectively (note
kono
parents: 67
diff changeset
1250 how the initial one is negative and gives the count); these
kono
parents: 67
diff changeset
1251 can be thought of as instance numbers of the specific pass
kono
parents: 67
diff changeset
1252
kono
parents: 67
diff changeset
1253 * Within the register_dump_files () traversal, set_pass_for_id()
kono
parents: 67
diff changeset
1254 is called on each pass, using these instance numbers to create
kono
parents: 67
diff changeset
1255 dumpfile switches, and then overwriting them with a pass id,
kono
parents: 67
diff changeset
1256 which are global to the whole pass manager (based on
kono
parents: 67
diff changeset
1257 (TDI_end + current value of extra_dump_files_in_use) ) */
kono
parents: 67
diff changeset
1258
kono
parents: 67
diff changeset
1259 static void
kono
parents: 67
diff changeset
1260 add_pass_instance (opt_pass *new_pass, bool track_duplicates,
kono
parents: 67
diff changeset
1261 opt_pass *initial_pass)
kono
parents: 67
diff changeset
1262 {
kono
parents: 67
diff changeset
1263 /* Are we dealing with the first pass of its kind, or a clone? */
kono
parents: 67
diff changeset
1264 if (new_pass != initial_pass)
kono
parents: 67
diff changeset
1265 {
kono
parents: 67
diff changeset
1266 /* We're dealing with a clone. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1267 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
1268
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1269 /* 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
1270 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
1271 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
1272 Subsequent instances will be > 0 and just the duplicate number. */
111
kono
parents: 67
diff changeset
1273 if ((new_pass->name && new_pass->name[0] != '*') || track_duplicates)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1274 {
111
kono
parents: 67
diff changeset
1275 initial_pass->static_pass_number -= 1;
kono
parents: 67
diff changeset
1276 new_pass->static_pass_number = -initial_pass->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
1277 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1278 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1279 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1280 {
111
kono
parents: 67
diff changeset
1281 /* We're dealing with the first pass of its kind. */
kono
parents: 67
diff changeset
1282 new_pass->todo_flags_start |= TODO_mark_first_instance;
kono
parents: 67
diff changeset
1283 new_pass->static_pass_number = -1;
kono
parents: 67
diff changeset
1284
kono
parents: 67
diff changeset
1285 invoke_plugin_callbacks (PLUGIN_NEW_PASS, new_pass);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1286 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1287 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1288
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1289 /* Add a pass to the pass list. Duplicate the pass if it's already
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1290 in the list. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1291
111
kono
parents: 67
diff changeset
1292 static opt_pass **
kono
parents: 67
diff changeset
1293 next_pass_1 (opt_pass **list, opt_pass *pass, opt_pass *initial_pass)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1294 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1295 /* 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
1296 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
1297
111
kono
parents: 67
diff changeset
1298 add_pass_instance (pass, false, initial_pass);
kono
parents: 67
diff changeset
1299 *list = pass;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1300
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1301 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
1302 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1303
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1304 /* 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
1305 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
1306 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
1307 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
1308 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
1309 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
1310
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1311 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
1312 {
111
kono
parents: 67
diff changeset
1313 opt_pass *pass;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1314 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
1315 };
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1316
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1317 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
1318 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
1319
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1320 /* 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
1321 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
1322
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1323 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
1324 PASS_LIST - root of the pass list to insert the new pass to */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1325
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1326 static bool
111
kono
parents: 67
diff changeset
1327 position_pass (struct register_pass_info *new_pass_info, opt_pass **pass_list)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1328 {
111
kono
parents: 67
diff changeset
1329 opt_pass *pass = *pass_list, *prev_pass = NULL;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1330 bool success = false;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1331
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1332 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
1333 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1334 /* 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
1335 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
1336 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
1337 && pass->name
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1338 && !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
1339 && ((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
1340 || (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
1341 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
1342 || (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
1343 && 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
1344 {
111
kono
parents: 67
diff changeset
1345 opt_pass *new_pass;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1346 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
1347
111
kono
parents: 67
diff changeset
1348 if (new_pass_info->ref_pass_instance_number == 0)
kono
parents: 67
diff changeset
1349 {
kono
parents: 67
diff changeset
1350 new_pass = new_pass_info->pass->clone ();
kono
parents: 67
diff changeset
1351 add_pass_instance (new_pass, true, new_pass_info->pass);
kono
parents: 67
diff changeset
1352 }
kono
parents: 67
diff changeset
1353 else
kono
parents: 67
diff changeset
1354 {
kono
parents: 67
diff changeset
1355 new_pass = new_pass_info->pass;
kono
parents: 67
diff changeset
1356 add_pass_instance (new_pass, true, new_pass);
kono
parents: 67
diff changeset
1357 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1358
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1359 /* 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
1360 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
1361 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1362 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
1363 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
1364 pass->next = new_pass;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1365
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1366 /* 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
1367 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
1368 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
1369 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
1370 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1371 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
1372 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
1373 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
1374 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
1375 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1376 *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
1377 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1378 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
1379 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
1380 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
1381 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
1382 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1383 *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
1384 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
1385 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
1386 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
1387 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1388 default:
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1389 error ("invalid pass positioning operation");
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1390 return false;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1391 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1392
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1393 /* 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
1394 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
1395 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
1396 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
1397 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
1398 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
1399 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
1400 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
1401 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
1402 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1403 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
1404 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
1405
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1406 success = true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1407 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1408
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1409 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
1410 success = true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1411 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1412
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1413 return success;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1414 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1415
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1416 /* 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
1417
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1418 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
1419 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
1420 the pass */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1421
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1422 void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1423 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
1424 {
111
kono
parents: 67
diff changeset
1425 g->get_passes ()->register_pass (pass_info);
kono
parents: 67
diff changeset
1426 }
kono
parents: 67
diff changeset
1427
kono
parents: 67
diff changeset
1428 void
kono
parents: 67
diff changeset
1429 register_pass (opt_pass* pass, pass_positioning_ops pos,
kono
parents: 67
diff changeset
1430 const char* ref_pass_name, int ref_pass_inst_number)
kono
parents: 67
diff changeset
1431 {
kono
parents: 67
diff changeset
1432 register_pass_info i;
kono
parents: 67
diff changeset
1433 i.pass = pass;
kono
parents: 67
diff changeset
1434 i.reference_pass_name = ref_pass_name;
kono
parents: 67
diff changeset
1435 i.ref_pass_instance_number = ref_pass_inst_number;
kono
parents: 67
diff changeset
1436 i.pos_op = pos;
kono
parents: 67
diff changeset
1437
kono
parents: 67
diff changeset
1438 g->get_passes ()->register_pass (&i);
kono
parents: 67
diff changeset
1439 }
kono
parents: 67
diff changeset
1440
kono
parents: 67
diff changeset
1441 void
kono
parents: 67
diff changeset
1442 pass_manager::register_pass (struct register_pass_info *pass_info)
kono
parents: 67
diff changeset
1443 {
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1444 bool all_instances, success;
111
kono
parents: 67
diff changeset
1445 gcc::dump_manager *dumps = m_ctxt->get_dumps ();
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1446
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1447 /* 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
1448 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
1449 the messages. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1450 if (!pass_info->pass)
111
kono
parents: 67
diff changeset
1451 fatal_error (input_location, "plugin cannot register a missing pass");
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1452
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1453 if (!pass_info->pass->name)
111
kono
parents: 67
diff changeset
1454 fatal_error (input_location, "plugin cannot register an unnamed pass");
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1455
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1456 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
1457 fatal_error
111
kono
parents: 67
diff changeset
1458 (input_location,
kono
parents: 67
diff changeset
1459 "plugin cannot register pass %qs without reference pass name",
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1460 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
1461
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1462 /* Try to insert the new pass to the pass lists. We need to check
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1463 all five lists as the reference pass could be in one (or all) of
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1464 them. */
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1465 all_instances = pass_info->ref_pass_instance_number == 0;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1466 success = position_pass (pass_info, &all_lowering_passes);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1467 if (!success || all_instances)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1468 success |= position_pass (pass_info, &all_small_ipa_passes);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1469 if (!success || all_instances)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1470 success |= position_pass (pass_info, &all_regular_ipa_passes);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1471 if (!success || all_instances)
111
kono
parents: 67
diff changeset
1472 success |= position_pass (pass_info, &all_late_ipa_passes);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1473 if (!success || all_instances)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1474 success |= position_pass (pass_info, &all_passes);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1475 if (!success)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1476 fatal_error
111
kono
parents: 67
diff changeset
1477 (input_location,
kono
parents: 67
diff changeset
1478 "pass %qs not found but is referenced by new pass %qs",
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1479 pass_info->reference_pass_name, pass_info->pass->name);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1480
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1481 /* OK, we have successfully inserted the new pass. We need to register
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1482 the dump files for the newly added pass and its duplicates (if any).
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1483 Because the registration of plugin/backend passes happens after the
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1484 command-line options are parsed, the options that specify single
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1485 pass dumping (e.g. -fdump-tree-PASSNAME) cannot be used for new
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1486 passes. Therefore we currently can only enable dumping of
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1487 new passes when the 'dump-all' flags (e.g. -fdump-tree-all)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1488 are specified. While doing so, we also delete the pass_list_node
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1489 objects created during pass positioning. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1490 while (added_pass_nodes)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1491 {
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1492 struct pass_list_node *next_node = added_pass_nodes->next;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1493 enum tree_dump_index tdi;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1494 register_one_dump_file (added_pass_nodes->pass);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1495 if (added_pass_nodes->pass->type == SIMPLE_IPA_PASS
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1496 || added_pass_nodes->pass->type == IPA_PASS)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1497 tdi = TDI_ipa_all;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1498 else if (added_pass_nodes->pass->type == GIMPLE_PASS)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1499 tdi = TDI_tree_all;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1500 else
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1501 tdi = TDI_rtl_all;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1502 /* Check if dump-all flag is specified. */
111
kono
parents: 67
diff changeset
1503 if (dumps->get_dump_file_info (tdi)->pstate)
kono
parents: 67
diff changeset
1504 {
kono
parents: 67
diff changeset
1505 dumps->get_dump_file_info (added_pass_nodes->pass->static_pass_number)
kono
parents: 67
diff changeset
1506 ->pstate = dumps->get_dump_file_info (tdi)->pstate;
kono
parents: 67
diff changeset
1507 dumps->get_dump_file_info (added_pass_nodes->pass->static_pass_number)
kono
parents: 67
diff changeset
1508 ->pflags = dumps->get_dump_file_info (tdi)->pflags;
kono
parents: 67
diff changeset
1509 }
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1510 XDELETE (added_pass_nodes);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1511 added_pass_nodes = next_node;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1512 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1513 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1514
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1515 /* Construct the pass tree. The sequencing of passes is driven by
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1516 the cgraph routines:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1517
111
kono
parents: 67
diff changeset
1518 finalize_compilation_unit ()
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1519 for each node N in the cgraph
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1520 cgraph_analyze_function (N)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1521 cgraph_lower_function (N) -> all_lowering_passes
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1522
111
kono
parents: 67
diff changeset
1523 If we are optimizing, compile is then invoked:
kono
parents: 67
diff changeset
1524
kono
parents: 67
diff changeset
1525 compile ()
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1526 ipa_passes () -> all_small_ipa_passes
111
kono
parents: 67
diff changeset
1527 -> Analysis of all_regular_ipa_passes
kono
parents: 67
diff changeset
1528 * possible LTO streaming at copmilation time *
kono
parents: 67
diff changeset
1529 -> Execution of all_regular_ipa_passes
kono
parents: 67
diff changeset
1530 * possible LTO streaming at link time *
kono
parents: 67
diff changeset
1531 -> all_late_ipa_passes
kono
parents: 67
diff changeset
1532 expand_all_functions ()
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1533 for each node N in the cgraph
111
kono
parents: 67
diff changeset
1534 expand_function (N) -> Transformation of all_regular_ipa_passes
kono
parents: 67
diff changeset
1535 -> all_passes
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1536 */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1537
111
kono
parents: 67
diff changeset
1538 pass_manager::pass_manager (context *ctxt)
kono
parents: 67
diff changeset
1539 : all_passes (NULL), all_small_ipa_passes (NULL), all_lowering_passes (NULL),
kono
parents: 67
diff changeset
1540 all_regular_ipa_passes (NULL),
kono
parents: 67
diff changeset
1541 all_late_ipa_passes (NULL), passes_by_id (NULL), passes_by_id_size (0),
kono
parents: 67
diff changeset
1542 m_ctxt (ctxt), m_name_to_pass_map (NULL)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1543 {
111
kono
parents: 67
diff changeset
1544 opt_pass **p;
kono
parents: 67
diff changeset
1545
kono
parents: 67
diff changeset
1546 /* Zero-initialize pass members. */
kono
parents: 67
diff changeset
1547 #define INSERT_PASSES_AFTER(PASS)
kono
parents: 67
diff changeset
1548 #define PUSH_INSERT_PASSES_WITHIN(PASS)
kono
parents: 67
diff changeset
1549 #define POP_INSERT_PASSES()
kono
parents: 67
diff changeset
1550 #define NEXT_PASS(PASS, NUM) PASS ## _ ## NUM = NULL
kono
parents: 67
diff changeset
1551 #define NEXT_PASS_WITH_ARG(PASS, NUM, ARG) NEXT_PASS (PASS, NUM)
kono
parents: 67
diff changeset
1552 #define TERMINATE_PASS_LIST(PASS)
kono
parents: 67
diff changeset
1553 #include "pass-instances.def"
kono
parents: 67
diff changeset
1554 #undef INSERT_PASSES_AFTER
kono
parents: 67
diff changeset
1555 #undef PUSH_INSERT_PASSES_WITHIN
kono
parents: 67
diff changeset
1556 #undef POP_INSERT_PASSES
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1557 #undef NEXT_PASS
111
kono
parents: 67
diff changeset
1558 #undef NEXT_PASS_WITH_ARG
kono
parents: 67
diff changeset
1559 #undef TERMINATE_PASS_LIST
kono
parents: 67
diff changeset
1560
kono
parents: 67
diff changeset
1561 /* Initialize the pass_lists array. */
kono
parents: 67
diff changeset
1562 #define DEF_PASS_LIST(LIST) pass_lists[PASS_LIST_NO_##LIST] = &LIST;
kono
parents: 67
diff changeset
1563 GCC_PASS_LISTS
kono
parents: 67
diff changeset
1564 #undef DEF_PASS_LIST
kono
parents: 67
diff changeset
1565
kono
parents: 67
diff changeset
1566 /* Build the tree of passes. */
kono
parents: 67
diff changeset
1567
kono
parents: 67
diff changeset
1568 #define INSERT_PASSES_AFTER(PASS) \
kono
parents: 67
diff changeset
1569 { \
kono
parents: 67
diff changeset
1570 opt_pass **p_start; \
kono
parents: 67
diff changeset
1571 p_start = p = &(PASS);
kono
parents: 67
diff changeset
1572
kono
parents: 67
diff changeset
1573 #define TERMINATE_PASS_LIST(PASS) \
kono
parents: 67
diff changeset
1574 gcc_assert (p_start == &PASS); \
kono
parents: 67
diff changeset
1575 *p = NULL; \
kono
parents: 67
diff changeset
1576 }
kono
parents: 67
diff changeset
1577
kono
parents: 67
diff changeset
1578 #define PUSH_INSERT_PASSES_WITHIN(PASS) \
kono
parents: 67
diff changeset
1579 { \
kono
parents: 67
diff changeset
1580 opt_pass **p = &(PASS ## _1)->sub;
kono
parents: 67
diff changeset
1581
kono
parents: 67
diff changeset
1582 #define POP_INSERT_PASSES() \
kono
parents: 67
diff changeset
1583 }
kono
parents: 67
diff changeset
1584
kono
parents: 67
diff changeset
1585 #define NEXT_PASS(PASS, NUM) \
kono
parents: 67
diff changeset
1586 do { \
kono
parents: 67
diff changeset
1587 gcc_assert (NULL == PASS ## _ ## NUM); \
kono
parents: 67
diff changeset
1588 if ((NUM) == 1) \
kono
parents: 67
diff changeset
1589 PASS ## _1 = make_##PASS (m_ctxt); \
kono
parents: 67
diff changeset
1590 else \
kono
parents: 67
diff changeset
1591 { \
kono
parents: 67
diff changeset
1592 gcc_assert (PASS ## _1); \
kono
parents: 67
diff changeset
1593 PASS ## _ ## NUM = PASS ## _1->clone (); \
kono
parents: 67
diff changeset
1594 } \
kono
parents: 67
diff changeset
1595 p = next_pass_1 (p, PASS ## _ ## NUM, PASS ## _1); \
kono
parents: 67
diff changeset
1596 } while (0)
kono
parents: 67
diff changeset
1597
kono
parents: 67
diff changeset
1598 #define NEXT_PASS_WITH_ARG(PASS, NUM, ARG) \
kono
parents: 67
diff changeset
1599 do { \
kono
parents: 67
diff changeset
1600 NEXT_PASS (PASS, NUM); \
kono
parents: 67
diff changeset
1601 PASS ## _ ## NUM->set_pass_param (0, ARG); \
kono
parents: 67
diff changeset
1602 } while (0)
kono
parents: 67
diff changeset
1603
kono
parents: 67
diff changeset
1604 #include "pass-instances.def"
kono
parents: 67
diff changeset
1605
kono
parents: 67
diff changeset
1606 #undef INSERT_PASSES_AFTER
kono
parents: 67
diff changeset
1607 #undef PUSH_INSERT_PASSES_WITHIN
kono
parents: 67
diff changeset
1608 #undef POP_INSERT_PASSES
kono
parents: 67
diff changeset
1609 #undef NEXT_PASS
kono
parents: 67
diff changeset
1610 #undef NEXT_PASS_WITH_ARG
kono
parents: 67
diff changeset
1611 #undef TERMINATE_PASS_LIST
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1612
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1613 /* Register the passes with the tree dump code. */
111
kono
parents: 67
diff changeset
1614 register_dump_files (all_lowering_passes);
kono
parents: 67
diff changeset
1615 register_dump_files (all_small_ipa_passes);
kono
parents: 67
diff changeset
1616 register_dump_files (all_regular_ipa_passes);
kono
parents: 67
diff changeset
1617 register_dump_files (all_late_ipa_passes);
kono
parents: 67
diff changeset
1618 register_dump_files (all_passes);
kono
parents: 67
diff changeset
1619 }
kono
parents: 67
diff changeset
1620
kono
parents: 67
diff changeset
1621 static void
kono
parents: 67
diff changeset
1622 delete_pass_tree (opt_pass *pass)
kono
parents: 67
diff changeset
1623 {
kono
parents: 67
diff changeset
1624 while (pass)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1625 {
111
kono
parents: 67
diff changeset
1626 /* Recurse into child passes. */
kono
parents: 67
diff changeset
1627 delete_pass_tree (pass->sub);
kono
parents: 67
diff changeset
1628
kono
parents: 67
diff changeset
1629 opt_pass *next = pass->next;
kono
parents: 67
diff changeset
1630
kono
parents: 67
diff changeset
1631 /* Delete this pass. */
kono
parents: 67
diff changeset
1632 delete pass;
kono
parents: 67
diff changeset
1633
kono
parents: 67
diff changeset
1634 /* Iterate onto sibling passes. */
kono
parents: 67
diff changeset
1635 pass = next;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1636 }
111
kono
parents: 67
diff changeset
1637 }
kono
parents: 67
diff changeset
1638
kono
parents: 67
diff changeset
1639 pass_manager::~pass_manager ()
kono
parents: 67
diff changeset
1640 {
kono
parents: 67
diff changeset
1641 XDELETEVEC (passes_by_id);
kono
parents: 67
diff changeset
1642
kono
parents: 67
diff changeset
1643 /* Call delete_pass_tree on each of the pass_lists. */
kono
parents: 67
diff changeset
1644 #define DEF_PASS_LIST(LIST) \
kono
parents: 67
diff changeset
1645 delete_pass_tree (*pass_lists[PASS_LIST_NO_##LIST]);
kono
parents: 67
diff changeset
1646 GCC_PASS_LISTS
kono
parents: 67
diff changeset
1647 #undef DEF_PASS_LIST
kono
parents: 67
diff changeset
1648
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1649 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1650
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1651 /* If we are in IPA mode (i.e., current_function_decl is NULL), call
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1652 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
1653 call CALLBACK on the current function. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1654
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1655 static void
111
kono
parents: 67
diff changeset
1656 do_per_function (void (*callback) (function *, void *data), void *data)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1657 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1658 if (current_function_decl)
111
kono
parents: 67
diff changeset
1659 callback (cfun, data);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1660 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1661 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1662 struct cgraph_node *node;
111
kono
parents: 67
diff changeset
1663 FOR_EACH_DEFINED_FUNCTION (node)
kono
parents: 67
diff changeset
1664 if (node->analyzed && (gimple_has_body_p (node->decl) && !in_lto_p)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1665 && (!node->clone_of || node->decl != node->clone_of->decl))
111
kono
parents: 67
diff changeset
1666 callback (DECL_STRUCT_FUNCTION (node->decl), data);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1667 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1668 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1669
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1670 /* Because inlining might remove no-longer reachable nodes, we need to
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1671 keep the array visible to garbage collector to avoid reading collected
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1672 out nodes. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1673 static int nnodes;
111
kono
parents: 67
diff changeset
1674 static GTY ((length ("nnodes"))) cgraph_node **order;
kono
parents: 67
diff changeset
1675
kono
parents: 67
diff changeset
1676 /* Hook called when NODE is removed and therefore should be
kono
parents: 67
diff changeset
1677 excluded from order vector. DATA is an array of integers.
kono
parents: 67
diff changeset
1678 DATA[0] holds max index it may be accessed by. For cgraph
kono
parents: 67
diff changeset
1679 node DATA[node->uid + 1] holds index of this node in order
kono
parents: 67
diff changeset
1680 vector. */
kono
parents: 67
diff changeset
1681 static void
kono
parents: 67
diff changeset
1682 remove_cgraph_node_from_order (cgraph_node *node, void *data)
kono
parents: 67
diff changeset
1683 {
kono
parents: 67
diff changeset
1684 int *order_idx = (int *)data;
kono
parents: 67
diff changeset
1685
kono
parents: 67
diff changeset
1686 if (node->uid >= order_idx[0])
kono
parents: 67
diff changeset
1687 return;
kono
parents: 67
diff changeset
1688
kono
parents: 67
diff changeset
1689 int idx = order_idx[node->uid + 1];
kono
parents: 67
diff changeset
1690 if (idx >= 0 && idx < nnodes && order[idx] == node)
kono
parents: 67
diff changeset
1691 order[idx] = NULL;
kono
parents: 67
diff changeset
1692 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1693
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1694 /* If we are in IPA mode (i.e., current_function_decl is NULL), call
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1695 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
1696 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
1697 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
1698 void
111
kono
parents: 67
diff changeset
1699 do_per_function_toporder (void (*callback) (function *, void *data), void *data)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1700 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1701 int i;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1702
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1703 if (current_function_decl)
111
kono
parents: 67
diff changeset
1704 callback (cfun, data);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1705 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1706 {
111
kono
parents: 67
diff changeset
1707 cgraph_node_hook_list *hook;
kono
parents: 67
diff changeset
1708 int *order_idx;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1709 gcc_assert (!order);
111
kono
parents: 67
diff changeset
1710 order = ggc_vec_alloc<cgraph_node *> (symtab->cgraph_count);
kono
parents: 67
diff changeset
1711
kono
parents: 67
diff changeset
1712 order_idx = XALLOCAVEC (int, symtab->cgraph_max_uid + 1);
kono
parents: 67
diff changeset
1713 memset (order_idx + 1, -1, sizeof (int) * symtab->cgraph_max_uid);
kono
parents: 67
diff changeset
1714 order_idx[0] = symtab->cgraph_max_uid;
kono
parents: 67
diff changeset
1715
kono
parents: 67
diff changeset
1716 nnodes = ipa_reverse_postorder (order);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1717 for (i = nnodes - 1; i >= 0; i--)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1718 {
111
kono
parents: 67
diff changeset
1719 order[i]->process = 1;
kono
parents: 67
diff changeset
1720 order_idx[order[i]->uid + 1] = i;
kono
parents: 67
diff changeset
1721 }
kono
parents: 67
diff changeset
1722 hook = symtab->add_cgraph_removal_hook (remove_cgraph_node_from_order,
kono
parents: 67
diff changeset
1723 order_idx);
kono
parents: 67
diff changeset
1724 for (i = nnodes - 1; i >= 0; i--)
kono
parents: 67
diff changeset
1725 {
kono
parents: 67
diff changeset
1726 /* Function could be inlined and removed as unreachable. */
kono
parents: 67
diff changeset
1727 if (!order[i])
kono
parents: 67
diff changeset
1728 continue;
kono
parents: 67
diff changeset
1729
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1730 struct cgraph_node *node = order[i];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1731
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1732 /* Allow possibly removed nodes to be garbage collected. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1733 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
1734 node->process = 0;
111
kono
parents: 67
diff changeset
1735 if (node->has_gimple_body_p ())
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1736 {
111
kono
parents: 67
diff changeset
1737 struct function *fn = DECL_STRUCT_FUNCTION (node->decl);
kono
parents: 67
diff changeset
1738 push_cfun (fn);
kono
parents: 67
diff changeset
1739 callback (fn, data);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1740 pop_cfun ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1741 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1742 }
111
kono
parents: 67
diff changeset
1743 symtab->remove_cgraph_removal_hook (hook);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1744 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1745 ggc_free (order);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1746 order = NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1747 nnodes = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1748 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1749
111
kono
parents: 67
diff changeset
1750 /* Helper function to perform function body dump. */
kono
parents: 67
diff changeset
1751
kono
parents: 67
diff changeset
1752 static void
kono
parents: 67
diff changeset
1753 execute_function_dump (function *fn, void *data)
kono
parents: 67
diff changeset
1754 {
kono
parents: 67
diff changeset
1755 opt_pass *pass = (opt_pass *)data;
kono
parents: 67
diff changeset
1756
kono
parents: 67
diff changeset
1757 if (dump_file)
kono
parents: 67
diff changeset
1758 {
kono
parents: 67
diff changeset
1759 push_cfun (fn);
kono
parents: 67
diff changeset
1760
kono
parents: 67
diff changeset
1761 if (fn->curr_properties & PROP_trees)
kono
parents: 67
diff changeset
1762 dump_function_to_file (fn->decl, dump_file, dump_flags);
kono
parents: 67
diff changeset
1763 else
kono
parents: 67
diff changeset
1764 print_rtl_with_bb (dump_file, get_insns (), dump_flags);
kono
parents: 67
diff changeset
1765
kono
parents: 67
diff changeset
1766 /* Flush the file. If verification fails, we won't be able to
kono
parents: 67
diff changeset
1767 close the file before aborting. */
kono
parents: 67
diff changeset
1768 fflush (dump_file);
kono
parents: 67
diff changeset
1769
kono
parents: 67
diff changeset
1770 if ((fn->curr_properties & PROP_cfg)
kono
parents: 67
diff changeset
1771 && (dump_flags & TDF_GRAPH))
kono
parents: 67
diff changeset
1772 {
kono
parents: 67
diff changeset
1773 gcc::dump_manager *dumps = g->get_dumps ();
kono
parents: 67
diff changeset
1774 struct dump_file_info *dfi
kono
parents: 67
diff changeset
1775 = dumps->get_dump_file_info (pass->static_pass_number);
kono
parents: 67
diff changeset
1776 if (!dfi->graph_dump_initialized)
kono
parents: 67
diff changeset
1777 {
kono
parents: 67
diff changeset
1778 clean_graph_dump_file (dump_file_name);
kono
parents: 67
diff changeset
1779 dfi->graph_dump_initialized = true;
kono
parents: 67
diff changeset
1780 }
kono
parents: 67
diff changeset
1781 print_graph_cfg (dump_file_name, fn);
kono
parents: 67
diff changeset
1782 }
kono
parents: 67
diff changeset
1783
kono
parents: 67
diff changeset
1784 pop_cfun ();
kono
parents: 67
diff changeset
1785 }
kono
parents: 67
diff changeset
1786 }
kono
parents: 67
diff changeset
1787
kono
parents: 67
diff changeset
1788 /* This function is called when an internal compiler error is encountered.
kono
parents: 67
diff changeset
1789 Ensure that function dump is made available before compiler is aborted. */
kono
parents: 67
diff changeset
1790
kono
parents: 67
diff changeset
1791 void
kono
parents: 67
diff changeset
1792 emergency_dump_function ()
kono
parents: 67
diff changeset
1793 {
kono
parents: 67
diff changeset
1794 if (!current_pass)
kono
parents: 67
diff changeset
1795 return;
kono
parents: 67
diff changeset
1796 enum opt_pass_type pt = current_pass->type;
kono
parents: 67
diff changeset
1797 fnotice (stderr, "during %s pass: %s\n",
kono
parents: 67
diff changeset
1798 pt == GIMPLE_PASS ? "GIMPLE" : pt == RTL_PASS ? "RTL" : "IPA",
kono
parents: 67
diff changeset
1799 current_pass->name);
kono
parents: 67
diff changeset
1800 if (!dump_file || !cfun)
kono
parents: 67
diff changeset
1801 return;
kono
parents: 67
diff changeset
1802 fnotice (stderr, "dump file: %s\n", dump_file_name);
kono
parents: 67
diff changeset
1803 fprintf (dump_file, "\n\n\nEMERGENCY DUMP:\n\n");
kono
parents: 67
diff changeset
1804 execute_function_dump (cfun, current_pass);
kono
parents: 67
diff changeset
1805 }
kono
parents: 67
diff changeset
1806
kono
parents: 67
diff changeset
1807 static struct profile_record *profile_record;
kono
parents: 67
diff changeset
1808
kono
parents: 67
diff changeset
1809 /* Do profile consistency book-keeping for the pass with static number INDEX.
kono
parents: 67
diff changeset
1810 If SUBPASS is zero, we run _before_ the pass, and if SUBPASS is one, then
kono
parents: 67
diff changeset
1811 we run _after_ the pass. RUN is true if the pass really runs, or FALSE
kono
parents: 67
diff changeset
1812 if we are only book-keeping on passes that may have selectively disabled
kono
parents: 67
diff changeset
1813 themselves on a given function. */
kono
parents: 67
diff changeset
1814 static void
kono
parents: 67
diff changeset
1815 check_profile_consistency (int index, int subpass, bool run)
kono
parents: 67
diff changeset
1816 {
kono
parents: 67
diff changeset
1817 pass_manager *passes = g->get_passes ();
kono
parents: 67
diff changeset
1818 if (index == -1)
kono
parents: 67
diff changeset
1819 return;
kono
parents: 67
diff changeset
1820 if (!profile_record)
kono
parents: 67
diff changeset
1821 profile_record = XCNEWVEC (struct profile_record,
kono
parents: 67
diff changeset
1822 passes->passes_by_id_size);
kono
parents: 67
diff changeset
1823 gcc_assert (index < passes->passes_by_id_size && index >= 0);
kono
parents: 67
diff changeset
1824 gcc_assert (subpass < 2);
kono
parents: 67
diff changeset
1825 profile_record[index].run |= run;
kono
parents: 67
diff changeset
1826 account_profile_record (&profile_record[index], subpass);
kono
parents: 67
diff changeset
1827 }
kono
parents: 67
diff changeset
1828
kono
parents: 67
diff changeset
1829 /* Output profile consistency. */
kono
parents: 67
diff changeset
1830
kono
parents: 67
diff changeset
1831 void
kono
parents: 67
diff changeset
1832 dump_profile_report (void)
kono
parents: 67
diff changeset
1833 {
kono
parents: 67
diff changeset
1834 g->get_passes ()->dump_profile_report ();
kono
parents: 67
diff changeset
1835 }
kono
parents: 67
diff changeset
1836
kono
parents: 67
diff changeset
1837 void
kono
parents: 67
diff changeset
1838 pass_manager::dump_profile_report () const
kono
parents: 67
diff changeset
1839 {
kono
parents: 67
diff changeset
1840 int i, j;
kono
parents: 67
diff changeset
1841 int last_freq_in = 0, last_count_in = 0, last_freq_out = 0, last_count_out = 0;
kono
parents: 67
diff changeset
1842 gcov_type last_time = 0, last_size = 0;
kono
parents: 67
diff changeset
1843 double rel_time_change, rel_size_change;
kono
parents: 67
diff changeset
1844 int last_reported = 0;
kono
parents: 67
diff changeset
1845
kono
parents: 67
diff changeset
1846 if (!profile_record)
kono
parents: 67
diff changeset
1847 return;
kono
parents: 67
diff changeset
1848 fprintf (stderr, "\nProfile consistency report:\n\n");
kono
parents: 67
diff changeset
1849 fprintf (stderr, "Pass name |mismatch in |mismated out|Overall\n");
kono
parents: 67
diff changeset
1850 fprintf (stderr, " |freq count |freq count |size time\n");
kono
parents: 67
diff changeset
1851
kono
parents: 67
diff changeset
1852 for (i = 0; i < passes_by_id_size; i++)
kono
parents: 67
diff changeset
1853 for (j = 0 ; j < 2; j++)
kono
parents: 67
diff changeset
1854 if (profile_record[i].run)
kono
parents: 67
diff changeset
1855 {
kono
parents: 67
diff changeset
1856 if (last_time)
kono
parents: 67
diff changeset
1857 rel_time_change = (profile_record[i].time[j]
kono
parents: 67
diff changeset
1858 - (double)last_time) * 100 / (double)last_time;
kono
parents: 67
diff changeset
1859 else
kono
parents: 67
diff changeset
1860 rel_time_change = 0;
kono
parents: 67
diff changeset
1861 if (last_size)
kono
parents: 67
diff changeset
1862 rel_size_change = (profile_record[i].size[j]
kono
parents: 67
diff changeset
1863 - (double)last_size) * 100 / (double)last_size;
kono
parents: 67
diff changeset
1864 else
kono
parents: 67
diff changeset
1865 rel_size_change = 0;
kono
parents: 67
diff changeset
1866
kono
parents: 67
diff changeset
1867 if (profile_record[i].num_mismatched_freq_in[j] != last_freq_in
kono
parents: 67
diff changeset
1868 || profile_record[i].num_mismatched_freq_out[j] != last_freq_out
kono
parents: 67
diff changeset
1869 || profile_record[i].num_mismatched_count_in[j] != last_count_in
kono
parents: 67
diff changeset
1870 || profile_record[i].num_mismatched_count_out[j] != last_count_out
kono
parents: 67
diff changeset
1871 || rel_time_change || rel_size_change)
kono
parents: 67
diff changeset
1872 {
kono
parents: 67
diff changeset
1873 last_reported = i;
kono
parents: 67
diff changeset
1874 fprintf (stderr, "%-20s %s",
kono
parents: 67
diff changeset
1875 passes_by_id [i]->name,
kono
parents: 67
diff changeset
1876 j ? "(after TODO)" : " ");
kono
parents: 67
diff changeset
1877 if (profile_record[i].num_mismatched_freq_in[j] != last_freq_in)
kono
parents: 67
diff changeset
1878 fprintf (stderr, "| %+5i",
kono
parents: 67
diff changeset
1879 profile_record[i].num_mismatched_freq_in[j]
kono
parents: 67
diff changeset
1880 - last_freq_in);
kono
parents: 67
diff changeset
1881 else
kono
parents: 67
diff changeset
1882 fprintf (stderr, "| ");
kono
parents: 67
diff changeset
1883 if (profile_record[i].num_mismatched_count_in[j] != last_count_in)
kono
parents: 67
diff changeset
1884 fprintf (stderr, " %+5i",
kono
parents: 67
diff changeset
1885 profile_record[i].num_mismatched_count_in[j]
kono
parents: 67
diff changeset
1886 - last_count_in);
kono
parents: 67
diff changeset
1887 else
kono
parents: 67
diff changeset
1888 fprintf (stderr, " ");
kono
parents: 67
diff changeset
1889 if (profile_record[i].num_mismatched_freq_out[j] != last_freq_out)
kono
parents: 67
diff changeset
1890 fprintf (stderr, "| %+5i",
kono
parents: 67
diff changeset
1891 profile_record[i].num_mismatched_freq_out[j]
kono
parents: 67
diff changeset
1892 - last_freq_out);
kono
parents: 67
diff changeset
1893 else
kono
parents: 67
diff changeset
1894 fprintf (stderr, "| ");
kono
parents: 67
diff changeset
1895 if (profile_record[i].num_mismatched_count_out[j] != last_count_out)
kono
parents: 67
diff changeset
1896 fprintf (stderr, " %+5i",
kono
parents: 67
diff changeset
1897 profile_record[i].num_mismatched_count_out[j]
kono
parents: 67
diff changeset
1898 - last_count_out);
kono
parents: 67
diff changeset
1899 else
kono
parents: 67
diff changeset
1900 fprintf (stderr, " ");
kono
parents: 67
diff changeset
1901
kono
parents: 67
diff changeset
1902 /* Size/time units change across gimple and RTL. */
kono
parents: 67
diff changeset
1903 if (i == pass_expand_1->static_pass_number)
kono
parents: 67
diff changeset
1904 fprintf (stderr, "|----------");
kono
parents: 67
diff changeset
1905 else
kono
parents: 67
diff changeset
1906 {
kono
parents: 67
diff changeset
1907 if (rel_size_change)
kono
parents: 67
diff changeset
1908 fprintf (stderr, "| %+8.4f%%", rel_size_change);
kono
parents: 67
diff changeset
1909 else
kono
parents: 67
diff changeset
1910 fprintf (stderr, "| ");
kono
parents: 67
diff changeset
1911 if (rel_time_change)
kono
parents: 67
diff changeset
1912 fprintf (stderr, " %+8.4f%%", rel_time_change);
kono
parents: 67
diff changeset
1913 }
kono
parents: 67
diff changeset
1914 fprintf (stderr, "\n");
kono
parents: 67
diff changeset
1915 last_freq_in = profile_record[i].num_mismatched_freq_in[j];
kono
parents: 67
diff changeset
1916 last_freq_out = profile_record[i].num_mismatched_freq_out[j];
kono
parents: 67
diff changeset
1917 last_count_in = profile_record[i].num_mismatched_count_in[j];
kono
parents: 67
diff changeset
1918 last_count_out = profile_record[i].num_mismatched_count_out[j];
kono
parents: 67
diff changeset
1919 }
kono
parents: 67
diff changeset
1920 else if (j && last_reported != i)
kono
parents: 67
diff changeset
1921 {
kono
parents: 67
diff changeset
1922 last_reported = i;
kono
parents: 67
diff changeset
1923 fprintf (stderr, "%-20s ------------| | |\n",
kono
parents: 67
diff changeset
1924 passes_by_id [i]->name);
kono
parents: 67
diff changeset
1925 }
kono
parents: 67
diff changeset
1926 last_time = profile_record[i].time[j];
kono
parents: 67
diff changeset
1927 last_size = profile_record[i].size[j];
kono
parents: 67
diff changeset
1928 }
kono
parents: 67
diff changeset
1929 }
kono
parents: 67
diff changeset
1930
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1931 /* Perform all TODO actions that ought to be done on each function. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1932
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1933 static void
111
kono
parents: 67
diff changeset
1934 execute_function_todo (function *fn, void *data)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1935 {
111
kono
parents: 67
diff changeset
1936 bool from_ipa_pass = (cfun == NULL);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1937 unsigned int flags = (size_t)data;
111
kono
parents: 67
diff changeset
1938 flags &= ~fn->last_verified;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1939 if (!flags)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1940 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1941
111
kono
parents: 67
diff changeset
1942 push_cfun (fn);
kono
parents: 67
diff changeset
1943
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1944 /* Always cleanup the CFG before trying to update SSA. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1945 if (flags & TODO_cleanup_cfg)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1946 {
111
kono
parents: 67
diff changeset
1947 cleanup_tree_cfg ();
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1948
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1949 /* When cleanup_tree_cfg merges consecutive blocks, it may
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1950 perform some simplistic propagation when removing single
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1951 valued PHI nodes. This propagation may, in turn, cause the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1952 SSA form to become out-of-date (see PR 22037). So, even
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1953 if the parent pass had not scheduled an SSA update, we may
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1954 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
1955 if (!(flags & TODO_update_ssa_any) && need_ssa_update_p (cfun))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1956 flags |= TODO_update_ssa;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1957 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1958
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1959 if (flags & TODO_update_ssa_any)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1960 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1961 unsigned update_flags = flags & TODO_update_ssa_any;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1962 update_ssa (update_flags);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1963 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1964
111
kono
parents: 67
diff changeset
1965 if (flag_tree_pta && (flags & TODO_rebuild_alias))
kono
parents: 67
diff changeset
1966 compute_may_aliases ();
kono
parents: 67
diff changeset
1967
kono
parents: 67
diff changeset
1968 if (optimize && (flags & TODO_update_address_taken))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1969 execute_update_addresses_taken ();
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1970
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1971 if (flags & TODO_remove_unused_locals)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1972 remove_unused_locals ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1973
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1974 if (flags & TODO_rebuild_frequencies)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1975 rebuild_frequencies ();
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1976
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1977 if (flags & TODO_rebuild_cgraph_edges)
111
kono
parents: 67
diff changeset
1978 cgraph_edge::rebuild_edges ();
kono
parents: 67
diff changeset
1979
kono
parents: 67
diff changeset
1980 gcc_assert (dom_info_state (fn, CDI_POST_DOMINATORS) == DOM_NONE);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1981 /* If we've seen errors do not bother running any verifiers. */
111
kono
parents: 67
diff changeset
1982 if (flag_checking && !seen_error ())
kono
parents: 67
diff changeset
1983 {
kono
parents: 67
diff changeset
1984 dom_state pre_verify_state = dom_info_state (fn, CDI_DOMINATORS);
kono
parents: 67
diff changeset
1985 dom_state pre_verify_pstate = dom_info_state (fn, CDI_POST_DOMINATORS);
kono
parents: 67
diff changeset
1986
kono
parents: 67
diff changeset
1987 if (flags & TODO_verify_il)
kono
parents: 67
diff changeset
1988 {
kono
parents: 67
diff changeset
1989 if (cfun->curr_properties & PROP_trees)
kono
parents: 67
diff changeset
1990 {
kono
parents: 67
diff changeset
1991 if (cfun->curr_properties & PROP_cfg)
kono
parents: 67
diff changeset
1992 /* IPA passes leave stmts to be fixed up, so make sure to
kono
parents: 67
diff changeset
1993 not verify stmts really throw. */
kono
parents: 67
diff changeset
1994 verify_gimple_in_cfg (cfun, !from_ipa_pass);
kono
parents: 67
diff changeset
1995 else
kono
parents: 67
diff changeset
1996 verify_gimple_in_seq (gimple_body (cfun->decl));
kono
parents: 67
diff changeset
1997 }
kono
parents: 67
diff changeset
1998 if (cfun->curr_properties & PROP_ssa)
kono
parents: 67
diff changeset
1999 /* IPA passes leave stmts to be fixed up, so make sure to
kono
parents: 67
diff changeset
2000 not verify SSA operands whose verifier will choke on that. */
kono
parents: 67
diff changeset
2001 verify_ssa (true, !from_ipa_pass);
kono
parents: 67
diff changeset
2002 /* IPA passes leave basic-blocks unsplit, so make sure to
kono
parents: 67
diff changeset
2003 not trip on that. */
kono
parents: 67
diff changeset
2004 if ((cfun->curr_properties & PROP_cfg)
kono
parents: 67
diff changeset
2005 && !from_ipa_pass)
kono
parents: 67
diff changeset
2006 verify_flow_info ();
kono
parents: 67
diff changeset
2007 if (current_loops
kono
parents: 67
diff changeset
2008 && ! loops_state_satisfies_p (LOOPS_NEED_FIXUP))
kono
parents: 67
diff changeset
2009 {
kono
parents: 67
diff changeset
2010 verify_loop_structure ();
kono
parents: 67
diff changeset
2011 if (loops_state_satisfies_p (LOOP_CLOSED_SSA))
kono
parents: 67
diff changeset
2012 verify_loop_closed_ssa (false);
kono
parents: 67
diff changeset
2013 }
kono
parents: 67
diff changeset
2014 if (cfun->curr_properties & PROP_rtl)
kono
parents: 67
diff changeset
2015 verify_rtl_sharing ();
kono
parents: 67
diff changeset
2016 }
kono
parents: 67
diff changeset
2017
kono
parents: 67
diff changeset
2018 /* Make sure verifiers don't change dominator state. */
kono
parents: 67
diff changeset
2019 gcc_assert (dom_info_state (fn, CDI_DOMINATORS) == pre_verify_state);
kono
parents: 67
diff changeset
2020 gcc_assert (dom_info_state (fn, CDI_POST_DOMINATORS) == pre_verify_pstate);
kono
parents: 67
diff changeset
2021 }
kono
parents: 67
diff changeset
2022
kono
parents: 67
diff changeset
2023 fn->last_verified = flags & TODO_verify_all;
kono
parents: 67
diff changeset
2024
kono
parents: 67
diff changeset
2025 pop_cfun ();
kono
parents: 67
diff changeset
2026
kono
parents: 67
diff changeset
2027 /* For IPA passes make sure to release dominator info, it can be
kono
parents: 67
diff changeset
2028 computed by non-verifying TODOs. */
kono
parents: 67
diff changeset
2029 if (from_ipa_pass)
kono
parents: 67
diff changeset
2030 {
kono
parents: 67
diff changeset
2031 free_dominance_info (fn, CDI_DOMINATORS);
kono
parents: 67
diff changeset
2032 free_dominance_info (fn, CDI_POST_DOMINATORS);
kono
parents: 67
diff changeset
2033 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2034 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2035
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2036 /* Perform all TODO actions. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2037 static void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2038 execute_todo (unsigned int flags)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2039 {
111
kono
parents: 67
diff changeset
2040 if (flag_checking
kono
parents: 67
diff changeset
2041 && cfun
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2042 && need_ssa_update_p (cfun))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2043 gcc_assert (flags & TODO_update_ssa_any);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2044
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2045 statistics_fini_pass ();
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2046
111
kono
parents: 67
diff changeset
2047 if (flags)
kono
parents: 67
diff changeset
2048 do_per_function (execute_function_todo, (void *)(size_t) flags);
kono
parents: 67
diff changeset
2049
kono
parents: 67
diff changeset
2050 /* At this point we should not have any unreachable code in the
kono
parents: 67
diff changeset
2051 CFG, so it is safe to flush the pending freelist for SSA_NAMES. */
kono
parents: 67
diff changeset
2052 if (cfun && cfun->gimple_df)
kono
parents: 67
diff changeset
2053 flush_ssaname_freelist ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2054
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2055 /* Always remove functions just as before inlining: IPA passes might be
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2056 interested to see bodies of extern inline functions that are not inlined
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2057 to analyze side effects. The full removal is done just at the end
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2058 of IPA pass queue. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2059 if (flags & TODO_remove_functions)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2060 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2061 gcc_assert (!cfun);
111
kono
parents: 67
diff changeset
2062 symtab->remove_unreachable_nodes (dump_file);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2063 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2064
111
kono
parents: 67
diff changeset
2065 if ((flags & TODO_dump_symtab) && dump_file && !current_function_decl)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2066 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2067 gcc_assert (!cfun);
111
kono
parents: 67
diff changeset
2068 symtab->dump (dump_file);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2069 /* Flush the file. If verification fails, we won't be able to
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2070 close the file before aborting. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2071 fflush (dump_file);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2072 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2073
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2074 /* Now that the dumping has been done, we can get rid of the optional
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2075 df problems. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2076 if (flags & TODO_df_finish)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2077 df_finish_pass ((flags & TODO_df_verify) != 0);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2078 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2079
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2080 /* Verify invariants that should hold between passes. This is a place
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2081 to put simple sanity checks. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2082
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2083 static void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2084 verify_interpass_invariants (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2085 {
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2086 gcc_checking_assert (!fold_deferring_overflow_warnings_p ());
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2087 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2088
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2089 /* Clear the last verified flag. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2090
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2091 static void
111
kono
parents: 67
diff changeset
2092 clear_last_verified (function *fn, void *data ATTRIBUTE_UNUSED)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2093 {
111
kono
parents: 67
diff changeset
2094 fn->last_verified = 0;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2095 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2096
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2097 /* Helper function. Verify that the properties has been turn into the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2098 properties expected by the pass. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2099
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2100 static void
111
kono
parents: 67
diff changeset
2101 verify_curr_properties (function *fn, void *data)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2102 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2103 unsigned int props = (size_t)data;
111
kono
parents: 67
diff changeset
2104 gcc_assert ((fn->curr_properties & props) == props);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2105 }
111
kono
parents: 67
diff changeset
2106
kono
parents: 67
diff changeset
2107 /* Release dump file name if set. */
kono
parents: 67
diff changeset
2108
kono
parents: 67
diff changeset
2109 static void
kono
parents: 67
diff changeset
2110 release_dump_file_name (void)
kono
parents: 67
diff changeset
2111 {
kono
parents: 67
diff changeset
2112 if (dump_file_name)
kono
parents: 67
diff changeset
2113 {
kono
parents: 67
diff changeset
2114 free (CONST_CAST (char *, dump_file_name));
kono
parents: 67
diff changeset
2115 dump_file_name = NULL;
kono
parents: 67
diff changeset
2116 }
kono
parents: 67
diff changeset
2117 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2118
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2119 /* 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
2120 /* This is non-static so that the plugins can use it. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2121
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2122 bool
111
kono
parents: 67
diff changeset
2123 pass_init_dump_file (opt_pass *pass)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2124 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2125 /* If a dump file name is present, open it if enabled. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2126 if (pass->static_pass_number != -1)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2127 {
111
kono
parents: 67
diff changeset
2128 timevar_push (TV_DUMP);
kono
parents: 67
diff changeset
2129 gcc::dump_manager *dumps = g->get_dumps ();
kono
parents: 67
diff changeset
2130 bool initializing_dump =
kono
parents: 67
diff changeset
2131 !dumps->dump_initialized_p (pass->static_pass_number);
kono
parents: 67
diff changeset
2132 release_dump_file_name ();
kono
parents: 67
diff changeset
2133 dump_file_name = dumps->get_dump_file_name (pass->static_pass_number);
kono
parents: 67
diff changeset
2134 dumps->dump_start (pass->static_pass_number, &dump_flags);
kono
parents: 67
diff changeset
2135 if (dump_file && current_function_decl && ! (dump_flags & TDF_GIMPLE))
kono
parents: 67
diff changeset
2136 dump_function_header (dump_file, current_function_decl, dump_flags);
kono
parents: 67
diff changeset
2137 if (initializing_dump
kono
parents: 67
diff changeset
2138 && dump_file && (dump_flags & TDF_GRAPH)
kono
parents: 67
diff changeset
2139 && cfun && (cfun->curr_properties & PROP_cfg))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2140 {
111
kono
parents: 67
diff changeset
2141 clean_graph_dump_file (dump_file_name);
kono
parents: 67
diff changeset
2142 struct dump_file_info *dfi
kono
parents: 67
diff changeset
2143 = dumps->get_dump_file_info (pass->static_pass_number);
kono
parents: 67
diff changeset
2144 dfi->graph_dump_initialized = true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2145 }
111
kono
parents: 67
diff changeset
2146 timevar_pop (TV_DUMP);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2147 return initializing_dump;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2148 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2149 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2150 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2151 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2152
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2153 /* 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
2154 /* This is non-static so that plugins can use it. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2155
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2156 void
111
kono
parents: 67
diff changeset
2157 pass_fini_dump_file (opt_pass *pass)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2158 {
111
kono
parents: 67
diff changeset
2159 timevar_push (TV_DUMP);
kono
parents: 67
diff changeset
2160
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2161 /* Flush and close dump file. */
111
kono
parents: 67
diff changeset
2162 release_dump_file_name ();
kono
parents: 67
diff changeset
2163
kono
parents: 67
diff changeset
2164 g->get_dumps ()->dump_finish (pass->static_pass_number);
kono
parents: 67
diff changeset
2165 timevar_pop (TV_DUMP);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2166 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2167
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2168 /* After executing the pass, apply expected changes to the function
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2169 properties. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2170
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2171 static void
111
kono
parents: 67
diff changeset
2172 update_properties_after_pass (function *fn, void *data)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2173 {
111
kono
parents: 67
diff changeset
2174 opt_pass *pass = (opt_pass *) data;
kono
parents: 67
diff changeset
2175 fn->curr_properties = (fn->curr_properties | pass->properties_provided)
kono
parents: 67
diff changeset
2176 & ~pass->properties_destroyed;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2177 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2178
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2179 /* Execute summary generation for all of the passes in IPA_PASS. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2180
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2181 void
111
kono
parents: 67
diff changeset
2182 execute_ipa_summary_passes (ipa_opt_pass_d *ipa_pass)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2183 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2184 while (ipa_pass)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2185 {
111
kono
parents: 67
diff changeset
2186 opt_pass *pass = ipa_pass;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2187
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2188 /* Execute all of the IPA_PASSes in the list. */
111
kono
parents: 67
diff changeset
2189 if (ipa_pass->type == IPA_PASS
kono
parents: 67
diff changeset
2190 && pass->gate (cfun)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2191 && ipa_pass->generate_summary)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2192 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2193 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
2194
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2195 /* 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
2196 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
2197 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
2198
111
kono
parents: 67
diff changeset
2199 current_pass = pass;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2200 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
2201
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2202 /* Stop timevar. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2203 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
2204 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
2205
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2206 pass_fini_dump_file (pass);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2207 }
111
kono
parents: 67
diff changeset
2208 ipa_pass = (ipa_opt_pass_d *)ipa_pass->next;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2209 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2210 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2211
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2212 /* Execute IPA_PASS function transform on NODE. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2213
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2214 static void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2215 execute_one_ipa_transform_pass (struct cgraph_node *node,
111
kono
parents: 67
diff changeset
2216 ipa_opt_pass_d *ipa_pass)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2217 {
111
kono
parents: 67
diff changeset
2218 opt_pass *pass = ipa_pass;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2219 unsigned int todo_after = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2220
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2221 current_pass = pass;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2222 if (!ipa_pass->function_transform)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2223 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2224
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2225 /* Note that the folders should only create gimple expressions.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2226 This is a hack until the new folder is ready. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2227 in_gimple_form = (cfun && (cfun->curr_properties & PROP_trees)) != 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2228
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2229 pass_init_dump_file (pass);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2230
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2231 /* 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
2232 if (pass->tv_id != TV_NONE)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2233 timevar_push (pass->tv_id);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2234
111
kono
parents: 67
diff changeset
2235 /* Run pre-pass verification. */
kono
parents: 67
diff changeset
2236 execute_todo (ipa_pass->function_transform_todo_flags_start);
kono
parents: 67
diff changeset
2237
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2238 /* Do it! */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2239 todo_after = ipa_pass->function_transform (node);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2240
111
kono
parents: 67
diff changeset
2241 if (profile_report && cfun && (cfun->curr_properties & PROP_cfg))
kono
parents: 67
diff changeset
2242 check_profile_consistency (pass->static_pass_number, 0, true);
kono
parents: 67
diff changeset
2243
kono
parents: 67
diff changeset
2244 /* Run post-pass cleanup and verification. */
kono
parents: 67
diff changeset
2245 execute_todo (todo_after);
kono
parents: 67
diff changeset
2246 verify_interpass_invariants ();
kono
parents: 67
diff changeset
2247 if (profile_report && cfun && (cfun->curr_properties & PROP_cfg))
kono
parents: 67
diff changeset
2248 check_profile_consistency (pass->static_pass_number, 1, true);
kono
parents: 67
diff changeset
2249
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2250 /* 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
2251 if (pass->tv_id != TV_NONE)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2252 timevar_pop (pass->tv_id);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2253
111
kono
parents: 67
diff changeset
2254 if (dump_file)
kono
parents: 67
diff changeset
2255 do_per_function (execute_function_dump, pass);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2256 pass_fini_dump_file (pass);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2257
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2258 current_pass = NULL;
111
kono
parents: 67
diff changeset
2259 redirect_edge_var_map_empty ();
kono
parents: 67
diff changeset
2260
kono
parents: 67
diff changeset
2261 /* Signal this is a suitable GC collection point. */
kono
parents: 67
diff changeset
2262 if (!(todo_after & TODO_do_not_ggc_collect))
kono
parents: 67
diff changeset
2263 ggc_collect ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2264 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2265
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2266 /* 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
2267
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2268 void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2269 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
2270 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2271 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
2272 if (!cfun)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2273 return;
111
kono
parents: 67
diff changeset
2274 node = cgraph_node::get (current_function_decl);
kono
parents: 67
diff changeset
2275
kono
parents: 67
diff changeset
2276 if (node->ipa_transforms_to_apply.exists ())
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2277 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2278 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
2279
111
kono
parents: 67
diff changeset
2280 for (i = 0; i < node->ipa_transforms_to_apply.length (); i++)
kono
parents: 67
diff changeset
2281 execute_one_ipa_transform_pass (node, node->ipa_transforms_to_apply[i]);
kono
parents: 67
diff changeset
2282 node->ipa_transforms_to_apply.release ();
kono
parents: 67
diff changeset
2283 }
kono
parents: 67
diff changeset
2284 }
kono
parents: 67
diff changeset
2285
kono
parents: 67
diff changeset
2286 /* Check if PASS is explicitly disabled or enabled and return
kono
parents: 67
diff changeset
2287 the gate status. FUNC is the function to be processed, and
kono
parents: 67
diff changeset
2288 GATE_STATUS is the gate status determined by pass manager by
kono
parents: 67
diff changeset
2289 default. */
kono
parents: 67
diff changeset
2290
kono
parents: 67
diff changeset
2291 static bool
kono
parents: 67
diff changeset
2292 override_gate_status (opt_pass *pass, tree func, bool gate_status)
kono
parents: 67
diff changeset
2293 {
kono
parents: 67
diff changeset
2294 bool explicitly_enabled = false;
kono
parents: 67
diff changeset
2295 bool explicitly_disabled = false;
kono
parents: 67
diff changeset
2296
kono
parents: 67
diff changeset
2297 explicitly_enabled
kono
parents: 67
diff changeset
2298 = is_pass_explicitly_enabled_or_disabled (pass, func,
kono
parents: 67
diff changeset
2299 enabled_pass_uid_range_tab);
kono
parents: 67
diff changeset
2300 explicitly_disabled
kono
parents: 67
diff changeset
2301 = is_pass_explicitly_enabled_or_disabled (pass, func,
kono
parents: 67
diff changeset
2302 disabled_pass_uid_range_tab);
kono
parents: 67
diff changeset
2303
kono
parents: 67
diff changeset
2304 gate_status = !explicitly_disabled && (gate_status || explicitly_enabled);
kono
parents: 67
diff changeset
2305
kono
parents: 67
diff changeset
2306 return gate_status;
kono
parents: 67
diff changeset
2307 }
kono
parents: 67
diff changeset
2308
kono
parents: 67
diff changeset
2309 /* Determine if PASS_NAME matches CRITERION.
kono
parents: 67
diff changeset
2310 Not a pure predicate, since it can update CRITERION, to support
kono
parents: 67
diff changeset
2311 matching the Nth invocation of a pass.
kono
parents: 67
diff changeset
2312 Subroutine of should_skip_pass_p. */
kono
parents: 67
diff changeset
2313
kono
parents: 67
diff changeset
2314 static bool
kono
parents: 67
diff changeset
2315 determine_pass_name_match (const char *pass_name, char *criterion)
kono
parents: 67
diff changeset
2316 {
kono
parents: 67
diff changeset
2317 size_t namelen = strlen (pass_name);
kono
parents: 67
diff changeset
2318 if (! strncmp (pass_name, criterion, namelen))
kono
parents: 67
diff changeset
2319 {
kono
parents: 67
diff changeset
2320 /* The following supports starting with the Nth invocation
kono
parents: 67
diff changeset
2321 of a pass (where N does not necessarily is equal to the
kono
parents: 67
diff changeset
2322 dump file suffix). */
kono
parents: 67
diff changeset
2323 if (criterion[namelen] == '\0'
kono
parents: 67
diff changeset
2324 || (criterion[namelen] == '1'
kono
parents: 67
diff changeset
2325 && criterion[namelen + 1] == '\0'))
kono
parents: 67
diff changeset
2326 return true;
kono
parents: 67
diff changeset
2327 else
kono
parents: 67
diff changeset
2328 {
kono
parents: 67
diff changeset
2329 if (criterion[namelen + 1] == '\0')
kono
parents: 67
diff changeset
2330 --criterion[namelen];
kono
parents: 67
diff changeset
2331 return false;
kono
parents: 67
diff changeset
2332 }
kono
parents: 67
diff changeset
2333 }
kono
parents: 67
diff changeset
2334 else
kono
parents: 67
diff changeset
2335 return false;
kono
parents: 67
diff changeset
2336 }
kono
parents: 67
diff changeset
2337
kono
parents: 67
diff changeset
2338 /* For skipping passes until "startwith" pass.
kono
parents: 67
diff changeset
2339 Return true iff PASS should be skipped.
kono
parents: 67
diff changeset
2340 Clear cfun->pass_startwith when encountering the "startwith" pass,
kono
parents: 67
diff changeset
2341 so that all subsequent passes are run. */
kono
parents: 67
diff changeset
2342
kono
parents: 67
diff changeset
2343 static bool
kono
parents: 67
diff changeset
2344 should_skip_pass_p (opt_pass *pass)
kono
parents: 67
diff changeset
2345 {
kono
parents: 67
diff changeset
2346 if (!cfun)
kono
parents: 67
diff changeset
2347 return false;
kono
parents: 67
diff changeset
2348 if (!cfun->pass_startwith)
kono
parents: 67
diff changeset
2349 return false;
kono
parents: 67
diff changeset
2350
kono
parents: 67
diff changeset
2351 /* For __GIMPLE functions, we have to at least start when we leave
kono
parents: 67
diff changeset
2352 SSA. Hence, we need to detect the "expand" pass, and stop skipping
kono
parents: 67
diff changeset
2353 when we encounter it. A cheap way to identify "expand" is it to
kono
parents: 67
diff changeset
2354 detect the destruction of PROP_ssa.
kono
parents: 67
diff changeset
2355 For __RTL functions, we invoke "rest_of_compilation" directly, which
kono
parents: 67
diff changeset
2356 is after "expand", and hence we don't reach this conditional. */
kono
parents: 67
diff changeset
2357 if (pass->properties_destroyed & PROP_ssa)
kono
parents: 67
diff changeset
2358 {
kono
parents: 67
diff changeset
2359 if (!quiet_flag)
kono
parents: 67
diff changeset
2360 fprintf (stderr, "starting anyway when leaving SSA: %s\n", pass->name);
kono
parents: 67
diff changeset
2361 cfun->pass_startwith = NULL;
kono
parents: 67
diff changeset
2362 return false;
kono
parents: 67
diff changeset
2363 }
kono
parents: 67
diff changeset
2364
kono
parents: 67
diff changeset
2365 if (determine_pass_name_match (pass->name, cfun->pass_startwith))
kono
parents: 67
diff changeset
2366 {
kono
parents: 67
diff changeset
2367 if (!quiet_flag)
kono
parents: 67
diff changeset
2368 fprintf (stderr, "found starting pass: %s\n", pass->name);
kono
parents: 67
diff changeset
2369 cfun->pass_startwith = NULL;
kono
parents: 67
diff changeset
2370 return false;
kono
parents: 67
diff changeset
2371 }
kono
parents: 67
diff changeset
2372
kono
parents: 67
diff changeset
2373 /* For GIMPLE passes, run any property provider (but continue skipping
kono
parents: 67
diff changeset
2374 afterwards).
kono
parents: 67
diff changeset
2375 We don't want to force running RTL passes that are property providers:
kono
parents: 67
diff changeset
2376 "expand" is covered above, and the only pass other than "expand" that
kono
parents: 67
diff changeset
2377 provides a property is "into_cfglayout" (PROP_cfglayout), which does
kono
parents: 67
diff changeset
2378 too much for a dumped __RTL function. */
kono
parents: 67
diff changeset
2379 if (pass->type == GIMPLE_PASS
kono
parents: 67
diff changeset
2380 && pass->properties_provided != 0)
kono
parents: 67
diff changeset
2381 return false;
kono
parents: 67
diff changeset
2382
kono
parents: 67
diff changeset
2383 /* Don't skip df init; later RTL passes need it. */
kono
parents: 67
diff changeset
2384 if (strstr (pass->name, "dfinit") != NULL)
kono
parents: 67
diff changeset
2385 return false;
kono
parents: 67
diff changeset
2386
kono
parents: 67
diff changeset
2387 if (!quiet_flag)
kono
parents: 67
diff changeset
2388 fprintf (stderr, "skipping pass: %s\n", pass->name);
kono
parents: 67
diff changeset
2389
kono
parents: 67
diff changeset
2390 /* If we get here, then we have a "startwith" that we haven't seen yet;
kono
parents: 67
diff changeset
2391 skip the pass. */
kono
parents: 67
diff changeset
2392 return true;
kono
parents: 67
diff changeset
2393 }
kono
parents: 67
diff changeset
2394
kono
parents: 67
diff changeset
2395 /* Skip the given pass, for handling passes before "startwith"
kono
parents: 67
diff changeset
2396 in __GIMPLE and__RTL-marked functions.
kono
parents: 67
diff changeset
2397 In theory, this ought to be a no-op, but some of the RTL passes
kono
parents: 67
diff changeset
2398 need additional processing here. */
kono
parents: 67
diff changeset
2399
kono
parents: 67
diff changeset
2400 static void
kono
parents: 67
diff changeset
2401 skip_pass (opt_pass *pass)
kono
parents: 67
diff changeset
2402 {
kono
parents: 67
diff changeset
2403 /* Pass "reload" sets the global "reload_completed", and many
kono
parents: 67
diff changeset
2404 things depend on this (e.g. instructions in .md files). */
kono
parents: 67
diff changeset
2405 if (strcmp (pass->name, "reload") == 0)
kono
parents: 67
diff changeset
2406 reload_completed = 1;
kono
parents: 67
diff changeset
2407
kono
parents: 67
diff changeset
2408 /* The INSN_ADDRESSES vec is normally set up by
kono
parents: 67
diff changeset
2409 shorten_branches; set it up for the benefit of passes that
kono
parents: 67
diff changeset
2410 run after this. */
kono
parents: 67
diff changeset
2411 if (strcmp (pass->name, "shorten") == 0)
kono
parents: 67
diff changeset
2412 INSN_ADDRESSES_ALLOC (get_max_uid ());
kono
parents: 67
diff changeset
2413
kono
parents: 67
diff changeset
2414 /* Update the cfg hooks as appropriate. */
kono
parents: 67
diff changeset
2415 if (strcmp (pass->name, "into_cfglayout") == 0)
kono
parents: 67
diff changeset
2416 {
kono
parents: 67
diff changeset
2417 cfg_layout_rtl_register_cfg_hooks ();
kono
parents: 67
diff changeset
2418 cfun->curr_properties |= PROP_cfglayout;
kono
parents: 67
diff changeset
2419 }
kono
parents: 67
diff changeset
2420 if (strcmp (pass->name, "outof_cfglayout") == 0)
kono
parents: 67
diff changeset
2421 {
kono
parents: 67
diff changeset
2422 rtl_register_cfg_hooks ();
kono
parents: 67
diff changeset
2423 cfun->curr_properties &= ~PROP_cfglayout;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2424 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2425 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2426
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2427 /* Execute PASS. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2428
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2429 bool
111
kono
parents: 67
diff changeset
2430 execute_one_pass (opt_pass *pass)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2431 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2432 unsigned int todo_after = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2433
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2434 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
2435
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2436 /* IPA passes are executed on whole program, so cfun should be NULL.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2437 Other passes need function context set. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2438 if (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2439 gcc_assert (!cfun && !current_function_decl);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2440 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2441 gcc_assert (cfun && current_function_decl);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2442
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2443 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
2444
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2445 /* 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
2446 User controls the value of the gate through the parameter "gate_status". */
111
kono
parents: 67
diff changeset
2447 gate_status = pass->gate (cfun);
kono
parents: 67
diff changeset
2448 gate_status = override_gate_status (pass, current_function_decl, gate_status);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2449
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2450 /* 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
2451 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
2452
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2453 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
2454 {
111
kono
parents: 67
diff changeset
2455 /* Run so passes selectively disabling themselves on a given function
kono
parents: 67
diff changeset
2456 are not miscounted. */
kono
parents: 67
diff changeset
2457 if (profile_report && cfun && (cfun->curr_properties & PROP_cfg))
kono
parents: 67
diff changeset
2458 {
kono
parents: 67
diff changeset
2459 check_profile_consistency (pass->static_pass_number, 0, false);
kono
parents: 67
diff changeset
2460 check_profile_consistency (pass->static_pass_number, 1, false);
kono
parents: 67
diff changeset
2461 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2462 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
2463 return false;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2464 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2465
111
kono
parents: 67
diff changeset
2466 if (should_skip_pass_p (pass))
kono
parents: 67
diff changeset
2467 {
kono
parents: 67
diff changeset
2468 skip_pass (pass);
kono
parents: 67
diff changeset
2469 return true;
kono
parents: 67
diff changeset
2470 }
kono
parents: 67
diff changeset
2471
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2472 /* 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
2473 executed. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2474 invoke_plugin_callbacks (PLUGIN_PASS_EXECUTION, pass);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2475
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2476 if (!quiet_flag && !cfun)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2477 fprintf (stderr, " <%s>", pass->name ? pass->name : "");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2478
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2479 /* Note that the folders should only create gimple expressions.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2480 This is a hack until the new folder is ready. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2481 in_gimple_form = (cfun && (cfun->curr_properties & PROP_trees)) != 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2482
111
kono
parents: 67
diff changeset
2483 pass_init_dump_file (pass);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2484
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2485 /* 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
2486 if (pass->tv_id != TV_NONE)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2487 timevar_push (pass->tv_id);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2488
111
kono
parents: 67
diff changeset
2489 /* Run pre-pass verification. */
kono
parents: 67
diff changeset
2490 execute_todo (pass->todo_flags_start);
kono
parents: 67
diff changeset
2491
kono
parents: 67
diff changeset
2492 if (flag_checking)
kono
parents: 67
diff changeset
2493 do_per_function (verify_curr_properties,
kono
parents: 67
diff changeset
2494 (void *)(size_t)pass->properties_required);
kono
parents: 67
diff changeset
2495
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2496 /* Do it! */
111
kono
parents: 67
diff changeset
2497 todo_after = pass->execute (cfun);
kono
parents: 67
diff changeset
2498
kono
parents: 67
diff changeset
2499 if (todo_after & TODO_discard_function)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2500 {
111
kono
parents: 67
diff changeset
2501 /* Stop timevar. */
kono
parents: 67
diff changeset
2502 if (pass->tv_id != TV_NONE)
kono
parents: 67
diff changeset
2503 timevar_pop (pass->tv_id);
kono
parents: 67
diff changeset
2504
kono
parents: 67
diff changeset
2505 pass_fini_dump_file (pass);
kono
parents: 67
diff changeset
2506
kono
parents: 67
diff changeset
2507 gcc_assert (cfun);
kono
parents: 67
diff changeset
2508 /* As cgraph_node::release_body expects release dominators info,
kono
parents: 67
diff changeset
2509 we have to release it. */
kono
parents: 67
diff changeset
2510 if (dom_info_available_p (CDI_DOMINATORS))
kono
parents: 67
diff changeset
2511 free_dominance_info (CDI_DOMINATORS);
kono
parents: 67
diff changeset
2512
kono
parents: 67
diff changeset
2513 if (dom_info_available_p (CDI_POST_DOMINATORS))
kono
parents: 67
diff changeset
2514 free_dominance_info (CDI_POST_DOMINATORS);
kono
parents: 67
diff changeset
2515
kono
parents: 67
diff changeset
2516 tree fn = cfun->decl;
kono
parents: 67
diff changeset
2517 pop_cfun ();
kono
parents: 67
diff changeset
2518 gcc_assert (!cfun);
kono
parents: 67
diff changeset
2519 cgraph_node::get (fn)->release_body ();
kono
parents: 67
diff changeset
2520
kono
parents: 67
diff changeset
2521 current_pass = NULL;
kono
parents: 67
diff changeset
2522 redirect_edge_var_map_empty ();
kono
parents: 67
diff changeset
2523
kono
parents: 67
diff changeset
2524 ggc_collect ();
kono
parents: 67
diff changeset
2525
kono
parents: 67
diff changeset
2526 return true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2527 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2528
111
kono
parents: 67
diff changeset
2529 do_per_function (clear_last_verified, NULL);
kono
parents: 67
diff changeset
2530
kono
parents: 67
diff changeset
2531 do_per_function (update_properties_after_pass, pass);
kono
parents: 67
diff changeset
2532
kono
parents: 67
diff changeset
2533 if (profile_report && cfun && (cfun->curr_properties & PROP_cfg))
kono
parents: 67
diff changeset
2534 check_profile_consistency (pass->static_pass_number, 0, true);
kono
parents: 67
diff changeset
2535
kono
parents: 67
diff changeset
2536 /* Run post-pass cleanup and verification. */
kono
parents: 67
diff changeset
2537 execute_todo (todo_after | pass->todo_flags_finish | TODO_verify_il);
kono
parents: 67
diff changeset
2538 if (profile_report && cfun && (cfun->curr_properties & PROP_cfg))
kono
parents: 67
diff changeset
2539 check_profile_consistency (pass->static_pass_number, 1, true);
kono
parents: 67
diff changeset
2540
kono
parents: 67
diff changeset
2541 verify_interpass_invariants ();
kono
parents: 67
diff changeset
2542
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2543 /* 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
2544 if (pass->tv_id != TV_NONE)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2545 timevar_pop (pass->tv_id);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2546
111
kono
parents: 67
diff changeset
2547 if (pass->type == IPA_PASS
kono
parents: 67
diff changeset
2548 && ((ipa_opt_pass_d *)pass)->function_transform)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2549 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2550 struct cgraph_node *node;
111
kono
parents: 67
diff changeset
2551 FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (node)
kono
parents: 67
diff changeset
2552 node->ipa_transforms_to_apply.safe_push ((ipa_opt_pass_d *)pass);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2553 }
111
kono
parents: 67
diff changeset
2554 else if (dump_file)
kono
parents: 67
diff changeset
2555 do_per_function (execute_function_dump, pass);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2556
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2557 if (!current_function_decl)
111
kono
parents: 67
diff changeset
2558 symtab->process_new_functions ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2559
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2560 pass_fini_dump_file (pass);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2561
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2562 if (pass->type != SIMPLE_IPA_PASS && pass->type != IPA_PASS)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2563 gcc_assert (!(cfun->curr_properties & PROP_trees)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2564 || pass->type != RTL_PASS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2565
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2566 current_pass = NULL;
111
kono
parents: 67
diff changeset
2567 redirect_edge_var_map_empty ();
kono
parents: 67
diff changeset
2568
kono
parents: 67
diff changeset
2569 /* Signal this is a suitable GC collection point. */
kono
parents: 67
diff changeset
2570 if (!((todo_after | pass->todo_flags_finish) & TODO_do_not_ggc_collect))
kono
parents: 67
diff changeset
2571 ggc_collect ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2572
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2573 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2574 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2575
111
kono
parents: 67
diff changeset
2576 static void
kono
parents: 67
diff changeset
2577 execute_pass_list_1 (opt_pass *pass)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2578 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2579 do
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2580 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2581 gcc_assert (pass->type == GIMPLE_PASS
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2582 || pass->type == RTL_PASS);
111
kono
parents: 67
diff changeset
2583
kono
parents: 67
diff changeset
2584 if (cfun == NULL)
kono
parents: 67
diff changeset
2585 return;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2586 if (execute_one_pass (pass) && pass->sub)
111
kono
parents: 67
diff changeset
2587 execute_pass_list_1 (pass->sub);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2588 pass = pass->next;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2589 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2590 while (pass);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2591 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2592
111
kono
parents: 67
diff changeset
2593 void
kono
parents: 67
diff changeset
2594 execute_pass_list (function *fn, opt_pass *pass)
kono
parents: 67
diff changeset
2595 {
kono
parents: 67
diff changeset
2596 gcc_assert (fn == cfun);
kono
parents: 67
diff changeset
2597 execute_pass_list_1 (pass);
kono
parents: 67
diff changeset
2598 if (cfun && fn->cfg)
kono
parents: 67
diff changeset
2599 {
kono
parents: 67
diff changeset
2600 free_dominance_info (CDI_DOMINATORS);
kono
parents: 67
diff changeset
2601 free_dominance_info (CDI_POST_DOMINATORS);
kono
parents: 67
diff changeset
2602 }
kono
parents: 67
diff changeset
2603 }
kono
parents: 67
diff changeset
2604
kono
parents: 67
diff changeset
2605 /* Write out all LTO data. */
kono
parents: 67
diff changeset
2606 static void
kono
parents: 67
diff changeset
2607 write_lto (void)
kono
parents: 67
diff changeset
2608 {
kono
parents: 67
diff changeset
2609 timevar_push (TV_IPA_LTO_GIMPLE_OUT);
kono
parents: 67
diff changeset
2610 lto_output ();
kono
parents: 67
diff changeset
2611 timevar_pop (TV_IPA_LTO_GIMPLE_OUT);
kono
parents: 67
diff changeset
2612 timevar_push (TV_IPA_LTO_DECL_OUT);
kono
parents: 67
diff changeset
2613 produce_asm_for_decls ();
kono
parents: 67
diff changeset
2614 timevar_pop (TV_IPA_LTO_DECL_OUT);
kono
parents: 67
diff changeset
2615 }
kono
parents: 67
diff changeset
2616
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2617 /* 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
2618 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
2619 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
2620
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2621 static void
111
kono
parents: 67
diff changeset
2622 ipa_write_summaries_2 (opt_pass *pass, struct lto_out_decl_state *state)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2623 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2624 while (pass)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2625 {
111
kono
parents: 67
diff changeset
2626 ipa_opt_pass_d *ipa_pass = (ipa_opt_pass_d *)pass;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2627 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
2628 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
2629 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
2630 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
2631 && ipa_pass->write_summary
111
kono
parents: 67
diff changeset
2632 && pass->gate (cfun))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2633 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2634 /* 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
2635 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
2636 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
2637
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2638 pass_init_dump_file (pass);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2639
111
kono
parents: 67
diff changeset
2640 current_pass = pass;
kono
parents: 67
diff changeset
2641 ipa_pass->write_summary ();
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2642
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2643 pass_fini_dump_file (pass);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2644
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2645 /* 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
2646 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
2647 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
2648 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2649
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2650 if (pass->sub && pass->sub->type != GIMPLE_PASS)
111
kono
parents: 67
diff changeset
2651 ipa_write_summaries_2 (pass->sub, state);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2652
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2653 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
2654 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2655 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2656
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2657 /* 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
2658 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
2659 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
2660
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2661 static void
111
kono
parents: 67
diff changeset
2662 ipa_write_summaries_1 (lto_symtab_encoder_t encoder)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2663 {
111
kono
parents: 67
diff changeset
2664 pass_manager *passes = g->get_passes ();
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2665 struct lto_out_decl_state *state = lto_new_out_decl_state ();
111
kono
parents: 67
diff changeset
2666 state->symtab_node_encoder = encoder;
kono
parents: 67
diff changeset
2667
kono
parents: 67
diff changeset
2668 lto_output_init_mode_table ();
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2669 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
2670
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2671 gcc_assert (!flag_wpa);
111
kono
parents: 67
diff changeset
2672 ipa_write_summaries_2 (passes->all_regular_ipa_passes, state);
kono
parents: 67
diff changeset
2673
kono
parents: 67
diff changeset
2674 write_lto ();
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2675
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2676 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
2677 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
2678 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
2679 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2680
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2681 /* 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
2682
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2683 void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2684 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
2685 {
111
kono
parents: 67
diff changeset
2686 lto_symtab_encoder_t encoder;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2687 int i, order_pos;
111
kono
parents: 67
diff changeset
2688 varpool_node *vnode;
kono
parents: 67
diff changeset
2689 struct cgraph_node *node;
kono
parents: 67
diff changeset
2690 struct cgraph_node **order;
kono
parents: 67
diff changeset
2691
kono
parents: 67
diff changeset
2692 if ((!flag_generate_lto && !flag_generate_offload) || seen_error ())
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2693 return;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2694
111
kono
parents: 67
diff changeset
2695 select_what_to_stream ();
kono
parents: 67
diff changeset
2696
kono
parents: 67
diff changeset
2697 encoder = lto_symtab_encoder_new (false);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2698
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2699 /* 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
2700 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
2701 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
2702 as the source code. */
111
kono
parents: 67
diff changeset
2703 order = XCNEWVEC (struct cgraph_node *, symtab->cgraph_count);
kono
parents: 67
diff changeset
2704 order_pos = ipa_reverse_postorder (order);
kono
parents: 67
diff changeset
2705 gcc_assert (order_pos == symtab->cgraph_count);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2706
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2707 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
2708 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2709 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
2710
111
kono
parents: 67
diff changeset
2711 if (node->has_gimple_body_p ())
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2712 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2713 /* 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
2714 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
2715 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
2716 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
2717 hooks. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2718
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2719 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
2720 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
2721 pop_cfun ();
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2722 }
111
kono
parents: 67
diff changeset
2723 if (node->definition && node->need_lto_streaming)
kono
parents: 67
diff changeset
2724 lto_set_symtab_encoder_in_partition (encoder, node);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2725 }
111
kono
parents: 67
diff changeset
2726
kono
parents: 67
diff changeset
2727 FOR_EACH_DEFINED_FUNCTION (node)
kono
parents: 67
diff changeset
2728 if (node->alias && node->need_lto_streaming)
kono
parents: 67
diff changeset
2729 lto_set_symtab_encoder_in_partition (encoder, node);
kono
parents: 67
diff changeset
2730 FOR_EACH_DEFINED_VARIABLE (vnode)
kono
parents: 67
diff changeset
2731 if (vnode->need_lto_streaming)
kono
parents: 67
diff changeset
2732 lto_set_symtab_encoder_in_partition (encoder, vnode);
kono
parents: 67
diff changeset
2733
kono
parents: 67
diff changeset
2734 ipa_write_summaries_1 (compute_ltrans_boundary (encoder));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2735
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2736 free (order);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2737 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2738
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2739 /* Same as execute_pass_list but assume that subpasses of IPA passes
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2740 are local passes. If SET is not NULL, write out optimization summaries of
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2741 only those node in SET. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2742
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2743 static void
111
kono
parents: 67
diff changeset
2744 ipa_write_optimization_summaries_1 (opt_pass *pass,
kono
parents: 67
diff changeset
2745 struct lto_out_decl_state *state)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2746 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2747 while (pass)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2748 {
111
kono
parents: 67
diff changeset
2749 ipa_opt_pass_d *ipa_pass = (ipa_opt_pass_d *)pass;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2750 gcc_assert (!current_function_decl);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2751 gcc_assert (!cfun);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2752 gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2753 if (pass->type == IPA_PASS
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2754 && ipa_pass->write_optimization_summary
111
kono
parents: 67
diff changeset
2755 && pass->gate (cfun))
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2756 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2757 /* If a timevar is present, start it. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2758 if (pass->tv_id)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2759 timevar_push (pass->tv_id);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2760
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2761 pass_init_dump_file (pass);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2762
111
kono
parents: 67
diff changeset
2763 current_pass = pass;
kono
parents: 67
diff changeset
2764 ipa_pass->write_optimization_summary ();
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2765
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2766 pass_fini_dump_file (pass);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2767
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2768 /* If a timevar is present, start it. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2769 if (pass->tv_id)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2770 timevar_pop (pass->tv_id);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2771 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2772
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2773 if (pass->sub && pass->sub->type != GIMPLE_PASS)
111
kono
parents: 67
diff changeset
2774 ipa_write_optimization_summaries_1 (pass->sub, state);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2775
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2776 pass = pass->next;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2777 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2778 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2779
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2780 /* Write all the optimization summaries for the cgraph nodes in SET. If SET is
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2781 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
2782
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2783 void
111
kono
parents: 67
diff changeset
2784 ipa_write_optimization_summaries (lto_symtab_encoder_t encoder)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2785 {
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2786 struct lto_out_decl_state *state = lto_new_out_decl_state ();
111
kono
parents: 67
diff changeset
2787 lto_symtab_encoder_iterator lsei;
kono
parents: 67
diff changeset
2788 state->symtab_node_encoder = encoder;
kono
parents: 67
diff changeset
2789
kono
parents: 67
diff changeset
2790 lto_output_init_mode_table ();
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2791 lto_push_out_decl_state (state);
111
kono
parents: 67
diff changeset
2792 for (lsei = lsei_start_function_in_partition (encoder);
kono
parents: 67
diff changeset
2793 !lsei_end_p (lsei); lsei_next_function_in_partition (&lsei))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2794 {
111
kono
parents: 67
diff changeset
2795 struct cgraph_node *node = lsei_cgraph_node (lsei);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2796 /* When streaming out references to statements as part of some IPA
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2797 pass summary, the statements need to have uids assigned.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2798
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2799 For functions newly born at WPA stage we need to initialize
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2800 the uids here. */
111
kono
parents: 67
diff changeset
2801 if (node->definition
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2802 && gimple_has_body_p (node->decl))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2803 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2804 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2805 renumber_gimple_stmt_uids ();
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2806 pop_cfun ();
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2807 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2808 }
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2809
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2810 gcc_assert (flag_wpa);
111
kono
parents: 67
diff changeset
2811 pass_manager *passes = g->get_passes ();
kono
parents: 67
diff changeset
2812 ipa_write_optimization_summaries_1 (passes->all_regular_ipa_passes, state);
kono
parents: 67
diff changeset
2813
kono
parents: 67
diff changeset
2814 write_lto ();
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2815
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2816 gcc_assert (lto_get_out_decl_state () == state);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2817 lto_pop_out_decl_state ();
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2818 lto_delete_out_decl_state (state);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2819 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2820
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2821 /* 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
2822 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
2823
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2824 static void
111
kono
parents: 67
diff changeset
2825 ipa_read_summaries_1 (opt_pass *pass)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2826 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2827 while (pass)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2828 {
111
kono
parents: 67
diff changeset
2829 ipa_opt_pass_d *ipa_pass = (ipa_opt_pass_d *) pass;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2830
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2831 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
2832 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
2833 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
2834
111
kono
parents: 67
diff changeset
2835 if (pass->gate (cfun))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2836 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2837 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
2838 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2839 /* 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
2840 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
2841 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
2842
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2843 pass_init_dump_file (pass);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2844
111
kono
parents: 67
diff changeset
2845 current_pass = pass;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2846 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
2847
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2848 pass_fini_dump_file (pass);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2849
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2850 /* Stop timevar. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2851 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
2852 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
2853 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2854
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2855 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
2856 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
2857 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2858 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
2859 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2860 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2861
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2862
111
kono
parents: 67
diff changeset
2863 /* Read all the summaries for all_regular_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
2864
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2865 void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2866 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
2867 {
111
kono
parents: 67
diff changeset
2868 pass_manager *passes = g->get_passes ();
kono
parents: 67
diff changeset
2869 ipa_read_summaries_1 (passes->all_regular_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
2870 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2871
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2872 /* Same as execute_pass_list but assume that subpasses of IPA passes
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2873 are local passes. */
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2874
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2875 static void
111
kono
parents: 67
diff changeset
2876 ipa_read_optimization_summaries_1 (opt_pass *pass)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2877 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2878 while (pass)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2879 {
111
kono
parents: 67
diff changeset
2880 ipa_opt_pass_d *ipa_pass = (ipa_opt_pass_d *) pass;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2881
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2882 gcc_assert (!current_function_decl);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2883 gcc_assert (!cfun);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2884 gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2885
111
kono
parents: 67
diff changeset
2886 if (pass->gate (cfun))
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2887 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2888 if (pass->type == IPA_PASS && ipa_pass->read_optimization_summary)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2889 {
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2890 /* If a timevar is present, start it. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2891 if (pass->tv_id)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2892 timevar_push (pass->tv_id);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2893
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2894 pass_init_dump_file (pass);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2895
111
kono
parents: 67
diff changeset
2896 current_pass = pass;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2897 ipa_pass->read_optimization_summary ();
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2898
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2899 pass_fini_dump_file (pass);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2900
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2901 /* Stop timevar. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2902 if (pass->tv_id)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2903 timevar_pop (pass->tv_id);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2904 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2905
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2906 if (pass->sub && pass->sub->type != GIMPLE_PASS)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2907 ipa_read_optimization_summaries_1 (pass->sub);
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2908 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2909 pass = pass->next;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2910 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2911 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2912
111
kono
parents: 67
diff changeset
2913 /* Read all the summaries for all_regular_ipa_passes. */
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2914
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2915 void
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2916 ipa_read_optimization_summaries (void)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2917 {
111
kono
parents: 67
diff changeset
2918 pass_manager *passes = g->get_passes ();
kono
parents: 67
diff changeset
2919 ipa_read_optimization_summaries_1 (passes->all_regular_ipa_passes);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2920 }
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2921
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2922 /* Same as execute_pass_list but assume that subpasses of IPA passes
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2923 are local passes. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2924 void
111
kono
parents: 67
diff changeset
2925 execute_ipa_pass_list (opt_pass *pass)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2926 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2927 do
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2928 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2929 gcc_assert (!current_function_decl);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2930 gcc_assert (!cfun);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2931 gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2932 if (execute_one_pass (pass) && pass->sub)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2933 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2934 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
2935 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2936 invoke_plugin_callbacks (PLUGIN_EARLY_GIMPLE_PASSES_START, NULL);
111
kono
parents: 67
diff changeset
2937 do_per_function_toporder ((void (*)(function *, void *))
kono
parents: 67
diff changeset
2938 execute_pass_list,
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2939 pass->sub);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2940 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
2941 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2942 else if (pass->sub->type == SIMPLE_IPA_PASS
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2943 || pass->sub->type == IPA_PASS)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2944 execute_ipa_pass_list (pass->sub);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2945 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2946 gcc_unreachable ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2947 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2948 gcc_assert (!current_function_decl);
111
kono
parents: 67
diff changeset
2949 symtab->process_new_functions ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2950 pass = pass->next;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2951 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2952 while (pass);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2953 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2954
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2955 /* 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
2956
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2957 static void
111
kono
parents: 67
diff changeset
2958 execute_ipa_stmt_fixups (opt_pass *pass,
kono
parents: 67
diff changeset
2959 struct cgraph_node *node, gimple **stmts)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2960 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2961 while (pass)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2962 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2963 /* 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
2964 if (pass->type == IPA_PASS
111
kono
parents: 67
diff changeset
2965 && pass->gate (cfun))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2966 {
111
kono
parents: 67
diff changeset
2967 ipa_opt_pass_d *ipa_pass = (ipa_opt_pass_d *) pass;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2968
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2969 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
2970 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2971 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
2972 /* 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
2973 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
2974 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
2975
111
kono
parents: 67
diff changeset
2976 current_pass = pass;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2977 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
2978
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2979 /* Stop timevar. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2980 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
2981 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
2982 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
2983 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2984 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
2985 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
2986 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2987 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
2988 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2989 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2990
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2991 /* 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
2992
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2993 void
111
kono
parents: 67
diff changeset
2994 execute_all_ipa_stmt_fixups (struct cgraph_node *node, gimple **stmts)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2995 {
111
kono
parents: 67
diff changeset
2996 pass_manager *passes = g->get_passes ();
kono
parents: 67
diff changeset
2997 execute_ipa_stmt_fixups (passes->all_regular_ipa_passes, node, stmts);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2998 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
2999
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3000
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3001 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
3002 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
3003
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
3004 DEBUG_FUNCTION void
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3005 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
3006 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3007 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
3008 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
3009 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
3010 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
3011 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
3012 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
3013 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
3014 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
3015 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
3016 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
3017 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
3018 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
3019 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
3020 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
3021 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
3022 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
3023 fprintf (dump, "PROP_gimple_lomp\n");
111
kono
parents: 67
diff changeset
3024 if (props & PROP_gimple_lomp_dev)
kono
parents: 67
diff changeset
3025 fprintf (dump, "PROP_gimple_lomp_dev\n");
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
3026 if (props & PROP_gimple_lcx)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
3027 fprintf (dump, "PROP_gimple_lcx\n");
111
kono
parents: 67
diff changeset
3028 if (props & PROP_gimple_lvec)
kono
parents: 67
diff changeset
3029 fprintf (dump, "PROP_gimple_lvec\n");
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
3030 if (props & PROP_cfglayout)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
3031 fprintf (dump, "PROP_cfglayout\n");
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3032 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3033
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
3034 DEBUG_FUNCTION void
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3035 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
3036 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3037 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
3038 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3039
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3040 /* 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
3041 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
3042 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
3043 bool
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3044 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
3045 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3046 struct cgraph_edge *e;
111
kono
parents: 67
diff changeset
3047 for (e = cgraph_node::get (current_function_decl)->callers;
kono
parents: 67
diff changeset
3048 e;
kono
parents: 67
diff changeset
3049 e = e->next_caller)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3050 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3051 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
3052 continue;
111
kono
parents: 67
diff changeset
3053 if (!e->caller->has_gimple_body_p ())
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3054 continue;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3055 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
3056 continue;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3057 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
3058 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3059 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3060 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
3061 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3062 fprintf (dump_file, "Already processed call to:\n");
111
kono
parents: 67
diff changeset
3063 e->caller->dump (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
3064 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3065 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
3066 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3067
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3068 #include "gt-passes.h"