Mercurial > hg > CbC > CbC_gcc
annotate gcc/tree-ssa.c @ 63:b7f97abdc517 gcc-4.6-20100522
update gcc from gcc-4.5.0 to gcc-4.6
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 24 May 2010 12:47:05 +0900 |
parents | 77e2b8dfacca |
children | f6334be47118 |
rev | line source |
---|---|
0 | 1 /* Miscellaneous SSA utility functions. |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010 |
0 | 3 Free Software Foundation, Inc. |
4 | |
5 This file is part of GCC. | |
6 | |
7 GCC is free software; you can redistribute it and/or modify | |
8 it under the terms of the GNU General Public License as published by | |
9 the Free Software Foundation; either version 3, or (at your option) | |
10 any later version. | |
11 | |
12 GCC is distributed in the hope that it will be useful, | |
13 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 GNU General Public License for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with GCC; see the file COPYING3. If not see | |
19 <http://www.gnu.org/licenses/>. */ | |
20 | |
21 #include "config.h" | |
22 #include "system.h" | |
23 #include "coretypes.h" | |
24 #include "tm.h" | |
25 #include "tree.h" | |
26 #include "flags.h" | |
27 #include "tm_p.h" | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
28 #include "target.h" |
0 | 29 #include "ggc.h" |
30 #include "langhooks.h" | |
31 #include "basic-block.h" | |
32 #include "output.h" | |
33 #include "expr.h" | |
34 #include "function.h" | |
35 #include "diagnostic.h" | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
36 #include "tree-pretty-print.h" |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
37 #include "gimple-pretty-print.h" |
0 | 38 #include "bitmap.h" |
39 #include "pointer-set.h" | |
40 #include "tree-flow.h" | |
41 #include "gimple.h" | |
42 #include "tree-inline.h" | |
43 #include "timevar.h" | |
44 #include "hashtab.h" | |
45 #include "tree-dump.h" | |
46 #include "tree-pass.h" | |
47 #include "toplev.h" | |
48 | |
49 /* Pointer map of variable mappings, keyed by edge. */ | |
50 static struct pointer_map_t *edge_var_maps; | |
51 | |
52 | |
53 /* Add a mapping with PHI RESULT and PHI DEF associated with edge E. */ | |
54 | |
55 void | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
56 redirect_edge_var_map_add (edge e, tree result, tree def, source_location locus) |
0 | 57 { |
58 void **slot; | |
59 edge_var_map_vector old_head, head; | |
60 edge_var_map new_node; | |
61 | |
62 if (edge_var_maps == NULL) | |
63 edge_var_maps = pointer_map_create (); | |
64 | |
65 slot = pointer_map_insert (edge_var_maps, e); | |
66 old_head = head = (edge_var_map_vector) *slot; | |
67 if (!head) | |
68 { | |
69 head = VEC_alloc (edge_var_map, heap, 5); | |
70 *slot = head; | |
71 } | |
72 new_node.def = def; | |
73 new_node.result = result; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
74 new_node.locus = locus; |
0 | 75 |
76 VEC_safe_push (edge_var_map, heap, head, &new_node); | |
77 if (old_head != head) | |
78 { | |
79 /* The push did some reallocation. Update the pointer map. */ | |
80 *slot = head; | |
81 } | |
82 } | |
83 | |
84 | |
85 /* Clear the var mappings in edge E. */ | |
86 | |
87 void | |
88 redirect_edge_var_map_clear (edge e) | |
89 { | |
90 void **slot; | |
91 edge_var_map_vector head; | |
92 | |
93 if (!edge_var_maps) | |
94 return; | |
95 | |
96 slot = pointer_map_contains (edge_var_maps, e); | |
97 | |
98 if (slot) | |
99 { | |
100 head = (edge_var_map_vector) *slot; | |
101 VEC_free (edge_var_map, heap, head); | |
102 *slot = NULL; | |
103 } | |
104 } | |
105 | |
106 | |
107 /* Duplicate the redirected var mappings in OLDE in NEWE. | |
108 | |
109 Since we can't remove a mapping, let's just duplicate it. This assumes a | |
110 pointer_map can have multiple edges mapping to the same var_map (many to | |
111 one mapping), since we don't remove the previous mappings. */ | |
112 | |
113 void | |
114 redirect_edge_var_map_dup (edge newe, edge olde) | |
115 { | |
116 void **new_slot, **old_slot; | |
117 edge_var_map_vector head; | |
118 | |
119 if (!edge_var_maps) | |
120 return; | |
121 | |
122 new_slot = pointer_map_insert (edge_var_maps, newe); | |
123 old_slot = pointer_map_contains (edge_var_maps, olde); | |
124 if (!old_slot) | |
125 return; | |
126 head = (edge_var_map_vector) *old_slot; | |
127 | |
128 if (head) | |
129 *new_slot = VEC_copy (edge_var_map, heap, head); | |
130 else | |
131 *new_slot = VEC_alloc (edge_var_map, heap, 5); | |
132 } | |
133 | |
134 | |
135 /* Return the variable mappings for a given edge. If there is none, return | |
136 NULL. */ | |
137 | |
138 edge_var_map_vector | |
139 redirect_edge_var_map_vector (edge e) | |
140 { | |
141 void **slot; | |
142 | |
143 /* Hey, what kind of idiot would... you'd be surprised. */ | |
144 if (!edge_var_maps) | |
145 return NULL; | |
146 | |
147 slot = pointer_map_contains (edge_var_maps, e); | |
148 if (!slot) | |
149 return NULL; | |
150 | |
151 return (edge_var_map_vector) *slot; | |
152 } | |
153 | |
154 /* Used by redirect_edge_var_map_destroy to free all memory. */ | |
155 | |
156 static bool | |
157 free_var_map_entry (const void *key ATTRIBUTE_UNUSED, | |
158 void **value, | |
159 void *data ATTRIBUTE_UNUSED) | |
160 { | |
161 edge_var_map_vector head = (edge_var_map_vector) *value; | |
162 VEC_free (edge_var_map, heap, head); | |
163 return true; | |
164 } | |
165 | |
166 /* Clear the edge variable mappings. */ | |
167 | |
168 void | |
169 redirect_edge_var_map_destroy (void) | |
170 { | |
171 if (edge_var_maps) | |
172 { | |
173 pointer_map_traverse (edge_var_maps, free_var_map_entry, NULL); | |
174 pointer_map_destroy (edge_var_maps); | |
175 edge_var_maps = NULL; | |
176 } | |
177 } | |
178 | |
179 | |
180 /* Remove the corresponding arguments from the PHI nodes in E's | |
181 destination block and redirect it to DEST. Return redirected edge. | |
182 The list of removed arguments is stored in a vector accessed | |
183 through edge_var_maps. */ | |
184 | |
185 edge | |
186 ssa_redirect_edge (edge e, basic_block dest) | |
187 { | |
188 gimple_stmt_iterator gsi; | |
189 gimple phi; | |
190 | |
191 redirect_edge_var_map_clear (e); | |
192 | |
193 /* Remove the appropriate PHI arguments in E's destination block. */ | |
194 for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi)) | |
195 { | |
196 tree def; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
197 source_location locus ; |
0 | 198 |
199 phi = gsi_stmt (gsi); | |
200 def = gimple_phi_arg_def (phi, e->dest_idx); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
201 locus = gimple_phi_arg_location (phi, e->dest_idx); |
0 | 202 |
203 if (def == NULL_TREE) | |
204 continue; | |
205 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
206 redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus); |
0 | 207 } |
208 | |
209 e = redirect_edge_succ_nodup (e, dest); | |
210 | |
211 return e; | |
212 } | |
213 | |
214 | |
215 /* Add PHI arguments queued in PENDING_STMT list on edge E to edge | |
216 E->dest. */ | |
217 | |
218 void | |
219 flush_pending_stmts (edge e) | |
220 { | |
221 gimple phi; | |
222 edge_var_map_vector v; | |
223 edge_var_map *vm; | |
224 int i; | |
225 gimple_stmt_iterator gsi; | |
226 | |
227 v = redirect_edge_var_map_vector (e); | |
228 if (!v) | |
229 return; | |
230 | |
231 for (gsi = gsi_start_phis (e->dest), i = 0; | |
232 !gsi_end_p (gsi) && VEC_iterate (edge_var_map, v, i, vm); | |
233 gsi_next (&gsi), i++) | |
234 { | |
235 tree def; | |
236 | |
237 phi = gsi_stmt (gsi); | |
238 def = redirect_edge_var_map_def (vm); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
239 add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm)); |
0 | 240 } |
241 | |
242 redirect_edge_var_map_clear (e); | |
243 } | |
244 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
245 /* Given a tree for an expression for which we might want to emit |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
246 locations or values in debug information (generally a variable, but |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
247 we might deal with other kinds of trees in the future), return the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
248 tree that should be used as the variable of a DEBUG_BIND STMT or |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
249 VAR_LOCATION INSN or NOTE. Return NULL if VAR is not to be tracked. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
250 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
251 tree |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
252 target_for_debug_bind (tree var) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
253 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
254 if (!MAY_HAVE_DEBUG_STMTS) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
255 return NULL_TREE; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
256 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
257 if (TREE_CODE (var) != VAR_DECL |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
258 && TREE_CODE (var) != PARM_DECL) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
259 return NULL_TREE; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
260 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
261 if (DECL_HAS_VALUE_EXPR_P (var)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
262 return target_for_debug_bind (DECL_VALUE_EXPR (var)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
263 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
264 if (DECL_IGNORED_P (var)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
265 return NULL_TREE; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
266 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
267 if (!is_gimple_reg (var)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
268 return NULL_TREE; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
269 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
270 return var; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
271 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
272 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
273 /* Called via walk_tree, look for SSA_NAMEs that have already been |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
274 released. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
275 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
276 static tree |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
277 find_released_ssa_name (tree *tp, int *walk_subtrees, void *data_) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
278 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
279 struct walk_stmt_info *wi = (struct walk_stmt_info *) data_; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
280 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
281 if (wi && wi->is_lhs) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
282 return NULL_TREE; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
283 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
284 if (TREE_CODE (*tp) == SSA_NAME) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
285 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
286 if (SSA_NAME_IN_FREE_LIST (*tp)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
287 return *tp; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
288 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
289 *walk_subtrees = 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
290 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
291 else if (IS_TYPE_OR_DECL_P (*tp)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
292 *walk_subtrees = 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
293 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
294 return NULL_TREE; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
295 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
296 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
297 /* Insert a DEBUG BIND stmt before the DEF of VAR if VAR is referenced |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
298 by other DEBUG stmts, and replace uses of the DEF with the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
299 newly-created debug temp. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
300 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
301 void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
302 insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
303 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
304 imm_use_iterator imm_iter; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
305 use_operand_p use_p; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
306 gimple stmt; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
307 gimple def_stmt = NULL; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
308 int usecount = 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
309 tree value = NULL; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
310 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
311 if (!MAY_HAVE_DEBUG_STMTS) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
312 return; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
313 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
314 /* If this name has already been registered for replacement, do nothing |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
315 as anything that uses this name isn't in SSA form. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
316 if (name_registered_for_update_p (var)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
317 return; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
318 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
319 /* Check whether there are debug stmts that reference this variable and, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
320 if there are, decide whether we should use a debug temp. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
321 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
322 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
323 stmt = USE_STMT (use_p); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
324 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
325 if (!gimple_debug_bind_p (stmt)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
326 continue; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
327 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
328 if (usecount++) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
329 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
330 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
331 if (gimple_debug_bind_get_value (stmt) != var) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
332 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
333 /* Count this as an additional use, so as to make sure we |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
334 use a temp unless VAR's definition has a SINGLE_RHS that |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
335 can be shared. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
336 usecount++; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
337 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
338 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
339 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
340 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
341 if (!usecount) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
342 return; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
343 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
344 if (gsi) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
345 def_stmt = gsi_stmt (*gsi); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
346 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
347 def_stmt = SSA_NAME_DEF_STMT (var); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
348 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
349 /* If we didn't get an insertion point, and the stmt has already |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
350 been removed, we won't be able to insert the debug bind stmt, so |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
351 we'll have to drop debug information. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
352 if (gimple_code (def_stmt) == GIMPLE_PHI) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
353 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
354 value = degenerate_phi_result (def_stmt); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
355 if (value && walk_tree (&value, find_released_ssa_name, NULL, NULL)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
356 value = NULL; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
357 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
358 else if (is_gimple_assign (def_stmt)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
359 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
360 bool no_value = false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
361 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
362 if (!dom_info_available_p (CDI_DOMINATORS)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
363 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
364 struct walk_stmt_info wi; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
365 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
366 memset (&wi, 0, sizeof (wi)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
367 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
368 /* When removing blocks without following reverse dominance |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
369 order, we may sometimes encounter SSA_NAMEs that have |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
370 already been released, referenced in other SSA_DEFs that |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
371 we're about to release. Consider: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
372 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
373 <bb X>: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
374 v_1 = foo; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
375 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
376 <bb Y>: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
377 w_2 = v_1 + bar; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
378 # DEBUG w => w_2 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
379 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
380 If we deleted BB X first, propagating the value of w_2 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
381 won't do us any good. It's too late to recover their |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
382 original definition of v_1: when it was deleted, it was |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
383 only referenced in other DEFs, it couldn't possibly know |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
384 it should have been retained, and propagating every |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
385 single DEF just in case it might have to be propagated |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
386 into a DEBUG STMT would probably be too wasteful. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
387 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
388 When dominator information is not readily available, we |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
389 check for and accept some loss of debug information. But |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
390 if it is available, there's no excuse for us to remove |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
391 blocks in the wrong order, so we don't even check for |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
392 dead SSA NAMEs. SSA verification shall catch any |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
393 errors. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
394 if ((!gsi && !gimple_bb (def_stmt)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
395 || walk_gimple_op (def_stmt, find_released_ssa_name, &wi)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
396 no_value = true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
397 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
398 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
399 if (!no_value) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
400 value = gimple_assign_rhs_to_tree (def_stmt); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
401 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
402 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
403 if (value) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
404 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
405 /* If there's a single use of VAR, and VAR is the entire debug |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
406 expression (usecount would have been incremented again |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
407 otherwise), and the definition involves only constants and |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
408 SSA names, then we can propagate VALUE into this single use, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
409 avoiding the temp. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
410 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
411 We can also avoid using a temp if VALUE can be shared and |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
412 propagated into all uses, without generating expressions that |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
413 wouldn't be valid gimple RHSs. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
414 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
415 Other cases that would require unsharing or non-gimple RHSs |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
416 are deferred to a debug temp, although we could avoid temps |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
417 at the expense of duplication of expressions. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
418 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
419 if (CONSTANT_CLASS_P (value) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
420 || gimple_code (def_stmt) == GIMPLE_PHI |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
421 || (usecount == 1 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
422 && (!gimple_assign_single_p (def_stmt) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
423 || is_gimple_min_invariant (value))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
424 || is_gimple_reg (value)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
425 value = unshare_expr (value); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
426 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
427 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
428 gimple def_temp; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
429 tree vexpr = make_node (DEBUG_EXPR_DECL); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
430 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
431 def_temp = gimple_build_debug_bind (vexpr, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
432 unshare_expr (value), |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
433 def_stmt); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
434 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
435 DECL_ARTIFICIAL (vexpr) = 1; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
436 TREE_TYPE (vexpr) = TREE_TYPE (value); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
437 if (DECL_P (value)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
438 DECL_MODE (vexpr) = DECL_MODE (value); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
439 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
440 DECL_MODE (vexpr) = TYPE_MODE (TREE_TYPE (value)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
441 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
442 if (gsi) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
443 gsi_insert_before (gsi, def_temp, GSI_SAME_STMT); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
444 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
445 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
446 gimple_stmt_iterator ngsi = gsi_for_stmt (def_stmt); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
447 gsi_insert_before (&ngsi, def_temp, GSI_SAME_STMT); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
448 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
449 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
450 value = vexpr; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
451 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
452 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
453 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
454 FOR_EACH_IMM_USE_STMT (stmt, imm_iter, var) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
455 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
456 if (!gimple_debug_bind_p (stmt)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
457 continue; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
458 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
459 if (value) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
460 FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
461 /* unshare_expr is not needed here. vexpr is either a |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
462 SINGLE_RHS, that can be safely shared, some other RHS |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
463 that was unshared when we found it had a single debug |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
464 use, or a DEBUG_EXPR_DECL, that can be safely |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
465 shared. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
466 SET_USE (use_p, value); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
467 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
468 gimple_debug_bind_reset_value (stmt); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
469 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
470 update_stmt (stmt); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
471 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
472 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
473 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
474 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
475 /* Insert a DEBUG BIND stmt before STMT for each DEF referenced by |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
476 other DEBUG stmts, and replace uses of the DEF with the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
477 newly-created debug temp. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
478 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
479 void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
480 insert_debug_temps_for_defs (gimple_stmt_iterator *gsi) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
481 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
482 gimple stmt; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
483 ssa_op_iter op_iter; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
484 def_operand_p def_p; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
485 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
486 if (!MAY_HAVE_DEBUG_STMTS) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
487 return; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
488 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
489 stmt = gsi_stmt (*gsi); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
490 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
491 FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
492 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
493 tree var = DEF_FROM_PTR (def_p); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
494 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
495 if (TREE_CODE (var) != SSA_NAME) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
496 continue; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
497 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
498 insert_debug_temp_for_var_def (gsi, var); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
499 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
500 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
501 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
502 /* Delete SSA DEFs for SSA versions in the TOREMOVE bitmap, removing |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
503 dominated stmts before their dominators, so that release_ssa_defs |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
504 stands a chance of propagating DEFs into debug bind stmts. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
505 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
506 void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
507 release_defs_bitset (bitmap toremove) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
508 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
509 unsigned j; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
510 bitmap_iterator bi; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
511 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
512 /* Performing a topological sort is probably overkill, this will |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
513 most likely run in slightly superlinear time, rather than the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
514 pathological quadratic worst case. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
515 while (!bitmap_empty_p (toremove)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
516 EXECUTE_IF_SET_IN_BITMAP (toremove, 0, j, bi) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
517 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
518 bool remove_now = true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
519 tree var = ssa_name (j); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
520 gimple stmt; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
521 imm_use_iterator uit; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
522 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
523 FOR_EACH_IMM_USE_STMT (stmt, uit, var) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
524 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
525 ssa_op_iter dit; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
526 def_operand_p def_p; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
527 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
528 /* We can't propagate PHI nodes into debug stmts. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
529 if (gimple_code (stmt) == GIMPLE_PHI |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
530 || is_gimple_debug (stmt)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
531 continue; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
532 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
533 /* If we find another definition to remove that uses |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
534 the one we're looking at, defer the removal of this |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
535 one, so that it can be propagated into debug stmts |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
536 after the other is. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
537 FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, dit, SSA_OP_DEF) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
538 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
539 tree odef = DEF_FROM_PTR (def_p); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
540 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
541 if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
542 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
543 remove_now = false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
544 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
545 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
546 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
547 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
548 if (!remove_now) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
549 BREAK_FROM_IMM_USE_STMT (uit); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
550 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
551 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
552 if (remove_now) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
553 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
554 gimple def = SSA_NAME_DEF_STMT (var); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
555 gimple_stmt_iterator gsi = gsi_for_stmt (def); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
556 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
557 if (gimple_code (def) == GIMPLE_PHI) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
558 remove_phi_node (&gsi, true); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
559 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
560 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
561 gsi_remove (&gsi, true); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
562 release_defs (def); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
563 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
564 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
565 bitmap_clear_bit (toremove, j); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
566 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
567 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
568 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
569 |
0 | 570 /* Return true if SSA_NAME is malformed and mark it visited. |
571 | |
572 IS_VIRTUAL is true if this SSA_NAME was found inside a virtual | |
573 operand. */ | |
574 | |
575 static bool | |
576 verify_ssa_name (tree ssa_name, bool is_virtual) | |
577 { | |
578 if (TREE_CODE (ssa_name) != SSA_NAME) | |
579 { | |
580 error ("expected an SSA_NAME object"); | |
581 return true; | |
582 } | |
583 | |
584 if (TREE_TYPE (ssa_name) != TREE_TYPE (SSA_NAME_VAR (ssa_name))) | |
585 { | |
586 error ("type mismatch between an SSA_NAME and its symbol"); | |
587 return true; | |
588 } | |
589 | |
590 if (SSA_NAME_IN_FREE_LIST (ssa_name)) | |
591 { | |
592 error ("found an SSA_NAME that had been released into the free pool"); | |
593 return true; | |
594 } | |
595 | |
596 if (is_virtual && is_gimple_reg (ssa_name)) | |
597 { | |
598 error ("found a virtual definition for a GIMPLE register"); | |
599 return true; | |
600 } | |
601 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
602 if (is_virtual && SSA_NAME_VAR (ssa_name) != gimple_vop (cfun)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
603 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
604 error ("virtual SSA name for non-VOP decl"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
605 return true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
606 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
607 |
0 | 608 if (!is_virtual && !is_gimple_reg (ssa_name)) |
609 { | |
610 error ("found a real definition for a non-register"); | |
611 return true; | |
612 } | |
613 | |
614 if (SSA_NAME_IS_DEFAULT_DEF (ssa_name) | |
615 && !gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name))) | |
616 { | |
617 error ("found a default name with a non-empty defining statement"); | |
618 return true; | |
619 } | |
620 | |
621 return false; | |
622 } | |
623 | |
624 | |
625 /* Return true if the definition of SSA_NAME at block BB is malformed. | |
626 | |
627 STMT is the statement where SSA_NAME is created. | |
628 | |
629 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME | |
630 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set, | |
631 it means that the block in that array slot contains the | |
632 definition of SSA_NAME. | |
633 | |
634 IS_VIRTUAL is true if SSA_NAME is created by a VDEF. */ | |
635 | |
636 static bool | |
637 verify_def (basic_block bb, basic_block *definition_block, tree ssa_name, | |
638 gimple stmt, bool is_virtual) | |
639 { | |
640 if (verify_ssa_name (ssa_name, is_virtual)) | |
641 goto err; | |
642 | |
643 if (definition_block[SSA_NAME_VERSION (ssa_name)]) | |
644 { | |
645 error ("SSA_NAME created in two different blocks %i and %i", | |
646 definition_block[SSA_NAME_VERSION (ssa_name)]->index, bb->index); | |
647 goto err; | |
648 } | |
649 | |
650 definition_block[SSA_NAME_VERSION (ssa_name)] = bb; | |
651 | |
652 if (SSA_NAME_DEF_STMT (ssa_name) != stmt) | |
653 { | |
654 error ("SSA_NAME_DEF_STMT is wrong"); | |
655 fprintf (stderr, "Expected definition statement:\n"); | |
656 print_gimple_stmt (stderr, SSA_NAME_DEF_STMT (ssa_name), 4, TDF_VOPS); | |
657 fprintf (stderr, "\nActual definition statement:\n"); | |
658 print_gimple_stmt (stderr, stmt, 4, TDF_VOPS); | |
659 goto err; | |
660 } | |
661 | |
662 return false; | |
663 | |
664 err: | |
665 fprintf (stderr, "while verifying SSA_NAME "); | |
666 print_generic_expr (stderr, ssa_name, 0); | |
667 fprintf (stderr, " in statement\n"); | |
668 print_gimple_stmt (stderr, stmt, 4, TDF_VOPS); | |
669 | |
670 return true; | |
671 } | |
672 | |
673 | |
674 /* Return true if the use of SSA_NAME at statement STMT in block BB is | |
675 malformed. | |
676 | |
677 DEF_BB is the block where SSA_NAME was found to be created. | |
678 | |
679 IDOM contains immediate dominator information for the flowgraph. | |
680 | |
681 CHECK_ABNORMAL is true if the caller wants to check whether this use | |
682 is flowing through an abnormal edge (only used when checking PHI | |
683 arguments). | |
684 | |
685 If NAMES_DEFINED_IN_BB is not NULL, it contains a bitmap of ssa names | |
686 that are defined before STMT in basic block BB. */ | |
687 | |
688 static bool | |
689 verify_use (basic_block bb, basic_block def_bb, use_operand_p use_p, | |
690 gimple stmt, bool check_abnormal, bitmap names_defined_in_bb) | |
691 { | |
692 bool err = false; | |
693 tree ssa_name = USE_FROM_PTR (use_p); | |
694 | |
695 if (!TREE_VISITED (ssa_name)) | |
696 if (verify_imm_links (stderr, ssa_name)) | |
697 err = true; | |
698 | |
699 TREE_VISITED (ssa_name) = 1; | |
700 | |
701 if (gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name)) | |
702 && SSA_NAME_IS_DEFAULT_DEF (ssa_name)) | |
703 ; /* Default definitions have empty statements. Nothing to do. */ | |
704 else if (!def_bb) | |
705 { | |
706 error ("missing definition"); | |
707 err = true; | |
708 } | |
709 else if (bb != def_bb | |
710 && !dominated_by_p (CDI_DOMINATORS, bb, def_bb)) | |
711 { | |
712 error ("definition in block %i does not dominate use in block %i", | |
713 def_bb->index, bb->index); | |
714 err = true; | |
715 } | |
716 else if (bb == def_bb | |
717 && names_defined_in_bb != NULL | |
718 && !bitmap_bit_p (names_defined_in_bb, SSA_NAME_VERSION (ssa_name))) | |
719 { | |
720 error ("definition in block %i follows the use", def_bb->index); | |
721 err = true; | |
722 } | |
723 | |
724 if (check_abnormal | |
725 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name)) | |
726 { | |
727 error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set"); | |
728 err = true; | |
729 } | |
730 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
731 /* Make sure the use is in an appropriate list by checking the previous |
0 | 732 element to make sure it's the same. */ |
733 if (use_p->prev == NULL) | |
734 { | |
735 error ("no immediate_use list"); | |
736 err = true; | |
737 } | |
738 else | |
739 { | |
740 tree listvar; | |
741 if (use_p->prev->use == NULL) | |
742 listvar = use_p->prev->loc.ssa_name; | |
743 else | |
744 listvar = USE_FROM_PTR (use_p->prev); | |
745 if (listvar != ssa_name) | |
746 { | |
747 error ("wrong immediate use list"); | |
748 err = true; | |
749 } | |
750 } | |
751 | |
752 if (err) | |
753 { | |
754 fprintf (stderr, "for SSA_NAME: "); | |
755 print_generic_expr (stderr, ssa_name, TDF_VOPS); | |
756 fprintf (stderr, " in statement:\n"); | |
757 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS); | |
758 } | |
759 | |
760 return err; | |
761 } | |
762 | |
763 | |
764 /* Return true if any of the arguments for PHI node PHI at block BB is | |
765 malformed. | |
766 | |
767 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME | |
768 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set, | |
769 it means that the block in that array slot contains the | |
770 definition of SSA_NAME. */ | |
771 | |
772 static bool | |
773 verify_phi_args (gimple phi, basic_block bb, basic_block *definition_block) | |
774 { | |
775 edge e; | |
776 bool err = false; | |
777 size_t i, phi_num_args = gimple_phi_num_args (phi); | |
778 | |
779 if (EDGE_COUNT (bb->preds) != phi_num_args) | |
780 { | |
781 error ("incoming edge count does not match number of PHI arguments"); | |
782 err = true; | |
783 goto error; | |
784 } | |
785 | |
786 for (i = 0; i < phi_num_args; i++) | |
787 { | |
788 use_operand_p op_p = gimple_phi_arg_imm_use_ptr (phi, i); | |
789 tree op = USE_FROM_PTR (op_p); | |
790 | |
791 e = EDGE_PRED (bb, i); | |
792 | |
793 if (op == NULL_TREE) | |
794 { | |
795 error ("PHI argument is missing for edge %d->%d", | |
796 e->src->index, | |
797 e->dest->index); | |
798 err = true; | |
799 goto error; | |
800 } | |
801 | |
802 if (TREE_CODE (op) != SSA_NAME && !is_gimple_min_invariant (op)) | |
803 { | |
804 error ("PHI argument is not SSA_NAME, or invariant"); | |
805 err = true; | |
806 } | |
807 | |
808 if (TREE_CODE (op) == SSA_NAME) | |
809 { | |
810 err = verify_ssa_name (op, !is_gimple_reg (gimple_phi_result (phi))); | |
811 err |= verify_use (e->src, definition_block[SSA_NAME_VERSION (op)], | |
812 op_p, phi, e->flags & EDGE_ABNORMAL, NULL); | |
813 } | |
814 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
815 if (TREE_CODE (op) == ADDR_EXPR) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
816 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
817 tree base = TREE_OPERAND (op, 0); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
818 while (handled_component_p (base)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
819 base = TREE_OPERAND (base, 0); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
820 if ((TREE_CODE (base) == VAR_DECL |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
821 || TREE_CODE (base) == PARM_DECL |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
822 || TREE_CODE (base) == RESULT_DECL) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
823 && !TREE_ADDRESSABLE (base)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
824 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
825 error ("address taken, but ADDRESSABLE bit not set"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
826 err = true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
827 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
828 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
829 |
0 | 830 if (e->dest != bb) |
831 { | |
832 error ("wrong edge %d->%d for PHI argument", | |
833 e->src->index, e->dest->index); | |
834 err = true; | |
835 } | |
836 | |
837 if (err) | |
838 { | |
839 fprintf (stderr, "PHI argument\n"); | |
840 print_generic_stmt (stderr, op, TDF_VOPS); | |
841 goto error; | |
842 } | |
843 } | |
844 | |
845 error: | |
846 if (err) | |
847 { | |
848 fprintf (stderr, "for PHI node\n"); | |
849 print_gimple_stmt (stderr, phi, 0, TDF_VOPS|TDF_MEMSYMS); | |
850 } | |
851 | |
852 | |
853 return err; | |
854 } | |
855 | |
856 | |
857 /* Verify common invariants in the SSA web. | |
858 TODO: verify the variable annotations. */ | |
859 | |
860 void | |
861 verify_ssa (bool check_modified_stmt) | |
862 { | |
863 size_t i; | |
864 basic_block bb; | |
865 basic_block *definition_block = XCNEWVEC (basic_block, num_ssa_names); | |
866 ssa_op_iter iter; | |
867 tree op; | |
868 enum dom_state orig_dom_state = dom_info_state (CDI_DOMINATORS); | |
869 bitmap names_defined_in_bb = BITMAP_ALLOC (NULL); | |
870 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
871 gcc_assert (!need_ssa_update_p (cfun)); |
0 | 872 |
873 verify_stmts (); | |
874 | |
875 timevar_push (TV_TREE_SSA_VERIFY); | |
876 | |
877 /* Keep track of SSA names present in the IL. */ | |
878 for (i = 1; i < num_ssa_names; i++) | |
879 { | |
880 tree name = ssa_name (i); | |
881 if (name) | |
882 { | |
883 gimple stmt; | |
884 TREE_VISITED (name) = 0; | |
885 | |
886 stmt = SSA_NAME_DEF_STMT (name); | |
887 if (!gimple_nop_p (stmt)) | |
888 { | |
889 basic_block bb = gimple_bb (stmt); | |
890 verify_def (bb, definition_block, | |
891 name, stmt, !is_gimple_reg (name)); | |
892 | |
893 } | |
894 } | |
895 } | |
896 | |
897 calculate_dominance_info (CDI_DOMINATORS); | |
898 | |
899 /* Now verify all the uses and make sure they agree with the definitions | |
900 found in the previous pass. */ | |
901 FOR_EACH_BB (bb) | |
902 { | |
903 edge e; | |
904 gimple phi; | |
905 edge_iterator ei; | |
906 gimple_stmt_iterator gsi; | |
907 | |
908 /* Make sure that all edges have a clear 'aux' field. */ | |
909 FOR_EACH_EDGE (e, ei, bb->preds) | |
910 { | |
911 if (e->aux) | |
912 { | |
913 error ("AUX pointer initialized for edge %d->%d", e->src->index, | |
914 e->dest->index); | |
915 goto err; | |
916 } | |
917 } | |
918 | |
919 /* Verify the arguments for every PHI node in the block. */ | |
920 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) | |
921 { | |
922 phi = gsi_stmt (gsi); | |
923 if (verify_phi_args (phi, bb, definition_block)) | |
924 goto err; | |
925 | |
926 bitmap_set_bit (names_defined_in_bb, | |
927 SSA_NAME_VERSION (gimple_phi_result (phi))); | |
928 } | |
929 | |
930 /* Now verify all the uses and vuses in every statement of the block. */ | |
931 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) | |
932 { | |
933 gimple stmt = gsi_stmt (gsi); | |
934 use_operand_p use_p; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
935 bool has_err; |
0 | 936 |
937 if (check_modified_stmt && gimple_modified_p (stmt)) | |
938 { | |
939 error ("stmt (%p) marked modified after optimization pass: ", | |
940 (void *)stmt); | |
941 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS); | |
942 goto err; | |
943 } | |
944 | |
945 if (is_gimple_assign (stmt) | |
946 && TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME) | |
947 { | |
948 tree lhs, base_address; | |
949 | |
950 lhs = gimple_assign_lhs (stmt); | |
951 base_address = get_base_address (lhs); | |
952 | |
953 if (base_address | |
954 && SSA_VAR_P (base_address) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
955 && !gimple_vdef (stmt) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
956 && optimize > 0) |
0 | 957 { |
958 error ("statement makes a memory store, but has no VDEFS"); | |
959 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS); | |
960 goto err; | |
961 } | |
962 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
963 else if (gimple_debug_bind_p (stmt) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
964 && !gimple_debug_bind_has_value_p (stmt)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
965 continue; |
0 | 966 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
967 /* Verify the single virtual operand and its constraints. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
968 has_err = false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
969 if (gimple_vdef (stmt)) |
0 | 970 { |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
971 if (gimple_vdef_op (stmt) == NULL_DEF_OPERAND_P) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
972 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
973 error ("statement has VDEF operand not in defs list"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
974 has_err = true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
975 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
976 if (!gimple_vuse (stmt)) |
0 | 977 { |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
978 error ("statement has VDEF but no VUSE operand"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
979 has_err = true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
980 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
981 else if (SSA_NAME_VAR (gimple_vdef (stmt)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
982 != SSA_NAME_VAR (gimple_vuse (stmt))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
983 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
984 error ("VDEF and VUSE do not use the same symbol"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
985 has_err = true; |
0 | 986 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
987 has_err |= verify_ssa_name (gimple_vdef (stmt), true); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
988 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
989 if (gimple_vuse (stmt)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
990 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
991 if (gimple_vuse_op (stmt) == NULL_USE_OPERAND_P) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
992 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
993 error ("statement has VUSE operand not in uses list"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
994 has_err = true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
995 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
996 has_err |= verify_ssa_name (gimple_vuse (stmt), true); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
997 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
998 if (has_err) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
999 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1000 error ("in statement"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1001 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS|TDF_MEMSYMS); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1002 goto err; |
0 | 1003 } |
1004 | |
1005 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE|SSA_OP_DEF) | |
1006 { | |
1007 if (verify_ssa_name (op, false)) | |
1008 { | |
1009 error ("in statement"); | |
1010 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS|TDF_MEMSYMS); | |
1011 goto err; | |
1012 } | |
1013 } | |
1014 | |
1015 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE|SSA_OP_VUSE) | |
1016 { | |
1017 op = USE_FROM_PTR (use_p); | |
1018 if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)], | |
1019 use_p, stmt, false, names_defined_in_bb)) | |
1020 goto err; | |
1021 } | |
1022 | |
1023 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1024 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1025 if (SSA_NAME_DEF_STMT (op) != stmt) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1026 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1027 error ("SSA_NAME_DEF_STMT is wrong"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1028 fprintf (stderr, "Expected definition statement:\n"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1029 print_gimple_stmt (stderr, stmt, 4, TDF_VOPS); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1030 fprintf (stderr, "\nActual definition statement:\n"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1031 print_gimple_stmt (stderr, SSA_NAME_DEF_STMT (op), |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1032 4, TDF_VOPS); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1033 goto err; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1034 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1035 bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1036 } |
0 | 1037 } |
1038 | |
1039 bitmap_clear (names_defined_in_bb); | |
1040 } | |
1041 | |
1042 free (definition_block); | |
1043 | |
1044 /* Restore the dominance information to its prior known state, so | |
1045 that we do not perturb the compiler's subsequent behavior. */ | |
1046 if (orig_dom_state == DOM_NONE) | |
1047 free_dominance_info (CDI_DOMINATORS); | |
1048 else | |
1049 set_dom_info_availability (CDI_DOMINATORS, orig_dom_state); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1050 |
0 | 1051 BITMAP_FREE (names_defined_in_bb); |
1052 timevar_pop (TV_TREE_SSA_VERIFY); | |
1053 return; | |
1054 | |
1055 err: | |
1056 internal_error ("verify_ssa failed"); | |
1057 } | |
1058 | |
1059 /* Return true if the uid in both int tree maps are equal. */ | |
1060 | |
1061 int | |
1062 int_tree_map_eq (const void *va, const void *vb) | |
1063 { | |
1064 const struct int_tree_map *a = (const struct int_tree_map *) va; | |
1065 const struct int_tree_map *b = (const struct int_tree_map *) vb; | |
1066 return (a->uid == b->uid); | |
1067 } | |
1068 | |
1069 /* Hash a UID in a int_tree_map. */ | |
1070 | |
1071 unsigned int | |
1072 int_tree_map_hash (const void *item) | |
1073 { | |
1074 return ((const struct int_tree_map *)item)->uid; | |
1075 } | |
1076 | |
1077 /* Return true if the DECL_UID in both trees are equal. */ | |
1078 | |
1079 int | |
1080 uid_decl_map_eq (const void *va, const void *vb) | |
1081 { | |
1082 const_tree a = (const_tree) va; | |
1083 const_tree b = (const_tree) vb; | |
1084 return (a->decl_minimal.uid == b->decl_minimal.uid); | |
1085 } | |
1086 | |
1087 /* Hash a tree in a uid_decl_map. */ | |
1088 | |
1089 unsigned int | |
1090 uid_decl_map_hash (const void *item) | |
1091 { | |
1092 return ((const_tree)item)->decl_minimal.uid; | |
1093 } | |
1094 | |
1095 /* Return true if the DECL_UID in both trees are equal. */ | |
1096 | |
1097 static int | |
1098 uid_ssaname_map_eq (const void *va, const void *vb) | |
1099 { | |
1100 const_tree a = (const_tree) va; | |
1101 const_tree b = (const_tree) vb; | |
1102 return (a->ssa_name.var->decl_minimal.uid == b->ssa_name.var->decl_minimal.uid); | |
1103 } | |
1104 | |
1105 /* Hash a tree in a uid_decl_map. */ | |
1106 | |
1107 static unsigned int | |
1108 uid_ssaname_map_hash (const void *item) | |
1109 { | |
1110 return ((const_tree)item)->ssa_name.var->decl_minimal.uid; | |
1111 } | |
1112 | |
1113 | |
1114 /* Initialize global DFA and SSA structures. */ | |
1115 | |
1116 void | |
1117 init_tree_ssa (struct function *fn) | |
1118 { | |
1119 fn->gimple_df = GGC_CNEW (struct gimple_df); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1120 fn->gimple_df->referenced_vars = htab_create_ggc (20, uid_decl_map_hash, |
0 | 1121 uid_decl_map_eq, NULL); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1122 fn->gimple_df->default_defs = htab_create_ggc (20, uid_ssaname_map_hash, |
0 | 1123 uid_ssaname_map_eq, NULL); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1124 pt_solution_reset (&fn->gimple_df->escaped); |
0 | 1125 init_ssanames (fn, 0); |
1126 init_phinodes (); | |
1127 } | |
1128 | |
1129 | |
1130 /* Deallocate memory associated with SSA data structures for FNDECL. */ | |
1131 | |
1132 void | |
1133 delete_tree_ssa (void) | |
1134 { | |
1135 referenced_var_iterator rvi; | |
1136 tree var; | |
1137 | |
1138 /* Remove annotations from every referenced local variable. */ | |
1139 FOR_EACH_REFERENCED_VAR (var, rvi) | |
1140 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1141 if (is_global_var (var)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1142 continue; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1143 if (var_ann (var)) |
0 | 1144 { |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1145 ggc_free (var_ann (var)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1146 *DECL_VAR_ANN_PTR (var) = NULL; |
0 | 1147 } |
1148 } | |
1149 htab_delete (gimple_referenced_vars (cfun)); | |
1150 cfun->gimple_df->referenced_vars = NULL; | |
1151 | |
1152 fini_ssanames (); | |
1153 fini_phinodes (); | |
1154 | |
1155 /* We no longer maintain the SSA operand cache at this point. */ | |
1156 if (ssa_operands_active ()) | |
1157 fini_ssa_operands (); | |
1158 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1159 delete_alias_heapvars (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1160 |
0 | 1161 htab_delete (cfun->gimple_df->default_defs); |
1162 cfun->gimple_df->default_defs = NULL; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1163 pt_solution_reset (&cfun->gimple_df->escaped); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1164 if (cfun->gimple_df->decls_to_pointers != NULL) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1165 pointer_map_destroy (cfun->gimple_df->decls_to_pointers); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1166 cfun->gimple_df->decls_to_pointers = NULL; |
0 | 1167 cfun->gimple_df->modified_noreturn_calls = NULL; |
1168 cfun->gimple_df = NULL; | |
1169 | |
1170 /* We no longer need the edge variable maps. */ | |
1171 redirect_edge_var_map_destroy (); | |
1172 } | |
1173 | |
1174 /* Return true if the conversion from INNER_TYPE to OUTER_TYPE is a | |
1175 useless type conversion, otherwise return false. | |
1176 | |
1177 This function implicitly defines the middle-end type system. With | |
1178 the notion of 'a < b' meaning that useless_type_conversion_p (a, b) | |
1179 holds and 'a > b' meaning that useless_type_conversion_p (b, a) holds, | |
1180 the following invariants shall be fulfilled: | |
1181 | |
1182 1) useless_type_conversion_p is transitive. | |
1183 If a < b and b < c then a < c. | |
1184 | |
1185 2) useless_type_conversion_p is not symmetric. | |
1186 From a < b does not follow a > b. | |
1187 | |
1188 3) Types define the available set of operations applicable to values. | |
1189 A type conversion is useless if the operations for the target type | |
1190 is a subset of the operations for the source type. For example | |
1191 casts to void* are useless, casts from void* are not (void* can't | |
1192 be dereferenced or offsetted, but copied, hence its set of operations | |
1193 is a strict subset of that of all other data pointer types). Casts | |
1194 to const T* are useless (can't be written to), casts from const T* | |
1195 to T* are not. */ | |
1196 | |
1197 bool | |
1198 useless_type_conversion_p (tree outer_type, tree inner_type) | |
1199 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1200 /* Do the following before stripping toplevel qualifiers. */ |
0 | 1201 if (POINTER_TYPE_P (inner_type) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1202 && POINTER_TYPE_P (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1203 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1204 /* Do not lose casts between pointers to different address spaces. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1205 if (TYPE_ADDR_SPACE (TREE_TYPE (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1206 != TYPE_ADDR_SPACE (TREE_TYPE (inner_type))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1207 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1208 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1209 /* If the outer type is (void *) or a pointer to an incomplete |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1210 record type or a pointer to an unprototyped function, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1211 then the conversion is not necessary. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1212 if (VOID_TYPE_P (TREE_TYPE (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1213 || ((TREE_CODE (TREE_TYPE (outer_type)) == FUNCTION_TYPE |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1214 || TREE_CODE (TREE_TYPE (outer_type)) == METHOD_TYPE) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1215 && (TREE_CODE (TREE_TYPE (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1216 == TREE_CODE (TREE_TYPE (inner_type))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1217 && !TYPE_ARG_TYPES (TREE_TYPE (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1218 && useless_type_conversion_p (TREE_TYPE (TREE_TYPE (outer_type)), |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1219 TREE_TYPE (TREE_TYPE (inner_type))))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1220 return true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1221 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1222 /* Do not lose casts to restrict qualified pointers. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1223 if ((TYPE_RESTRICT (outer_type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1224 != TYPE_RESTRICT (inner_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1225 && TYPE_RESTRICT (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1226 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1227 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1228 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1229 /* From now on qualifiers on value types do not matter. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1230 inner_type = TYPE_MAIN_VARIANT (inner_type); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1231 outer_type = TYPE_MAIN_VARIANT (outer_type); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1232 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1233 if (inner_type == outer_type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1234 return true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1235 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1236 /* If we know the canonical types, compare them. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1237 if (TYPE_CANONICAL (inner_type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1238 && TYPE_CANONICAL (inner_type) == TYPE_CANONICAL (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1239 return true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1240 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1241 /* Changes in machine mode are never useless conversions unless we |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1242 deal with aggregate types in which case we defer to later checks. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1243 if (TYPE_MODE (inner_type) != TYPE_MODE (outer_type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1244 && !AGGREGATE_TYPE_P (inner_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1245 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1246 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1247 /* If both the inner and outer types are integral types, then the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1248 conversion is not necessary if they have the same mode and |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1249 signedness and precision, and both or neither are boolean. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1250 if (INTEGRAL_TYPE_P (inner_type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1251 && INTEGRAL_TYPE_P (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1252 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1253 /* Preserve changes in signedness or precision. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1254 if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1255 || TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1256 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1257 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1258 /* We don't need to preserve changes in the types minimum or |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1259 maximum value in general as these do not generate code |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1260 unless the types precisions are different. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1261 return true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1262 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1263 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1264 /* Scalar floating point types with the same mode are compatible. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1265 else if (SCALAR_FLOAT_TYPE_P (inner_type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1266 && SCALAR_FLOAT_TYPE_P (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1267 return true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1268 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1269 /* Fixed point types with the same mode are compatible. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1270 else if (FIXED_POINT_TYPE_P (inner_type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1271 && FIXED_POINT_TYPE_P (outer_type)) |
0 | 1272 return true; |
1273 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1274 /* We need to take special care recursing to pointed-to types. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1275 else if (POINTER_TYPE_P (inner_type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1276 && POINTER_TYPE_P (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1277 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1278 /* Don't lose casts between pointers to volatile and non-volatile |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1279 qualified types. Doing so would result in changing the semantics |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1280 of later accesses. For function types the volatile qualifier |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1281 is used to indicate noreturn functions. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1282 if (TREE_CODE (TREE_TYPE (outer_type)) != FUNCTION_TYPE |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1283 && TREE_CODE (TREE_TYPE (outer_type)) != METHOD_TYPE |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1284 && TREE_CODE (TREE_TYPE (inner_type)) != FUNCTION_TYPE |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1285 && TREE_CODE (TREE_TYPE (inner_type)) != METHOD_TYPE |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1286 && (TYPE_VOLATILE (TREE_TYPE (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1287 != TYPE_VOLATILE (TREE_TYPE (inner_type))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1288 && TYPE_VOLATILE (TREE_TYPE (outer_type))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1289 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1290 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1291 /* We require explicit conversions from incomplete target types. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1292 if (!COMPLETE_TYPE_P (TREE_TYPE (inner_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1293 && COMPLETE_TYPE_P (TREE_TYPE (outer_type))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1294 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1295 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1296 /* Do not lose casts between pointers that when dereferenced access |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1297 memory with different alias sets. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1298 if (get_deref_alias_set (inner_type) != get_deref_alias_set (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1299 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1300 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1301 /* We do not care for const qualification of the pointed-to types |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1302 as const qualification has no semantic value to the middle-end. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1303 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1304 /* Otherwise pointers/references are equivalent if their pointed |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1305 to types are effectively the same. We can strip qualifiers |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1306 on pointed-to types for further comparison, which is done in |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1307 the callee. Note we have to use true compatibility here |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1308 because addresses are subject to propagation into dereferences |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1309 and thus might get the original type exposed which is equivalent |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1310 to a reverse conversion. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1311 return types_compatible_p (TREE_TYPE (outer_type), |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1312 TREE_TYPE (inner_type)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1313 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1314 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1315 /* Recurse for complex types. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1316 else if (TREE_CODE (inner_type) == COMPLEX_TYPE |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1317 && TREE_CODE (outer_type) == COMPLEX_TYPE) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1318 return useless_type_conversion_p (TREE_TYPE (outer_type), |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1319 TREE_TYPE (inner_type)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1320 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1321 /* Recurse for vector types with the same number of subparts. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1322 else if (TREE_CODE (inner_type) == VECTOR_TYPE |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1323 && TREE_CODE (outer_type) == VECTOR_TYPE |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1324 && TYPE_PRECISION (inner_type) == TYPE_PRECISION (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1325 return useless_type_conversion_p (TREE_TYPE (outer_type), |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1326 TREE_TYPE (inner_type)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1327 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1328 else if (TREE_CODE (inner_type) == ARRAY_TYPE |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1329 && TREE_CODE (outer_type) == ARRAY_TYPE) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1330 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1331 /* Preserve string attributes. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1332 if (TYPE_STRING_FLAG (inner_type) != TYPE_STRING_FLAG (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1333 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1334 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1335 /* Conversions from array types with unknown extent to |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1336 array types with known extent are not useless. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1337 if (!TYPE_DOMAIN (inner_type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1338 && TYPE_DOMAIN (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1339 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1340 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1341 /* Nor are conversions from array types with non-constant size to |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1342 array types with constant size or to different size. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1343 if (TYPE_SIZE (outer_type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1344 && TREE_CODE (TYPE_SIZE (outer_type)) == INTEGER_CST |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1345 && (!TYPE_SIZE (inner_type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1346 || TREE_CODE (TYPE_SIZE (inner_type)) != INTEGER_CST |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1347 || !tree_int_cst_equal (TYPE_SIZE (outer_type), |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1348 TYPE_SIZE (inner_type)))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1349 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1350 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1351 /* Check conversions between arrays with partially known extents. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1352 If the array min/max values are constant they have to match. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1353 Otherwise allow conversions to unknown and variable extents. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1354 In particular this declares conversions that may change the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1355 mode to BLKmode as useless. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1356 if (TYPE_DOMAIN (inner_type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1357 && TYPE_DOMAIN (outer_type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1358 && TYPE_DOMAIN (inner_type) != TYPE_DOMAIN (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1359 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1360 tree inner_min = TYPE_MIN_VALUE (TYPE_DOMAIN (inner_type)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1361 tree outer_min = TYPE_MIN_VALUE (TYPE_DOMAIN (outer_type)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1362 tree inner_max = TYPE_MAX_VALUE (TYPE_DOMAIN (inner_type)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1363 tree outer_max = TYPE_MAX_VALUE (TYPE_DOMAIN (outer_type)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1364 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1365 /* After gimplification a variable min/max value carries no |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1366 additional information compared to a NULL value. All that |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1367 matters has been lowered to be part of the IL. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1368 if (inner_min && TREE_CODE (inner_min) != INTEGER_CST) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1369 inner_min = NULL_TREE; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1370 if (outer_min && TREE_CODE (outer_min) != INTEGER_CST) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1371 outer_min = NULL_TREE; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1372 if (inner_max && TREE_CODE (inner_max) != INTEGER_CST) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1373 inner_max = NULL_TREE; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1374 if (outer_max && TREE_CODE (outer_max) != INTEGER_CST) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1375 outer_max = NULL_TREE; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1376 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1377 /* Conversions NULL / variable <- cst are useless, but not |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1378 the other way around. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1379 if (outer_min |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1380 && (!inner_min |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1381 || !tree_int_cst_equal (inner_min, outer_min))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1382 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1383 if (outer_max |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1384 && (!inner_max |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1385 || !tree_int_cst_equal (inner_max, outer_max))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1386 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1387 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1388 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1389 /* Recurse on the element check. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1390 return useless_type_conversion_p (TREE_TYPE (outer_type), |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1391 TREE_TYPE (inner_type)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1392 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1393 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1394 else if ((TREE_CODE (inner_type) == FUNCTION_TYPE |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1395 || TREE_CODE (inner_type) == METHOD_TYPE) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1396 && TREE_CODE (inner_type) == TREE_CODE (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1397 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1398 tree outer_parm, inner_parm; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1399 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1400 /* If the return types are not compatible bail out. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1401 if (!useless_type_conversion_p (TREE_TYPE (outer_type), |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1402 TREE_TYPE (inner_type))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1403 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1404 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1405 /* Method types should belong to a compatible base class. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1406 if (TREE_CODE (inner_type) == METHOD_TYPE |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1407 && !useless_type_conversion_p (TYPE_METHOD_BASETYPE (outer_type), |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1408 TYPE_METHOD_BASETYPE (inner_type))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1409 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1410 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1411 /* A conversion to an unprototyped argument list is ok. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1412 if (!TYPE_ARG_TYPES (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1413 return true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1414 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1415 /* If the unqualified argument types are compatible the conversion |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1416 is useless. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1417 if (TYPE_ARG_TYPES (outer_type) == TYPE_ARG_TYPES (inner_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1418 return true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1419 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1420 for (outer_parm = TYPE_ARG_TYPES (outer_type), |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1421 inner_parm = TYPE_ARG_TYPES (inner_type); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1422 outer_parm && inner_parm; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1423 outer_parm = TREE_CHAIN (outer_parm), |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1424 inner_parm = TREE_CHAIN (inner_parm)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1425 if (!useless_type_conversion_p |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1426 (TYPE_MAIN_VARIANT (TREE_VALUE (outer_parm)), |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1427 TYPE_MAIN_VARIANT (TREE_VALUE (inner_parm)))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1428 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1429 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1430 /* If there is a mismatch in the number of arguments the functions |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1431 are not compatible. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1432 if (outer_parm || inner_parm) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1433 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1434 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1435 /* Defer to the target if necessary. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1436 if (TYPE_ATTRIBUTES (inner_type) || TYPE_ATTRIBUTES (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1437 return targetm.comp_type_attributes (outer_type, inner_type) != 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1438 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1439 return true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1440 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1441 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1442 /* For aggregates we rely on TYPE_CANONICAL exclusively and require |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1443 explicit conversions for types involving to be structurally |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1444 compared types. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1445 else if (AGGREGATE_TYPE_P (inner_type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1446 && TREE_CODE (inner_type) == TREE_CODE (outer_type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1447 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1448 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1449 return false; |
0 | 1450 } |
1451 | |
1452 /* Return true if a conversion from either type of TYPE1 and TYPE2 | |
1453 to the other is not required. Otherwise return false. */ | |
1454 | |
1455 bool | |
1456 types_compatible_p (tree type1, tree type2) | |
1457 { | |
1458 return (type1 == type2 | |
1459 || (useless_type_conversion_p (type1, type2) | |
1460 && useless_type_conversion_p (type2, type1))); | |
1461 } | |
1462 | |
1463 /* Return true if EXPR is a useless type conversion, otherwise return | |
1464 false. */ | |
1465 | |
1466 bool | |
1467 tree_ssa_useless_type_conversion (tree expr) | |
1468 { | |
1469 /* If we have an assignment that merely uses a NOP_EXPR to change | |
1470 the top of the RHS to the type of the LHS and the type conversion | |
1471 is "safe", then strip away the type conversion so that we can | |
1472 enter LHS = RHS into the const_and_copies table. */ | |
1473 if (CONVERT_EXPR_P (expr) | |
1474 || TREE_CODE (expr) == VIEW_CONVERT_EXPR | |
1475 || TREE_CODE (expr) == NON_LVALUE_EXPR) | |
1476 return useless_type_conversion_p | |
1477 (TREE_TYPE (expr), | |
1478 TREE_TYPE (TREE_OPERAND (expr, 0))); | |
1479 | |
1480 return false; | |
1481 } | |
1482 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1483 /* Strip conversions from EXP according to |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1484 tree_ssa_useless_type_conversion and return the resulting |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1485 expression. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1486 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1487 tree |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1488 tree_ssa_strip_useless_type_conversions (tree exp) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1489 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1490 while (tree_ssa_useless_type_conversion (exp)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1491 exp = TREE_OPERAND (exp, 0); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1492 return exp; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1493 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1494 |
0 | 1495 |
1496 /* Internal helper for walk_use_def_chains. VAR, FN and DATA are as | |
1497 described in walk_use_def_chains. | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1498 |
0 | 1499 VISITED is a pointer set used to mark visited SSA_NAMEs to avoid |
1500 infinite loops. We used to have a bitmap for this to just mark | |
1501 SSA versions we had visited. But non-sparse bitmaps are way too | |
1502 expensive, while sparse bitmaps may cause quadratic behavior. | |
1503 | |
1504 IS_DFS is true if the caller wants to perform a depth-first search | |
1505 when visiting PHI nodes. A DFS will visit each PHI argument and | |
1506 call FN after each one. Otherwise, all the arguments are | |
1507 visited first and then FN is called with each of the visited | |
1508 arguments in a separate pass. */ | |
1509 | |
1510 static bool | |
1511 walk_use_def_chains_1 (tree var, walk_use_def_chains_fn fn, void *data, | |
1512 struct pointer_set_t *visited, bool is_dfs) | |
1513 { | |
1514 gimple def_stmt; | |
1515 | |
1516 if (pointer_set_insert (visited, var)) | |
1517 return false; | |
1518 | |
1519 def_stmt = SSA_NAME_DEF_STMT (var); | |
1520 | |
1521 if (gimple_code (def_stmt) != GIMPLE_PHI) | |
1522 { | |
1523 /* If we reached the end of the use-def chain, call FN. */ | |
1524 return fn (var, def_stmt, data); | |
1525 } | |
1526 else | |
1527 { | |
1528 size_t i; | |
1529 | |
1530 /* When doing a breadth-first search, call FN before following the | |
1531 use-def links for each argument. */ | |
1532 if (!is_dfs) | |
1533 for (i = 0; i < gimple_phi_num_args (def_stmt); i++) | |
1534 if (fn (gimple_phi_arg_def (def_stmt, i), def_stmt, data)) | |
1535 return true; | |
1536 | |
1537 /* Follow use-def links out of each PHI argument. */ | |
1538 for (i = 0; i < gimple_phi_num_args (def_stmt); i++) | |
1539 { | |
1540 tree arg = gimple_phi_arg_def (def_stmt, i); | |
1541 | |
1542 /* ARG may be NULL for newly introduced PHI nodes. */ | |
1543 if (arg | |
1544 && TREE_CODE (arg) == SSA_NAME | |
1545 && walk_use_def_chains_1 (arg, fn, data, visited, is_dfs)) | |
1546 return true; | |
1547 } | |
1548 | |
1549 /* When doing a depth-first search, call FN after following the | |
1550 use-def links for each argument. */ | |
1551 if (is_dfs) | |
1552 for (i = 0; i < gimple_phi_num_args (def_stmt); i++) | |
1553 if (fn (gimple_phi_arg_def (def_stmt, i), def_stmt, data)) | |
1554 return true; | |
1555 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1556 |
0 | 1557 return false; |
1558 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1559 |
0 | 1560 |
1561 | |
1562 /* Walk use-def chains starting at the SSA variable VAR. Call | |
1563 function FN at each reaching definition found. FN takes three | |
1564 arguments: VAR, its defining statement (DEF_STMT) and a generic | |
1565 pointer to whatever state information that FN may want to maintain | |
1566 (DATA). FN is able to stop the walk by returning true, otherwise | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1567 in order to continue the walk, FN should return false. |
0 | 1568 |
1569 Note, that if DEF_STMT is a PHI node, the semantics are slightly | |
1570 different. The first argument to FN is no longer the original | |
1571 variable VAR, but the PHI argument currently being examined. If FN | |
1572 wants to get at VAR, it should call PHI_RESULT (PHI). | |
1573 | |
1574 If IS_DFS is true, this function will: | |
1575 | |
1576 1- walk the use-def chains for all the PHI arguments, and, | |
1577 2- call (*FN) (ARG, PHI, DATA) on all the PHI arguments. | |
1578 | |
1579 If IS_DFS is false, the two steps above are done in reverse order | |
1580 (i.e., a breadth-first search). */ | |
1581 | |
1582 void | |
1583 walk_use_def_chains (tree var, walk_use_def_chains_fn fn, void *data, | |
1584 bool is_dfs) | |
1585 { | |
1586 gimple def_stmt; | |
1587 | |
1588 gcc_assert (TREE_CODE (var) == SSA_NAME); | |
1589 | |
1590 def_stmt = SSA_NAME_DEF_STMT (var); | |
1591 | |
1592 /* We only need to recurse if the reaching definition comes from a PHI | |
1593 node. */ | |
1594 if (gimple_code (def_stmt) != GIMPLE_PHI) | |
1595 (*fn) (var, def_stmt, data); | |
1596 else | |
1597 { | |
1598 struct pointer_set_t *visited = pointer_set_create (); | |
1599 walk_use_def_chains_1 (var, fn, data, visited, is_dfs); | |
1600 pointer_set_destroy (visited); | |
1601 } | |
1602 } | |
1603 | |
1604 | |
1605 /* Emit warnings for uninitialized variables. This is done in two passes. | |
1606 | |
1607 The first pass notices real uses of SSA names with undefined values. | |
1608 Such uses are unconditionally uninitialized, and we can be certain that | |
1609 such a use is a mistake. This pass is run before most optimizations, | |
1610 so that we catch as many as we can. | |
1611 | |
1612 The second pass follows PHI nodes to find uses that are potentially | |
1613 uninitialized. In this case we can't necessarily prove that the use | |
1614 is really uninitialized. This pass is run after most optimizations, | |
1615 so that we thread as many jumps and possible, and delete as much dead | |
1616 code as possible, in order to reduce false positives. We also look | |
1617 again for plain uninitialized variables, since optimization may have | |
1618 changed conditionally uninitialized to unconditionally uninitialized. */ | |
1619 | |
1620 /* Emit a warning for T, an SSA_NAME, being uninitialized. The exact | |
1621 warning text is in MSGID and LOCUS may contain a location or be null. */ | |
1622 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1623 void |
0 | 1624 warn_uninit (tree t, const char *gmsgid, void *data) |
1625 { | |
1626 tree var = SSA_NAME_VAR (t); | |
1627 gimple context = (gimple) data; | |
1628 location_t location; | |
1629 expanded_location xloc, floc; | |
1630 | |
1631 if (!ssa_undefined_value_p (t)) | |
1632 return; | |
1633 | |
1634 /* TREE_NO_WARNING either means we already warned, or the front end | |
1635 wishes to suppress the warning. */ | |
1636 if (TREE_NO_WARNING (var)) | |
1637 return; | |
1638 | |
1639 /* Do not warn if it can be initialized outside this module. */ | |
1640 if (is_global_var (var)) | |
1641 return; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1642 |
0 | 1643 location = (context != NULL && gimple_has_location (context)) |
1644 ? gimple_location (context) | |
1645 : DECL_SOURCE_LOCATION (var); | |
1646 xloc = expand_location (location); | |
1647 floc = expand_location (DECL_SOURCE_LOCATION (cfun->decl)); | |
1648 if (warning_at (location, OPT_Wuninitialized, gmsgid, var)) | |
1649 { | |
1650 TREE_NO_WARNING (var) = 1; | |
1651 | |
1652 if (xloc.file != floc.file | |
1653 || xloc.line < floc.line | |
1654 || xloc.line > LOCATION_LINE (cfun->function_end_locus)) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1655 inform (DECL_SOURCE_LOCATION (var), "%qD was declared here", var); |
0 | 1656 } |
1657 } | |
1658 | |
1659 struct walk_data { | |
1660 gimple stmt; | |
1661 bool always_executed; | |
1662 bool warn_possibly_uninitialized; | |
1663 }; | |
1664 | |
1665 /* Called via walk_tree, look for SSA_NAMEs that have empty definitions | |
1666 and warn about them. */ | |
1667 | |
1668 static tree | |
1669 warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data_) | |
1670 { | |
1671 struct walk_stmt_info *wi = (struct walk_stmt_info *) data_; | |
1672 struct walk_data *data = (struct walk_data *) wi->info; | |
1673 tree t = *tp; | |
1674 | |
1675 /* We do not care about LHS. */ | |
1676 if (wi->is_lhs) | |
36 | 1677 { |
1678 /* Except for operands of INDIRECT_REF. */ | |
1679 if (!INDIRECT_REF_P (t)) | |
1680 return NULL_TREE; | |
1681 t = TREE_OPERAND (t, 0); | |
1682 } | |
0 | 1683 |
1684 switch (TREE_CODE (t)) | |
1685 { | |
1686 case ADDR_EXPR: | |
1687 /* Taking the address of an uninitialized variable does not | |
1688 count as using it. */ | |
1689 *walk_subtrees = 0; | |
1690 break; | |
1691 | |
1692 case VAR_DECL: | |
1693 { | |
1694 /* A VAR_DECL in the RHS of a gimple statement may mean that | |
1695 this variable is loaded from memory. */ | |
1696 use_operand_p vuse; | |
1697 tree op; | |
1698 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1699 /* If there is not gimple stmt, |
0 | 1700 or alias information has not been computed, |
1701 then we cannot check VUSE ops. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1702 if (data->stmt == NULL) |
0 | 1703 return NULL_TREE; |
1704 | |
1705 /* If the load happens as part of a call do not warn about it. */ | |
1706 if (is_gimple_call (data->stmt)) | |
1707 return NULL_TREE; | |
1708 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1709 vuse = gimple_vuse_op (data->stmt); |
0 | 1710 if (vuse == NULL_USE_OPERAND_P) |
1711 return NULL_TREE; | |
1712 | |
1713 op = USE_FROM_PTR (vuse); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1714 if (t != SSA_NAME_VAR (op) |
0 | 1715 || !SSA_NAME_IS_DEFAULT_DEF (op)) |
1716 return NULL_TREE; | |
1717 /* If this is a VUSE of t and it is the default definition, | |
1718 then warn about op. */ | |
1719 t = op; | |
1720 /* Fall through into SSA_NAME. */ | |
1721 } | |
1722 | |
1723 case SSA_NAME: | |
1724 /* We only do data flow with SSA_NAMEs, so that's all we | |
1725 can warn about. */ | |
1726 if (data->always_executed) | |
1727 warn_uninit (t, "%qD is used uninitialized in this function", | |
1728 data->stmt); | |
1729 else if (data->warn_possibly_uninitialized) | |
1730 warn_uninit (t, "%qD may be used uninitialized in this function", | |
1731 data->stmt); | |
1732 *walk_subtrees = 0; | |
1733 break; | |
1734 | |
1735 case REALPART_EXPR: | |
1736 case IMAGPART_EXPR: | |
1737 /* The total store transformation performed during gimplification | |
1738 creates uninitialized variable uses. If all is well, these will | |
1739 be optimized away, so don't warn now. */ | |
1740 if (TREE_CODE (TREE_OPERAND (t, 0)) == SSA_NAME) | |
1741 *walk_subtrees = 0; | |
1742 break; | |
1743 | |
1744 default: | |
1745 if (IS_TYPE_OR_DECL_P (t)) | |
1746 *walk_subtrees = 0; | |
1747 break; | |
1748 } | |
1749 | |
1750 return NULL_TREE; | |
1751 } | |
1752 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1753 unsigned int |
0 | 1754 warn_uninitialized_vars (bool warn_possibly_uninitialized) |
1755 { | |
1756 gimple_stmt_iterator gsi; | |
1757 basic_block bb; | |
1758 struct walk_data data; | |
1759 | |
1760 data.warn_possibly_uninitialized = warn_possibly_uninitialized; | |
1761 | |
1762 | |
1763 FOR_EACH_BB (bb) | |
1764 { | |
1765 data.always_executed = dominated_by_p (CDI_POST_DOMINATORS, | |
1766 single_succ (ENTRY_BLOCK_PTR), bb); | |
1767 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) | |
1768 { | |
1769 struct walk_stmt_info wi; | |
1770 data.stmt = gsi_stmt (gsi); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1771 if (is_gimple_debug (data.stmt)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1772 continue; |
0 | 1773 memset (&wi, 0, sizeof (wi)); |
1774 wi.info = &data; | |
1775 walk_gimple_op (gsi_stmt (gsi), warn_uninitialized_var, &wi); | |
1776 } | |
1777 } | |
1778 | |
1779 return 0; | |
1780 } | |
1781 | |
1782 static unsigned int | |
1783 execute_early_warn_uninitialized (void) | |
1784 { | |
1785 /* Currently, this pass runs always but | |
1786 execute_late_warn_uninitialized only runs with optimization. With | |
1787 optimization we want to warn about possible uninitialized as late | |
1788 as possible, thus don't do it here. However, without | |
1789 optimization we need to warn here about "may be uninitialized". | |
1790 */ | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1791 calculate_dominance_info (CDI_POST_DOMINATORS); |
0 | 1792 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1793 warn_uninitialized_vars (/*warn_possibly_uninitialized=*/!optimize); |
0 | 1794 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1795 /* Post-dominator information can not be reliably updated. Free it |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1796 after the use. */ |
0 | 1797 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1798 free_dominance_info (CDI_POST_DOMINATORS); |
0 | 1799 return 0; |
1800 } | |
1801 | |
1802 static bool | |
1803 gate_warn_uninitialized (void) | |
1804 { | |
1805 return warn_uninitialized != 0; | |
1806 } | |
1807 | |
1808 struct gimple_opt_pass pass_early_warn_uninitialized = | |
1809 { | |
1810 { | |
1811 GIMPLE_PASS, | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1812 "*early_warn_uninitialized", /* name */ |
0 | 1813 gate_warn_uninitialized, /* gate */ |
1814 execute_early_warn_uninitialized, /* execute */ | |
1815 NULL, /* sub */ | |
1816 NULL, /* next */ | |
1817 0, /* static_pass_number */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1818 TV_NONE, /* tv_id */ |
0 | 1819 PROP_ssa, /* properties_required */ |
1820 0, /* properties_provided */ | |
1821 0, /* properties_destroyed */ | |
1822 0, /* todo_flags_start */ | |
1823 0 /* todo_flags_finish */ | |
1824 } | |
1825 }; | |
1826 | |
1827 /* Compute TREE_ADDRESSABLE and DECL_GIMPLE_REG_P for local variables. */ | |
1828 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1829 void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1830 execute_update_addresses_taken (bool do_optimize) |
0 | 1831 { |
1832 tree var; | |
1833 referenced_var_iterator rvi; | |
1834 gimple_stmt_iterator gsi; | |
1835 basic_block bb; | |
1836 bitmap addresses_taken = BITMAP_ALLOC (NULL); | |
1837 bitmap not_reg_needs = BITMAP_ALLOC (NULL); | |
1838 bool update_vops = false; | |
1839 | |
1840 /* Collect into ADDRESSES_TAKEN all variables whose address is taken within | |
1841 the function body. */ | |
1842 FOR_EACH_BB (bb) | |
1843 { | |
1844 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) | |
1845 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1846 gimple stmt = gsi_stmt (gsi); |
0 | 1847 enum gimple_code code = gimple_code (stmt); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1848 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1849 /* Note all addresses taken by the stmt. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1850 gimple_ior_addresses_taken (addresses_taken, stmt); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1851 |
0 | 1852 /* If we have a call or an assignment, see if the lhs contains |
1853 a local decl that requires not to be a gimple register. */ | |
1854 if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL) | |
1855 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1856 tree lhs = gimple_get_lhs (stmt); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1857 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1858 /* We may not rewrite TMR_SYMBOL to SSA. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1859 if (lhs && TREE_CODE (lhs) == TARGET_MEM_REF |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1860 && TMR_SYMBOL (lhs)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1861 bitmap_set_bit (not_reg_needs, DECL_UID (TMR_SYMBOL (lhs))); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1862 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1863 /* A plain decl does not need it set. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1864 else if (lhs && handled_component_p (lhs)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1865 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1866 var = get_base_address (lhs); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1867 if (DECL_P (var)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1868 bitmap_set_bit (not_reg_needs, DECL_UID (var)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1869 } |
0 | 1870 } |
1871 } | |
1872 | |
1873 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) | |
1874 { | |
1875 size_t i; | |
1876 gimple phi = gsi_stmt (gsi); | |
1877 | |
1878 for (i = 0; i < gimple_phi_num_args (phi); i++) | |
1879 { | |
1880 tree op = PHI_ARG_DEF (phi, i), var; | |
1881 if (TREE_CODE (op) == ADDR_EXPR | |
1882 && (var = get_base_address (TREE_OPERAND (op, 0))) != NULL | |
1883 && DECL_P (var)) | |
1884 bitmap_set_bit (addresses_taken, DECL_UID (var)); | |
1885 } | |
1886 } | |
1887 } | |
1888 | |
1889 /* When possible, clear ADDRESSABLE bit or set the REGISTER bit | |
1890 and mark variable for conversion into SSA. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1891 if (optimize && do_optimize) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1892 FOR_EACH_REFERENCED_VAR (var, rvi) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1893 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1894 /* Global Variables, result decls cannot be changed. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1895 if (is_global_var (var) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1896 || TREE_CODE (var) == RESULT_DECL |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1897 || bitmap_bit_p (addresses_taken, DECL_UID (var))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1898 continue; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1899 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1900 if (TREE_ADDRESSABLE (var) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1901 /* Do not change TREE_ADDRESSABLE if we need to preserve var as |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1902 a non-register. Otherwise we are confused and forget to |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1903 add virtual operands for it. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1904 && (!is_gimple_reg_type (TREE_TYPE (var)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1905 || !bitmap_bit_p (not_reg_needs, DECL_UID (var)))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1906 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1907 TREE_ADDRESSABLE (var) = 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1908 if (is_gimple_reg (var)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1909 mark_sym_for_renaming (var); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1910 update_vops = true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1911 if (dump_file) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1912 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1913 fprintf (dump_file, "No longer having address taken "); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1914 print_generic_expr (dump_file, var, 0); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1915 fprintf (dump_file, "\n"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1916 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1917 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1918 if (!DECL_GIMPLE_REG_P (var) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1919 && !bitmap_bit_p (not_reg_needs, DECL_UID (var)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1920 && (TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1921 || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1922 && !TREE_THIS_VOLATILE (var) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1923 && (TREE_CODE (var) != VAR_DECL || !DECL_HARD_REGISTER (var))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1924 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1925 DECL_GIMPLE_REG_P (var) = 1; |
0 | 1926 mark_sym_for_renaming (var); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1927 update_vops = true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1928 if (dump_file) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1929 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1930 fprintf (dump_file, "Decl is now a gimple register "); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1931 print_generic_expr (dump_file, var, 0); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1932 fprintf (dump_file, "\n"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1933 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1934 } |
0 | 1935 } |
1936 | |
1937 /* Operand caches needs to be recomputed for operands referencing the updated | |
1938 variables. */ | |
1939 if (update_vops) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1940 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1941 FOR_EACH_BB (bb) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1942 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1943 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1944 gimple stmt = gsi_stmt (gsi); |
0 | 1945 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1946 if (gimple_references_memory_p (stmt) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1947 || is_gimple_debug (stmt)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1948 update_stmt (stmt); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1949 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1950 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1951 /* Update SSA form here, we are called as non-pass as well. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1952 update_ssa (TODO_update_ssa); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1953 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1954 |
0 | 1955 BITMAP_FREE (not_reg_needs); |
1956 BITMAP_FREE (addresses_taken); | |
1957 } | |
1958 | |
1959 struct gimple_opt_pass pass_update_address_taken = | |
1960 { | |
1961 { | |
1962 GIMPLE_PASS, | |
1963 "addressables", /* name */ | |
1964 NULL, /* gate */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1965 NULL, /* execute */ |
0 | 1966 NULL, /* sub */ |
1967 NULL, /* next */ | |
1968 0, /* static_pass_number */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1969 TV_NONE, /* tv_id */ |
0 | 1970 PROP_ssa, /* properties_required */ |
1971 0, /* properties_provided */ | |
1972 0, /* properties_destroyed */ | |
1973 0, /* todo_flags_start */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1974 TODO_update_address_taken |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
36
diff
changeset
|
1975 | TODO_dump_func /* todo_flags_finish */ |
0 | 1976 } |
1977 }; |