annotate gcc/tree-ssa.c @ 137:d22083d7f10b

merge
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 08 Nov 2018 14:16:42 +0900
parents 84e7813d76e9
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 /* Miscellaneous SSA utility functions.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 Copyright (C) 2001-2018 Free Software Foundation, Inc.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 This file is part of GCC.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 GCC is free software; you can redistribute it and/or modify
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 the Free Software Foundation; either version 3, or (at your option)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 any later version.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 GCC is distributed in the hope that it will be useful,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 GNU General Public License for more details.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 along with GCC; see the file COPYING3. If not see
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 <http://www.gnu.org/licenses/>. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 #include "config.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 #include "system.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 #include "coretypes.h"
111
kono
parents: 67
diff changeset
23 #include "backend.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 #include "tree.h"
111
kono
parents: 67
diff changeset
25 #include "gimple.h"
kono
parents: 67
diff changeset
26 #include "cfghooks.h"
kono
parents: 67
diff changeset
27 #include "tree-pass.h"
kono
parents: 67
diff changeset
28 #include "ssa.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
29 #include "gimple-pretty-print.h"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
30 #include "diagnostic-core.h"
111
kono
parents: 67
diff changeset
31 #include "fold-const.h"
kono
parents: 67
diff changeset
32 #include "stor-layout.h"
kono
parents: 67
diff changeset
33 #include "gimple-fold.h"
kono
parents: 67
diff changeset
34 #include "gimplify.h"
kono
parents: 67
diff changeset
35 #include "gimple-iterator.h"
kono
parents: 67
diff changeset
36 #include "gimple-walk.h"
kono
parents: 67
diff changeset
37 #include "tree-ssa-loop-manip.h"
kono
parents: 67
diff changeset
38 #include "tree-into-ssa.h"
kono
parents: 67
diff changeset
39 #include "tree-ssa.h"
kono
parents: 67
diff changeset
40 #include "cfgloop.h"
kono
parents: 67
diff changeset
41 #include "cfgexpand.h"
kono
parents: 67
diff changeset
42 #include "tree-cfg.h"
kono
parents: 67
diff changeset
43 #include "tree-dfa.h"
kono
parents: 67
diff changeset
44 #include "stringpool.h"
kono
parents: 67
diff changeset
45 #include "attribs.h"
kono
parents: 67
diff changeset
46 #include "asan.h"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 /* Pointer map of variable mappings, keyed by edge. */
111
kono
parents: 67
diff changeset
49 static hash_map<edge, auto_vec<edge_var_map> > *edge_var_maps;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 /* Add a mapping with PHI RESULT and PHI DEF associated with edge E. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 void
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
55 redirect_edge_var_map_add (edge e, tree result, tree def, source_location locus)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 edge_var_map new_node;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 if (edge_var_maps == NULL)
111
kono
parents: 67
diff changeset
60 edge_var_maps = new hash_map<edge, auto_vec<edge_var_map> >;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
111
kono
parents: 67
diff changeset
62 auto_vec<edge_var_map> &slot = edge_var_maps->get_or_insert (e);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 new_node.def = def;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 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
65 new_node.locus = locus;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66
111
kono
parents: 67
diff changeset
67 slot.safe_push (new_node);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 /* Clear the var mappings in edge E. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 redirect_edge_var_map_clear (edge e)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 if (!edge_var_maps)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78
111
kono
parents: 67
diff changeset
79 auto_vec<edge_var_map> *head = edge_var_maps->get (e);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80
111
kono
parents: 67
diff changeset
81 if (head)
kono
parents: 67
diff changeset
82 head->release ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 /* Duplicate the redirected var mappings in OLDE in NEWE.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87
111
kono
parents: 67
diff changeset
88 This assumes a hash_map can have multiple edges mapping to the same
kono
parents: 67
diff changeset
89 var_map (many to one mapping), since we don't remove the previous mappings.
kono
parents: 67
diff changeset
90 */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 redirect_edge_var_map_dup (edge newe, edge olde)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 if (!edge_var_maps)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
111
kono
parents: 67
diff changeset
98 auto_vec<edge_var_map> *new_head = &edge_var_maps->get_or_insert (newe);
kono
parents: 67
diff changeset
99 auto_vec<edge_var_map> *old_head = edge_var_maps->get (olde);
kono
parents: 67
diff changeset
100 if (!old_head)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102
111
kono
parents: 67
diff changeset
103 new_head->safe_splice (*old_head);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 /* Return the variable mappings for a given edge. If there is none, return
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 NULL. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109
111
kono
parents: 67
diff changeset
110 vec<edge_var_map> *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 redirect_edge_var_map_vector (edge e)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 /* Hey, what kind of idiot would... you'd be surprised. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 if (!edge_var_maps)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 return NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116
111
kono
parents: 67
diff changeset
117 auto_vec<edge_var_map> *slot = edge_var_maps->get (e);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 if (!slot)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 return NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120
111
kono
parents: 67
diff changeset
121 return slot;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 /* Clear the edge variable mappings. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 void
111
kono
parents: 67
diff changeset
127 redirect_edge_var_map_empty (void)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 if (edge_var_maps)
111
kono
parents: 67
diff changeset
130 edge_var_maps->empty ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 /* Remove the corresponding arguments from the PHI nodes in E's
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 destination block and redirect it to DEST. Return redirected edge.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 The list of removed arguments is stored in a vector accessed
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 through edge_var_maps. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
138
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 edge
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 ssa_redirect_edge (edge e, basic_block dest)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 {
111
kono
parents: 67
diff changeset
142 gphi_iterator gsi;
kono
parents: 67
diff changeset
143 gphi *phi;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 redirect_edge_var_map_clear (e);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146
111
kono
parents: 67
diff changeset
147 /* Remove the appropriate PHI arguments in E's destination block.
kono
parents: 67
diff changeset
148 If we are redirecting a copied edge the destination has not
kono
parents: 67
diff changeset
149 got PHI argument space reserved nor an interesting argument. */
kono
parents: 67
diff changeset
150 if (! (e->dest->flags & BB_DUPLICATED))
kono
parents: 67
diff changeset
151 for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
kono
parents: 67
diff changeset
152 {
kono
parents: 67
diff changeset
153 tree def;
kono
parents: 67
diff changeset
154 source_location locus ;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155
111
kono
parents: 67
diff changeset
156 phi = gsi.phi ();
kono
parents: 67
diff changeset
157 def = gimple_phi_arg_def (phi, e->dest_idx);
kono
parents: 67
diff changeset
158 locus = gimple_phi_arg_location (phi, e->dest_idx);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159
111
kono
parents: 67
diff changeset
160 if (def == NULL_TREE)
kono
parents: 67
diff changeset
161 continue;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162
111
kono
parents: 67
diff changeset
163 redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus);
kono
parents: 67
diff changeset
164 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 e = redirect_edge_succ_nodup (e, dest);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 return e;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 /* Add PHI arguments queued in PENDING_STMT list on edge E to edge
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 E->dest. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 flush_pending_stmts (edge e)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 {
111
kono
parents: 67
diff changeset
178 gphi *phi;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 edge_var_map *vm;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 int i;
111
kono
parents: 67
diff changeset
181 gphi_iterator gsi;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182
111
kono
parents: 67
diff changeset
183 vec<edge_var_map> *v = redirect_edge_var_map_vector (e);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 if (!v)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 for (gsi = gsi_start_phis (e->dest), i = 0;
111
kono
parents: 67
diff changeset
188 !gsi_end_p (gsi) && v->iterate (i, &vm);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 gsi_next (&gsi), i++)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 tree def;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192
111
kono
parents: 67
diff changeset
193 phi = gsi.phi ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 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
195 add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 redirect_edge_var_map_clear (e);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
200
111
kono
parents: 67
diff changeset
201 /* Replace the LHS of STMT, an assignment, either a GIMPLE_ASSIGN or a
kono
parents: 67
diff changeset
202 GIMPLE_CALL, with NLHS, in preparation for modifying the RHS to an
kono
parents: 67
diff changeset
203 expression with a different value.
kono
parents: 67
diff changeset
204
kono
parents: 67
diff changeset
205 This will update any annotations (say debug bind stmts) referring
kono
parents: 67
diff changeset
206 to the original LHS, so that they use the RHS instead. This is
kono
parents: 67
diff changeset
207 done even if NLHS and LHS are the same, for it is understood that
kono
parents: 67
diff changeset
208 the RHS will be modified afterwards, and NLHS will not be assigned
kono
parents: 67
diff changeset
209 an equivalent value.
kono
parents: 67
diff changeset
210
kono
parents: 67
diff changeset
211 Adjusting any non-annotation uses of the LHS, if needed, is a
kono
parents: 67
diff changeset
212 responsibility of the caller.
kono
parents: 67
diff changeset
213
kono
parents: 67
diff changeset
214 The effect of this call should be pretty much the same as that of
kono
parents: 67
diff changeset
215 inserting a copy of STMT before STMT, and then removing the
kono
parents: 67
diff changeset
216 original stmt, at which time gsi_remove() would have update
kono
parents: 67
diff changeset
217 annotations, but using this function saves all the inserting,
kono
parents: 67
diff changeset
218 copying and removing. */
kono
parents: 67
diff changeset
219
kono
parents: 67
diff changeset
220 void
kono
parents: 67
diff changeset
221 gimple_replace_ssa_lhs (gimple *stmt, tree nlhs)
kono
parents: 67
diff changeset
222 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
223 if (MAY_HAVE_DEBUG_BIND_STMTS)
111
kono
parents: 67
diff changeset
224 {
kono
parents: 67
diff changeset
225 tree lhs = gimple_get_lhs (stmt);
kono
parents: 67
diff changeset
226
kono
parents: 67
diff changeset
227 gcc_assert (SSA_NAME_DEF_STMT (lhs) == stmt);
kono
parents: 67
diff changeset
228
kono
parents: 67
diff changeset
229 insert_debug_temp_for_var_def (NULL, lhs);
kono
parents: 67
diff changeset
230 }
kono
parents: 67
diff changeset
231
kono
parents: 67
diff changeset
232 gimple_set_lhs (stmt, nlhs);
kono
parents: 67
diff changeset
233 }
kono
parents: 67
diff changeset
234
kono
parents: 67
diff changeset
235
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
236 /* 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
237 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
238 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
239 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
240 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
241
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
242 tree
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
243 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
244 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
245 if (!MAY_HAVE_DEBUG_BIND_STMTS)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
246 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
247
111
kono
parents: 67
diff changeset
248 if (TREE_CODE (var) == SSA_NAME)
kono
parents: 67
diff changeset
249 {
kono
parents: 67
diff changeset
250 var = SSA_NAME_VAR (var);
kono
parents: 67
diff changeset
251 if (var == NULL_TREE)
kono
parents: 67
diff changeset
252 return NULL_TREE;
kono
parents: 67
diff changeset
253 }
kono
parents: 67
diff changeset
254
kono
parents: 67
diff changeset
255 if ((!VAR_P (var) || VAR_DECL_IS_VIRTUAL_OPERAND (var))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
256 && 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
257 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
258
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
259 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
260 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
261
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
262 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
263 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
264
111
kono
parents: 67
diff changeset
265 /* var-tracking only tracks registers. */
kono
parents: 67
diff changeset
266 if (!is_gimple_reg_type (TREE_TYPE (var)))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
267 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
268
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
269 return var;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
270 }
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 /* 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
273 released. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
274
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
275 static tree
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
276 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
277 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
278 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
279
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
280 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
281 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
282
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
283 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
284 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
285 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
286 return *tp;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
287
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
288 *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
289 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
290 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
291 *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
292
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
293 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
294 }
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 /* 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
297 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
298 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
299
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
300 void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
301 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
302 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
303 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
304 use_operand_p use_p;
111
kono
parents: 67
diff changeset
305 gimple *stmt;
kono
parents: 67
diff changeset
306 gimple *def_stmt = NULL;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
307 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
308 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
309
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
310 if (!MAY_HAVE_DEBUG_BIND_STMTS)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
311 return;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
312
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
313 /* 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
314 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
315 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
316 return;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
317
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
318 /* 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
319 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
320 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
321 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
322 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
323
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
324 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
325 continue;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
326
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
327 if (usecount++)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
328 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
329
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
330 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
331 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
332 /* 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
333 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
334 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
335 usecount++;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
336 break;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
337 }
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 if (!usecount)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
341 return;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
342
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
343 if (gsi)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
344 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
345 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
346 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
347
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
348 /* 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
349 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
350 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
351 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
352 {
111
kono
parents: 67
diff changeset
353 value = degenerate_phi_result (as_a <gphi *> (def_stmt));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
354 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
355 value = NULL;
111
kono
parents: 67
diff changeset
356 /* error_mark_node is what fixup_noreturn_call changes PHI arguments
kono
parents: 67
diff changeset
357 to. */
kono
parents: 67
diff changeset
358 else if (value == error_mark_node)
kono
parents: 67
diff changeset
359 value = NULL;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
360 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
361 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
362 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
363 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
364
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
365 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
366 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
367 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
368
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
369 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
370
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
371 /* 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
372 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
373 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
374 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
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 X>:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
377 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
378
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
379 <bb Y>:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
380 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
381 # 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
382
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
383 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
384 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
385 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
386 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
387 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
388 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
389 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
390
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
391 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
392 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
393 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
394 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
395 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
396 errors. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
397 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
398 || 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
399 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
400 }
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 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
403 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
404 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
405
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
406 if (value)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
407 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
408 /* 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
409 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
410 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
411 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
412 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
413
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
414 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
415 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
416 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
417
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
418 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
419 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
420 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
421
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
422 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
423 || 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
424 || (usecount == 1
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
425 && (!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
426 || 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
427 || is_gimple_reg (value))
111
kono
parents: 67
diff changeset
428 ;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
429 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
430 {
111
kono
parents: 67
diff changeset
431 gdebug *def_temp;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
432 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
433
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
434 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
435 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
436 def_stmt);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
437
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
438 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
439 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
440 if (DECL_P (value))
111
kono
parents: 67
diff changeset
441 SET_DECL_MODE (vexpr, DECL_MODE (value));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
442 else
111
kono
parents: 67
diff changeset
443 SET_DECL_MODE (vexpr, TYPE_MODE (TREE_TYPE (value)));
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
444
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
445 if (gsi)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
446 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
447 else
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 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
450 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
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 value = vexpr;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
454 }
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
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
457 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
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 (!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
460 continue;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
461
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
462 if (value)
111
kono
parents: 67
diff changeset
463 {
kono
parents: 67
diff changeset
464 FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
kono
parents: 67
diff changeset
465 /* unshare_expr is not needed here. vexpr is either a
kono
parents: 67
diff changeset
466 SINGLE_RHS, that can be safely shared, some other RHS
kono
parents: 67
diff changeset
467 that was unshared when we found it had a single debug
kono
parents: 67
diff changeset
468 use, or a DEBUG_EXPR_DECL, that can be safely
kono
parents: 67
diff changeset
469 shared. */
kono
parents: 67
diff changeset
470 SET_USE (use_p, unshare_expr (value));
kono
parents: 67
diff changeset
471 /* If we didn't replace uses with a debug decl fold the
kono
parents: 67
diff changeset
472 resulting expression. Otherwise we end up with invalid IL. */
kono
parents: 67
diff changeset
473 if (TREE_CODE (value) != DEBUG_EXPR_DECL)
kono
parents: 67
diff changeset
474 {
kono
parents: 67
diff changeset
475 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
kono
parents: 67
diff changeset
476 fold_stmt_inplace (&gsi);
kono
parents: 67
diff changeset
477 }
kono
parents: 67
diff changeset
478 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
479 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
480 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
481
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
482 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
483 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
484 }
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
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
487 /* 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
488 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
489 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
490
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
491 void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
492 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
493 {
111
kono
parents: 67
diff changeset
494 gimple *stmt;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
495 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
496 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
497
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
498 if (!MAY_HAVE_DEBUG_BIND_STMTS)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
499 return;
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 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
502
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
503 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
504 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
505 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
506
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
507 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
508 continue;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
509
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
510 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
511 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
512 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
513
111
kono
parents: 67
diff changeset
514 /* Reset all debug stmts that use SSA_NAME(s) defined in STMT. */
kono
parents: 67
diff changeset
515
kono
parents: 67
diff changeset
516 void
kono
parents: 67
diff changeset
517 reset_debug_uses (gimple *stmt)
kono
parents: 67
diff changeset
518 {
kono
parents: 67
diff changeset
519 ssa_op_iter op_iter;
kono
parents: 67
diff changeset
520 def_operand_p def_p;
kono
parents: 67
diff changeset
521 imm_use_iterator imm_iter;
kono
parents: 67
diff changeset
522 gimple *use_stmt;
kono
parents: 67
diff changeset
523
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
524 if (!MAY_HAVE_DEBUG_BIND_STMTS)
111
kono
parents: 67
diff changeset
525 return;
kono
parents: 67
diff changeset
526
kono
parents: 67
diff changeset
527 FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
kono
parents: 67
diff changeset
528 {
kono
parents: 67
diff changeset
529 tree var = DEF_FROM_PTR (def_p);
kono
parents: 67
diff changeset
530
kono
parents: 67
diff changeset
531 if (TREE_CODE (var) != SSA_NAME)
kono
parents: 67
diff changeset
532 continue;
kono
parents: 67
diff changeset
533
kono
parents: 67
diff changeset
534 FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, var)
kono
parents: 67
diff changeset
535 {
kono
parents: 67
diff changeset
536 if (!gimple_debug_bind_p (use_stmt))
kono
parents: 67
diff changeset
537 continue;
kono
parents: 67
diff changeset
538
kono
parents: 67
diff changeset
539 gimple_debug_bind_reset_value (use_stmt);
kono
parents: 67
diff changeset
540 update_stmt (use_stmt);
kono
parents: 67
diff changeset
541 }
kono
parents: 67
diff changeset
542 }
kono
parents: 67
diff changeset
543 }
kono
parents: 67
diff changeset
544
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
545 /* 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
546 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
547 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
548
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
549 void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
550 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
551 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
552 unsigned j;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
553 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
554
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
555 /* 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
556 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
557 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
558 while (!bitmap_empty_p (toremove))
111
kono
parents: 67
diff changeset
559 {
kono
parents: 67
diff changeset
560 unsigned to_remove_bit = -1U;
kono
parents: 67
diff changeset
561 EXECUTE_IF_SET_IN_BITMAP (toremove, 0, j, bi)
kono
parents: 67
diff changeset
562 {
kono
parents: 67
diff changeset
563 if (to_remove_bit != -1U)
kono
parents: 67
diff changeset
564 {
kono
parents: 67
diff changeset
565 bitmap_clear_bit (toremove, to_remove_bit);
kono
parents: 67
diff changeset
566 to_remove_bit = -1U;
kono
parents: 67
diff changeset
567 }
kono
parents: 67
diff changeset
568
kono
parents: 67
diff changeset
569 bool remove_now = true;
kono
parents: 67
diff changeset
570 tree var = ssa_name (j);
kono
parents: 67
diff changeset
571 gimple *stmt;
kono
parents: 67
diff changeset
572 imm_use_iterator uit;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
573
111
kono
parents: 67
diff changeset
574 FOR_EACH_IMM_USE_STMT (stmt, uit, var)
kono
parents: 67
diff changeset
575 {
kono
parents: 67
diff changeset
576 ssa_op_iter dit;
kono
parents: 67
diff changeset
577 def_operand_p def_p;
kono
parents: 67
diff changeset
578
kono
parents: 67
diff changeset
579 /* We can't propagate PHI nodes into debug stmts. */
kono
parents: 67
diff changeset
580 if (gimple_code (stmt) == GIMPLE_PHI
kono
parents: 67
diff changeset
581 || is_gimple_debug (stmt))
kono
parents: 67
diff changeset
582 continue;
kono
parents: 67
diff changeset
583
kono
parents: 67
diff changeset
584 /* If we find another definition to remove that uses
kono
parents: 67
diff changeset
585 the one we're looking at, defer the removal of this
kono
parents: 67
diff changeset
586 one, so that it can be propagated into debug stmts
kono
parents: 67
diff changeset
587 after the other is. */
kono
parents: 67
diff changeset
588 FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, dit, SSA_OP_DEF)
kono
parents: 67
diff changeset
589 {
kono
parents: 67
diff changeset
590 tree odef = DEF_FROM_PTR (def_p);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
591
111
kono
parents: 67
diff changeset
592 if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef)))
kono
parents: 67
diff changeset
593 {
kono
parents: 67
diff changeset
594 remove_now = false;
kono
parents: 67
diff changeset
595 break;
kono
parents: 67
diff changeset
596 }
kono
parents: 67
diff changeset
597 }
kono
parents: 67
diff changeset
598
kono
parents: 67
diff changeset
599 if (!remove_now)
kono
parents: 67
diff changeset
600 BREAK_FROM_IMM_USE_STMT (uit);
kono
parents: 67
diff changeset
601 }
kono
parents: 67
diff changeset
602
kono
parents: 67
diff changeset
603 if (remove_now)
kono
parents: 67
diff changeset
604 {
kono
parents: 67
diff changeset
605 gimple *def = SSA_NAME_DEF_STMT (var);
kono
parents: 67
diff changeset
606 gimple_stmt_iterator gsi = gsi_for_stmt (def);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
607
111
kono
parents: 67
diff changeset
608 if (gimple_code (def) == GIMPLE_PHI)
kono
parents: 67
diff changeset
609 remove_phi_node (&gsi, true);
kono
parents: 67
diff changeset
610 else
kono
parents: 67
diff changeset
611 {
kono
parents: 67
diff changeset
612 gsi_remove (&gsi, true);
kono
parents: 67
diff changeset
613 release_defs (def);
kono
parents: 67
diff changeset
614 }
kono
parents: 67
diff changeset
615
kono
parents: 67
diff changeset
616 to_remove_bit = j;
kono
parents: 67
diff changeset
617 }
kono
parents: 67
diff changeset
618 }
kono
parents: 67
diff changeset
619 if (to_remove_bit != -1U)
kono
parents: 67
diff changeset
620 bitmap_clear_bit (toremove, to_remove_bit);
kono
parents: 67
diff changeset
621 }
kono
parents: 67
diff changeset
622
kono
parents: 67
diff changeset
623 }
kono
parents: 67
diff changeset
624
kono
parents: 67
diff changeset
625 /* Verify virtual SSA form. */
kono
parents: 67
diff changeset
626
kono
parents: 67
diff changeset
627 bool
kono
parents: 67
diff changeset
628 verify_vssa (basic_block bb, tree current_vdef, sbitmap visited)
kono
parents: 67
diff changeset
629 {
kono
parents: 67
diff changeset
630 bool err = false;
kono
parents: 67
diff changeset
631
kono
parents: 67
diff changeset
632 if (bitmap_bit_p (visited, bb->index))
kono
parents: 67
diff changeset
633 return false;
kono
parents: 67
diff changeset
634
kono
parents: 67
diff changeset
635 bitmap_set_bit (visited, bb->index);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
636
111
kono
parents: 67
diff changeset
637 /* Pick up the single virtual PHI def. */
kono
parents: 67
diff changeset
638 gphi *phi = NULL;
kono
parents: 67
diff changeset
639 for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
kono
parents: 67
diff changeset
640 gsi_next (&si))
kono
parents: 67
diff changeset
641 {
kono
parents: 67
diff changeset
642 tree res = gimple_phi_result (si.phi ());
kono
parents: 67
diff changeset
643 if (virtual_operand_p (res))
kono
parents: 67
diff changeset
644 {
kono
parents: 67
diff changeset
645 if (phi)
kono
parents: 67
diff changeset
646 {
kono
parents: 67
diff changeset
647 error ("multiple virtual PHI nodes in BB %d", bb->index);
kono
parents: 67
diff changeset
648 print_gimple_stmt (stderr, phi, 0);
kono
parents: 67
diff changeset
649 print_gimple_stmt (stderr, si.phi (), 0);
kono
parents: 67
diff changeset
650 err = true;
kono
parents: 67
diff changeset
651 }
kono
parents: 67
diff changeset
652 else
kono
parents: 67
diff changeset
653 phi = si.phi ();
kono
parents: 67
diff changeset
654 }
kono
parents: 67
diff changeset
655 }
kono
parents: 67
diff changeset
656 if (phi)
kono
parents: 67
diff changeset
657 {
kono
parents: 67
diff changeset
658 current_vdef = gimple_phi_result (phi);
kono
parents: 67
diff changeset
659 if (TREE_CODE (current_vdef) != SSA_NAME)
kono
parents: 67
diff changeset
660 {
kono
parents: 67
diff changeset
661 error ("virtual definition is not an SSA name");
kono
parents: 67
diff changeset
662 print_gimple_stmt (stderr, phi, 0);
kono
parents: 67
diff changeset
663 err = true;
kono
parents: 67
diff changeset
664 }
kono
parents: 67
diff changeset
665 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
666
111
kono
parents: 67
diff changeset
667 /* Verify stmts. */
kono
parents: 67
diff changeset
668 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
kono
parents: 67
diff changeset
669 gsi_next (&gsi))
kono
parents: 67
diff changeset
670 {
kono
parents: 67
diff changeset
671 gimple *stmt = gsi_stmt (gsi);
kono
parents: 67
diff changeset
672 tree vuse = gimple_vuse (stmt);
kono
parents: 67
diff changeset
673 if (vuse)
kono
parents: 67
diff changeset
674 {
kono
parents: 67
diff changeset
675 if (vuse != current_vdef)
kono
parents: 67
diff changeset
676 {
kono
parents: 67
diff changeset
677 error ("stmt with wrong VUSE");
kono
parents: 67
diff changeset
678 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
kono
parents: 67
diff changeset
679 fprintf (stderr, "expected ");
kono
parents: 67
diff changeset
680 print_generic_expr (stderr, current_vdef);
kono
parents: 67
diff changeset
681 fprintf (stderr, "\n");
kono
parents: 67
diff changeset
682 err = true;
kono
parents: 67
diff changeset
683 }
kono
parents: 67
diff changeset
684 tree vdef = gimple_vdef (stmt);
kono
parents: 67
diff changeset
685 if (vdef)
kono
parents: 67
diff changeset
686 {
kono
parents: 67
diff changeset
687 current_vdef = vdef;
kono
parents: 67
diff changeset
688 if (TREE_CODE (current_vdef) != SSA_NAME)
kono
parents: 67
diff changeset
689 {
kono
parents: 67
diff changeset
690 error ("virtual definition is not an SSA name");
kono
parents: 67
diff changeset
691 print_gimple_stmt (stderr, phi, 0);
kono
parents: 67
diff changeset
692 err = true;
kono
parents: 67
diff changeset
693 }
kono
parents: 67
diff changeset
694 }
kono
parents: 67
diff changeset
695 }
kono
parents: 67
diff changeset
696 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
697
111
kono
parents: 67
diff changeset
698 /* Verify destination PHI uses and recurse. */
kono
parents: 67
diff changeset
699 edge_iterator ei;
kono
parents: 67
diff changeset
700 edge e;
kono
parents: 67
diff changeset
701 FOR_EACH_EDGE (e, ei, bb->succs)
kono
parents: 67
diff changeset
702 {
kono
parents: 67
diff changeset
703 gphi *phi = get_virtual_phi (e->dest);
kono
parents: 67
diff changeset
704 if (phi
kono
parents: 67
diff changeset
705 && PHI_ARG_DEF_FROM_EDGE (phi, e) != current_vdef)
kono
parents: 67
diff changeset
706 {
kono
parents: 67
diff changeset
707 error ("PHI node with wrong VUSE on edge from BB %d",
kono
parents: 67
diff changeset
708 e->src->index);
kono
parents: 67
diff changeset
709 print_gimple_stmt (stderr, phi, 0, TDF_VOPS);
kono
parents: 67
diff changeset
710 fprintf (stderr, "expected ");
kono
parents: 67
diff changeset
711 print_generic_expr (stderr, current_vdef);
kono
parents: 67
diff changeset
712 fprintf (stderr, "\n");
kono
parents: 67
diff changeset
713 err = true;
kono
parents: 67
diff changeset
714 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
715
111
kono
parents: 67
diff changeset
716 /* Recurse. */
kono
parents: 67
diff changeset
717 err |= verify_vssa (e->dest, current_vdef, visited);
kono
parents: 67
diff changeset
718 }
kono
parents: 67
diff changeset
719
kono
parents: 67
diff changeset
720 return err;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
721 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
722
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
723 /* Return true if SSA_NAME is malformed and mark it visited.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
724
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
725 IS_VIRTUAL is true if this SSA_NAME was found inside a virtual
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
726 operand. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
727
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
728 static bool
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
729 verify_ssa_name (tree ssa_name, bool is_virtual)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
730 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
731 if (TREE_CODE (ssa_name) != SSA_NAME)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
732 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
733 error ("expected an SSA_NAME object");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
734 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
735 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
736
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
737 if (SSA_NAME_IN_FREE_LIST (ssa_name))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
738 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
739 error ("found an SSA_NAME that had been released into the free pool");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
740 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
741 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
742
111
kono
parents: 67
diff changeset
743 if (SSA_NAME_VAR (ssa_name) != NULL_TREE
kono
parents: 67
diff changeset
744 && TREE_TYPE (ssa_name) != TREE_TYPE (SSA_NAME_VAR (ssa_name)))
kono
parents: 67
diff changeset
745 {
kono
parents: 67
diff changeset
746 error ("type mismatch between an SSA_NAME and its symbol");
kono
parents: 67
diff changeset
747 return true;
kono
parents: 67
diff changeset
748 }
kono
parents: 67
diff changeset
749
kono
parents: 67
diff changeset
750 if (is_virtual && !virtual_operand_p (ssa_name))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
751 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
752 error ("found a virtual definition for a GIMPLE register");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
753 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
754 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
755
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
756 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
757 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
758 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
759 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
760 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
761
111
kono
parents: 67
diff changeset
762 if (!is_virtual && virtual_operand_p (ssa_name))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
763 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
764 error ("found a real definition for a non-register");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
765 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
766 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
767
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
768 if (SSA_NAME_IS_DEFAULT_DEF (ssa_name)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
769 && !gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name)))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
770 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
771 error ("found a default name with a non-empty defining statement");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
772 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
773 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
774
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
775 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
776 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
777
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
778
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
779 /* Return true if the definition of SSA_NAME at block BB is malformed.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
780
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
781 STMT is the statement where SSA_NAME is created.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
782
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
783 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
784 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
785 it means that the block in that array slot contains the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
786 definition of SSA_NAME.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
787
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
788 IS_VIRTUAL is true if SSA_NAME is created by a VDEF. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
789
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
790 static bool
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
791 verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
111
kono
parents: 67
diff changeset
792 gimple *stmt, bool is_virtual)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
793 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
794 if (verify_ssa_name (ssa_name, is_virtual))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
795 goto err;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
796
111
kono
parents: 67
diff changeset
797 if (SSA_NAME_VAR (ssa_name)
kono
parents: 67
diff changeset
798 && TREE_CODE (SSA_NAME_VAR (ssa_name)) == RESULT_DECL
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
799 && DECL_BY_REFERENCE (SSA_NAME_VAR (ssa_name)))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
800 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
801 error ("RESULT_DECL should be read only when DECL_BY_REFERENCE is set");
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
802 goto err;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
803 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
804
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
805 if (definition_block[SSA_NAME_VERSION (ssa_name)])
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
806 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
807 error ("SSA_NAME created in two different blocks %i and %i",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
808 definition_block[SSA_NAME_VERSION (ssa_name)]->index, bb->index);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
809 goto err;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
810 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
811
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
812 definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
813
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
814 if (SSA_NAME_DEF_STMT (ssa_name) != stmt)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
815 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
816 error ("SSA_NAME_DEF_STMT is wrong");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
817 fprintf (stderr, "Expected definition statement:\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
818 print_gimple_stmt (stderr, SSA_NAME_DEF_STMT (ssa_name), 4, TDF_VOPS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
819 fprintf (stderr, "\nActual definition statement:\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
820 print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
821 goto err;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
822 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
823
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
824 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
825
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
826 err:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
827 fprintf (stderr, "while verifying SSA_NAME ");
111
kono
parents: 67
diff changeset
828 print_generic_expr (stderr, ssa_name);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
829 fprintf (stderr, " in statement\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
830 print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
831
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
832 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
833 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
834
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
835
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
836 /* Return true if the use of SSA_NAME at statement STMT in block BB is
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
837 malformed.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
838
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
839 DEF_BB is the block where SSA_NAME was found to be created.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
840
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
841 IDOM contains immediate dominator information for the flowgraph.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
842
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
843 CHECK_ABNORMAL is true if the caller wants to check whether this use
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
844 is flowing through an abnormal edge (only used when checking PHI
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
845 arguments).
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
846
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
847 If NAMES_DEFINED_IN_BB is not NULL, it contains a bitmap of ssa names
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
848 that are defined before STMT in basic block BB. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
849
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
850 static bool
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
851 verify_use (basic_block bb, basic_block def_bb, use_operand_p use_p,
111
kono
parents: 67
diff changeset
852 gimple *stmt, bool check_abnormal, bitmap names_defined_in_bb)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
853 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
854 bool err = false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
855 tree ssa_name = USE_FROM_PTR (use_p);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
856
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
857 if (!TREE_VISITED (ssa_name))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
858 if (verify_imm_links (stderr, ssa_name))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
859 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
860
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
861 TREE_VISITED (ssa_name) = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
862
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
863 if (gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
864 && SSA_NAME_IS_DEFAULT_DEF (ssa_name))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
865 ; /* Default definitions have empty statements. Nothing to do. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
866 else if (!def_bb)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
867 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
868 error ("missing definition");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
869 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
870 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
871 else if (bb != def_bb
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
872 && !dominated_by_p (CDI_DOMINATORS, bb, def_bb))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
873 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
874 error ("definition in block %i does not dominate use in block %i",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
875 def_bb->index, bb->index);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
876 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
877 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
878 else if (bb == def_bb
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
879 && names_defined_in_bb != NULL
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
880 && !bitmap_bit_p (names_defined_in_bb, SSA_NAME_VERSION (ssa_name)))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
881 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
882 error ("definition in block %i follows the use", def_bb->index);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
883 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
884 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
885
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
886 if (check_abnormal
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
887 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
888 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
889 error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
890 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
891 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
892
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
893 /* Make sure the use is in an appropriate list by checking the previous
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
894 element to make sure it's the same. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
895 if (use_p->prev == NULL)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
896 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
897 error ("no immediate_use list");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
898 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
899 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
900 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
901 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
902 tree listvar;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
903 if (use_p->prev->use == NULL)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
904 listvar = use_p->prev->loc.ssa_name;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
905 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
906 listvar = USE_FROM_PTR (use_p->prev);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
907 if (listvar != ssa_name)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
908 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
909 error ("wrong immediate use list");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
910 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
911 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
912 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
913
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
914 if (err)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
915 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
916 fprintf (stderr, "for SSA_NAME: ");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
917 print_generic_expr (stderr, ssa_name, TDF_VOPS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
918 fprintf (stderr, " in statement:\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
919 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
920 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
921
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
922 return err;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
923 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
924
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
925
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
926 /* Return true if any of the arguments for PHI node PHI at block BB is
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
927 malformed.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
928
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
929 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
930 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
931 it means that the block in that array slot contains the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
932 definition of SSA_NAME. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
933
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
934 static bool
111
kono
parents: 67
diff changeset
935 verify_phi_args (gphi *phi, basic_block bb, basic_block *definition_block)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
936 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
937 edge e;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
938 bool err = false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
939 size_t i, phi_num_args = gimple_phi_num_args (phi);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
940
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
941 if (EDGE_COUNT (bb->preds) != phi_num_args)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
942 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
943 error ("incoming edge count does not match number of PHI arguments");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
944 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
945 goto error;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
946 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
947
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
948 for (i = 0; i < phi_num_args; i++)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
949 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
950 use_operand_p op_p = gimple_phi_arg_imm_use_ptr (phi, i);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
951 tree op = USE_FROM_PTR (op_p);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
952
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
953 e = EDGE_PRED (bb, i);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
954
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
955 if (op == NULL_TREE)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
956 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
957 error ("PHI argument is missing for edge %d->%d",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
958 e->src->index,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
959 e->dest->index);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
960 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
961 goto error;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
962 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
963
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
964 if (TREE_CODE (op) != SSA_NAME && !is_gimple_min_invariant (op))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
965 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
966 error ("PHI argument is not SSA_NAME, or invariant");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
967 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
968 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
969
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
970 if (TREE_CODE (op) == SSA_NAME)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
971 {
111
kono
parents: 67
diff changeset
972 err = verify_ssa_name (op, virtual_operand_p (gimple_phi_result (phi)));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
973 err |= verify_use (e->src, definition_block[SSA_NAME_VERSION (op)],
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
974 op_p, phi, e->flags & EDGE_ABNORMAL, NULL);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
975 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
976
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
977 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
978 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
979 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
980 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
981 base = TREE_OPERAND (base, 0);
111
kono
parents: 67
diff changeset
982 if ((VAR_P (base)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
983 || 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
984 || 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
985 && !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
986 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
987 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
988 err = true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
989 }
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
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
992 if (e->dest != bb)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
993 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
994 error ("wrong edge %d->%d for PHI argument",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
995 e->src->index, e->dest->index);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
996 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
997 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
998
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
999 if (err)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1000 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1001 fprintf (stderr, "PHI argument\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1002 print_generic_stmt (stderr, op, TDF_VOPS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1003 goto error;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1004 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1005 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1006
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1007 error:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1008 if (err)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1009 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1010 fprintf (stderr, "for PHI node\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1011 print_gimple_stmt (stderr, phi, 0, TDF_VOPS|TDF_MEMSYMS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1012 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1013
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1014
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1015 return err;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1016 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1017
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1018
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1019 /* Verify common invariants in the SSA web.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1020 TODO: verify the variable annotations. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1021
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1022 DEBUG_FUNCTION void
111
kono
parents: 67
diff changeset
1023 verify_ssa (bool check_modified_stmt, bool check_ssa_operands)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1024 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1025 basic_block bb;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1026 basic_block *definition_block = XCNEWVEC (basic_block, num_ssa_names);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1027 ssa_op_iter iter;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1028 tree op;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1029 enum dom_state orig_dom_state = dom_info_state (CDI_DOMINATORS);
111
kono
parents: 67
diff changeset
1030 auto_bitmap names_defined_in_bb;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1031
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1032 gcc_assert (!need_ssa_update_p (cfun));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1033
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1034 timevar_push (TV_TREE_SSA_VERIFY);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1035
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1036 {
111
kono
parents: 67
diff changeset
1037 /* Keep track of SSA names present in the IL. */
kono
parents: 67
diff changeset
1038 size_t i;
kono
parents: 67
diff changeset
1039 tree name;
kono
parents: 67
diff changeset
1040 hash_map <void *, tree> ssa_info;
kono
parents: 67
diff changeset
1041
kono
parents: 67
diff changeset
1042 FOR_EACH_SSA_NAME (i, name, cfun)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1043 {
111
kono
parents: 67
diff changeset
1044 gimple *stmt;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1045 TREE_VISITED (name) = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1046
111
kono
parents: 67
diff changeset
1047 verify_ssa_name (name, virtual_operand_p (name));
kono
parents: 67
diff changeset
1048
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1049 stmt = SSA_NAME_DEF_STMT (name);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1050 if (!gimple_nop_p (stmt))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1051 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1052 basic_block bb = gimple_bb (stmt);
111
kono
parents: 67
diff changeset
1053 if (verify_def (bb, definition_block,
kono
parents: 67
diff changeset
1054 name, stmt, virtual_operand_p (name)))
kono
parents: 67
diff changeset
1055 goto err;
kono
parents: 67
diff changeset
1056 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1057
111
kono
parents: 67
diff changeset
1058 void *info = NULL;
kono
parents: 67
diff changeset
1059 if (POINTER_TYPE_P (TREE_TYPE (name)))
kono
parents: 67
diff changeset
1060 info = SSA_NAME_PTR_INFO (name);
kono
parents: 67
diff changeset
1061 else if (INTEGRAL_TYPE_P (TREE_TYPE (name)))
kono
parents: 67
diff changeset
1062 info = SSA_NAME_RANGE_INFO (name);
kono
parents: 67
diff changeset
1063 if (info)
kono
parents: 67
diff changeset
1064 {
kono
parents: 67
diff changeset
1065 bool existed;
kono
parents: 67
diff changeset
1066 tree &val = ssa_info.get_or_insert (info, &existed);
kono
parents: 67
diff changeset
1067 if (existed)
kono
parents: 67
diff changeset
1068 {
kono
parents: 67
diff changeset
1069 error ("shared SSA name info");
kono
parents: 67
diff changeset
1070 print_generic_expr (stderr, val);
kono
parents: 67
diff changeset
1071 fprintf (stderr, " and ");
kono
parents: 67
diff changeset
1072 print_generic_expr (stderr, name);
kono
parents: 67
diff changeset
1073 fprintf (stderr, "\n");
kono
parents: 67
diff changeset
1074 goto err;
kono
parents: 67
diff changeset
1075 }
kono
parents: 67
diff changeset
1076 else
kono
parents: 67
diff changeset
1077 val = name;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1078 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1079 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1080 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1081
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1082 calculate_dominance_info (CDI_DOMINATORS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1083
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1084 /* Now verify all the uses and make sure they agree with the definitions
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1085 found in the previous pass. */
111
kono
parents: 67
diff changeset
1086 FOR_EACH_BB_FN (bb, cfun)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1087 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1088 edge e;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1089 edge_iterator ei;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1090
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1091 /* Make sure that all edges have a clear 'aux' field. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1092 FOR_EACH_EDGE (e, ei, bb->preds)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1093 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1094 if (e->aux)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1095 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1096 error ("AUX pointer initialized for edge %d->%d", e->src->index,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1097 e->dest->index);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1098 goto err;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1099 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1100 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1101
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1102 /* Verify the arguments for every PHI node in the block. */
111
kono
parents: 67
diff changeset
1103 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1104 {
111
kono
parents: 67
diff changeset
1105 gphi *phi = gsi.phi ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1106 if (verify_phi_args (phi, bb, definition_block))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1107 goto err;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1108
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1109 bitmap_set_bit (names_defined_in_bb,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1110 SSA_NAME_VERSION (gimple_phi_result (phi)));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1111 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1112
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1113 /* Now verify all the uses and vuses in every statement of the block. */
111
kono
parents: 67
diff changeset
1114 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
kono
parents: 67
diff changeset
1115 gsi_next (&gsi))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1116 {
111
kono
parents: 67
diff changeset
1117 gimple *stmt = gsi_stmt (gsi);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1118 use_operand_p use_p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1119
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1120 if (check_modified_stmt && gimple_modified_p (stmt))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1121 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1122 error ("stmt (%p) marked modified after optimization pass: ",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1123 (void *)stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1124 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1125 goto err;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1126 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1127
111
kono
parents: 67
diff changeset
1128 if (check_ssa_operands && verify_ssa_operands (cfun, stmt))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1129 {
111
kono
parents: 67
diff changeset
1130 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1131 goto err;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1132 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1133
111
kono
parents: 67
diff changeset
1134 if (gimple_debug_bind_p (stmt)
kono
parents: 67
diff changeset
1135 && !gimple_debug_bind_has_value_p (stmt))
kono
parents: 67
diff changeset
1136 continue;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1137
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1138 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE|SSA_OP_VUSE)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1139 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1140 op = USE_FROM_PTR (use_p);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1141 if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1142 use_p, stmt, false, names_defined_in_bb))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1143 goto err;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1144 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1145
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1146 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
1147 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1148 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
1149 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1150 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
1151 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
1152 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
1153 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
1154 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
1155 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
1156 goto err;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1157 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1158 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
1159 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1160 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1161
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1162 bitmap_clear (names_defined_in_bb);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1163 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1164
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1165 free (definition_block);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1166
111
kono
parents: 67
diff changeset
1167 if (gimple_vop (cfun)
kono
parents: 67
diff changeset
1168 && ssa_default_def (cfun, gimple_vop (cfun)))
kono
parents: 67
diff changeset
1169 {
kono
parents: 67
diff changeset
1170 auto_sbitmap visited (last_basic_block_for_fn (cfun) + 1);
kono
parents: 67
diff changeset
1171 bitmap_clear (visited);
kono
parents: 67
diff changeset
1172 if (verify_vssa (ENTRY_BLOCK_PTR_FOR_FN (cfun),
kono
parents: 67
diff changeset
1173 ssa_default_def (cfun, gimple_vop (cfun)), visited))
kono
parents: 67
diff changeset
1174 goto err;
kono
parents: 67
diff changeset
1175 }
kono
parents: 67
diff changeset
1176
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1177 /* Restore the dominance information to its prior known state, so
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1178 that we do not perturb the compiler's subsequent behavior. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1179 if (orig_dom_state == DOM_NONE)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1180 free_dominance_info (CDI_DOMINATORS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1181 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1182 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
1183
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1184 timevar_pop (TV_TREE_SSA_VERIFY);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1185 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1186
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1187 err:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1188 internal_error ("verify_ssa failed");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1189 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1190
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1191
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1192 /* Initialize global DFA and SSA structures. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1193
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1194 void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1195 init_tree_ssa (struct function *fn)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1196 {
111
kono
parents: 67
diff changeset
1197 fn->gimple_df = ggc_cleared_alloc<gimple_df> ();
kono
parents: 67
diff changeset
1198 fn->gimple_df->default_defs = hash_table<ssa_name_hasher>::create_ggc (20);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1199 pt_solution_reset (&fn->gimple_df->escaped);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1200 init_ssanames (fn, 0);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1201 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1202
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1203 /* Deallocate memory associated with SSA data structures for FNDECL. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1204
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1205 void
111
kono
parents: 67
diff changeset
1206 delete_tree_ssa (struct function *fn)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1207 {
111
kono
parents: 67
diff changeset
1208 fini_ssanames (fn);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1209
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1210 /* We no longer maintain the SSA operand cache at this point. */
111
kono
parents: 67
diff changeset
1211 if (ssa_operands_active (fn))
kono
parents: 67
diff changeset
1212 fini_ssa_operands (fn);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1213
111
kono
parents: 67
diff changeset
1214 fn->gimple_df->default_defs->empty ();
kono
parents: 67
diff changeset
1215 fn->gimple_df->default_defs = NULL;
kono
parents: 67
diff changeset
1216 pt_solution_reset (&fn->gimple_df->escaped);
kono
parents: 67
diff changeset
1217 if (fn->gimple_df->decls_to_pointers != NULL)
kono
parents: 67
diff changeset
1218 delete fn->gimple_df->decls_to_pointers;
kono
parents: 67
diff changeset
1219 fn->gimple_df->decls_to_pointers = NULL;
kono
parents: 67
diff changeset
1220 fn->gimple_df = NULL;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1221
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1222 /* We no longer need the edge variable maps. */
111
kono
parents: 67
diff changeset
1223 redirect_edge_var_map_empty ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1224 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1225
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1226 /* Return true if EXPR is a useless type conversion, otherwise return
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1227 false. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1228
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1229 bool
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1230 tree_ssa_useless_type_conversion (tree expr)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1231 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1232 /* If we have an assignment that merely uses a NOP_EXPR to change
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1233 the top of the RHS to the type of the LHS and the type conversion
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1234 is "safe", then strip away the type conversion so that we can
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1235 enter LHS = RHS into the const_and_copies table. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1236 if (CONVERT_EXPR_P (expr)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1237 || TREE_CODE (expr) == VIEW_CONVERT_EXPR
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1238 || TREE_CODE (expr) == NON_LVALUE_EXPR)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1239 return useless_type_conversion_p
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1240 (TREE_TYPE (expr),
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1241 TREE_TYPE (TREE_OPERAND (expr, 0)));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1242
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1243 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1244 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1245
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1246 /* 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
1247 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
1248 expression. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1249
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1250 tree
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1251 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
1252 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1253 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
1254 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
1255 return exp;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1256 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1257
111
kono
parents: 67
diff changeset
1258 /* Return true if T, as SSA_NAME, has an implicit default defined value. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1259
111
kono
parents: 67
diff changeset
1260 bool
kono
parents: 67
diff changeset
1261 ssa_defined_default_def_p (tree t)
kono
parents: 67
diff changeset
1262 {
kono
parents: 67
diff changeset
1263 tree var = SSA_NAME_VAR (t);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1264
111
kono
parents: 67
diff changeset
1265 if (!var)
kono
parents: 67
diff changeset
1266 ;
kono
parents: 67
diff changeset
1267 /* Parameters get their initial value from the function entry. */
kono
parents: 67
diff changeset
1268 else if (TREE_CODE (var) == PARM_DECL)
kono
parents: 67
diff changeset
1269 return true;
kono
parents: 67
diff changeset
1270 /* When returning by reference the return address is actually a hidden
kono
parents: 67
diff changeset
1271 parameter. */
kono
parents: 67
diff changeset
1272 else if (TREE_CODE (var) == RESULT_DECL && DECL_BY_REFERENCE (var))
kono
parents: 67
diff changeset
1273 return true;
kono
parents: 67
diff changeset
1274 /* Hard register variables get their initial value from the ether. */
kono
parents: 67
diff changeset
1275 else if (VAR_P (var) && DECL_HARD_REGISTER (var))
kono
parents: 67
diff changeset
1276 return true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1277
111
kono
parents: 67
diff changeset
1278 return false;
kono
parents: 67
diff changeset
1279 }
kono
parents: 67
diff changeset
1280
kono
parents: 67
diff changeset
1281
kono
parents: 67
diff changeset
1282 /* Return true if T, an SSA_NAME, has an undefined value. PARTIAL is what
kono
parents: 67
diff changeset
1283 should be returned if the value is only partially undefined. */
kono
parents: 67
diff changeset
1284
kono
parents: 67
diff changeset
1285 bool
kono
parents: 67
diff changeset
1286 ssa_undefined_value_p (tree t, bool partial)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1287 {
111
kono
parents: 67
diff changeset
1288 gimple *def_stmt;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1289
111
kono
parents: 67
diff changeset
1290 if (ssa_defined_default_def_p (t))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1291 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1292
111
kono
parents: 67
diff changeset
1293 /* The value is undefined iff its definition statement is empty. */
kono
parents: 67
diff changeset
1294 def_stmt = SSA_NAME_DEF_STMT (t);
kono
parents: 67
diff changeset
1295 if (gimple_nop_p (def_stmt))
kono
parents: 67
diff changeset
1296 return true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1297
111
kono
parents: 67
diff changeset
1298 /* Check if the complex was not only partially defined. */
kono
parents: 67
diff changeset
1299 if (partial && is_gimple_assign (def_stmt)
kono
parents: 67
diff changeset
1300 && gimple_assign_rhs_code (def_stmt) == COMPLEX_EXPR)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1301 {
111
kono
parents: 67
diff changeset
1302 tree rhs1, rhs2;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1303
111
kono
parents: 67
diff changeset
1304 rhs1 = gimple_assign_rhs1 (def_stmt);
kono
parents: 67
diff changeset
1305 rhs2 = gimple_assign_rhs2 (def_stmt);
kono
parents: 67
diff changeset
1306 return (TREE_CODE (rhs1) == SSA_NAME && ssa_undefined_value_p (rhs1))
kono
parents: 67
diff changeset
1307 || (TREE_CODE (rhs2) == SSA_NAME && ssa_undefined_value_p (rhs2));
kono
parents: 67
diff changeset
1308 }
kono
parents: 67
diff changeset
1309 return false;
kono
parents: 67
diff changeset
1310 }
kono
parents: 67
diff changeset
1311
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1312
111
kono
parents: 67
diff changeset
1313 /* Return TRUE iff STMT, a gimple statement, references an undefined
kono
parents: 67
diff changeset
1314 SSA name. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1315
111
kono
parents: 67
diff changeset
1316 bool
kono
parents: 67
diff changeset
1317 gimple_uses_undefined_value_p (gimple *stmt)
kono
parents: 67
diff changeset
1318 {
kono
parents: 67
diff changeset
1319 ssa_op_iter iter;
kono
parents: 67
diff changeset
1320 tree op;
kono
parents: 67
diff changeset
1321
kono
parents: 67
diff changeset
1322 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
kono
parents: 67
diff changeset
1323 if (ssa_undefined_value_p (op))
kono
parents: 67
diff changeset
1324 return true;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1325
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1326 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1327 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1328
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1329
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1330
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1331 /* If necessary, rewrite the base of the reference tree *TP from
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1332 a MEM_REF to a plain or converted symbol. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1333
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1334 static void
111
kono
parents: 67
diff changeset
1335 maybe_rewrite_mem_ref_base (tree *tp, bitmap suitable_for_renaming)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1336 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1337 tree sym;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1338
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1339 while (handled_component_p (*tp))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1340 tp = &TREE_OPERAND (*tp, 0);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1341 if (TREE_CODE (*tp) == MEM_REF
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1342 && TREE_CODE (TREE_OPERAND (*tp, 0)) == ADDR_EXPR
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1343 && (sym = TREE_OPERAND (TREE_OPERAND (*tp, 0), 0))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1344 && DECL_P (sym)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1345 && !TREE_ADDRESSABLE (sym)
111
kono
parents: 67
diff changeset
1346 && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))
kono
parents: 67
diff changeset
1347 && is_gimple_reg_type (TREE_TYPE (*tp))
kono
parents: 67
diff changeset
1348 && ! VOID_TYPE_P (TREE_TYPE (*tp)))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1349 {
111
kono
parents: 67
diff changeset
1350 if (TREE_CODE (TREE_TYPE (sym)) == VECTOR_TYPE
kono
parents: 67
diff changeset
1351 && useless_type_conversion_p (TREE_TYPE (*tp),
kono
parents: 67
diff changeset
1352 TREE_TYPE (TREE_TYPE (sym)))
kono
parents: 67
diff changeset
1353 && multiple_of_p (sizetype, TREE_OPERAND (*tp, 1),
kono
parents: 67
diff changeset
1354 TYPE_SIZE_UNIT (TREE_TYPE (*tp))))
kono
parents: 67
diff changeset
1355 {
kono
parents: 67
diff changeset
1356 *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym,
kono
parents: 67
diff changeset
1357 TYPE_SIZE (TREE_TYPE (*tp)),
kono
parents: 67
diff changeset
1358 int_const_binop (MULT_EXPR,
kono
parents: 67
diff changeset
1359 bitsize_int (BITS_PER_UNIT),
kono
parents: 67
diff changeset
1360 TREE_OPERAND (*tp, 1)));
kono
parents: 67
diff changeset
1361 }
kono
parents: 67
diff changeset
1362 else if (TREE_CODE (TREE_TYPE (sym)) == COMPLEX_TYPE
kono
parents: 67
diff changeset
1363 && useless_type_conversion_p (TREE_TYPE (*tp),
kono
parents: 67
diff changeset
1364 TREE_TYPE (TREE_TYPE (sym))))
kono
parents: 67
diff changeset
1365 {
kono
parents: 67
diff changeset
1366 *tp = build1 (integer_zerop (TREE_OPERAND (*tp, 1))
kono
parents: 67
diff changeset
1367 ? REALPART_EXPR : IMAGPART_EXPR,
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1368 TREE_TYPE (*tp), sym);
111
kono
parents: 67
diff changeset
1369 }
kono
parents: 67
diff changeset
1370 else if (integer_zerop (TREE_OPERAND (*tp, 1))
kono
parents: 67
diff changeset
1371 && DECL_SIZE (sym) == TYPE_SIZE (TREE_TYPE (*tp)))
kono
parents: 67
diff changeset
1372 {
kono
parents: 67
diff changeset
1373 if (!useless_type_conversion_p (TREE_TYPE (*tp),
kono
parents: 67
diff changeset
1374 TREE_TYPE (sym)))
kono
parents: 67
diff changeset
1375 *tp = build1 (VIEW_CONVERT_EXPR,
kono
parents: 67
diff changeset
1376 TREE_TYPE (*tp), sym);
kono
parents: 67
diff changeset
1377 else
kono
parents: 67
diff changeset
1378 *tp = sym;
kono
parents: 67
diff changeset
1379 }
kono
parents: 67
diff changeset
1380 else if (DECL_SIZE (sym)
kono
parents: 67
diff changeset
1381 && TREE_CODE (DECL_SIZE (sym)) == INTEGER_CST
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1382 && (known_subrange_p
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1383 (mem_ref_offset (*tp),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1384 wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (*tp))),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1385 0, wi::to_offset (DECL_SIZE_UNIT (sym))))
111
kono
parents: 67
diff changeset
1386 && (! INTEGRAL_TYPE_P (TREE_TYPE (*tp))
kono
parents: 67
diff changeset
1387 || (wi::to_offset (TYPE_SIZE (TREE_TYPE (*tp)))
kono
parents: 67
diff changeset
1388 == TYPE_PRECISION (TREE_TYPE (*tp))))
kono
parents: 67
diff changeset
1389 && wi::umod_trunc (wi::to_offset (TYPE_SIZE (TREE_TYPE (*tp))),
kono
parents: 67
diff changeset
1390 BITS_PER_UNIT) == 0)
kono
parents: 67
diff changeset
1391 {
kono
parents: 67
diff changeset
1392 *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym,
kono
parents: 67
diff changeset
1393 TYPE_SIZE (TREE_TYPE (*tp)),
kono
parents: 67
diff changeset
1394 wide_int_to_tree (bitsizetype,
kono
parents: 67
diff changeset
1395 mem_ref_offset (*tp)
kono
parents: 67
diff changeset
1396 << LOG2_BITS_PER_UNIT));
kono
parents: 67
diff changeset
1397 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1398 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1399 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1400
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1401 /* For a tree REF return its base if it is the base of a MEM_REF
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1402 that cannot be rewritten into SSA form. Otherwise return NULL_TREE. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1403
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1404 static tree
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1405 non_rewritable_mem_ref_base (tree ref)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1406 {
111
kono
parents: 67
diff changeset
1407 tree base;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1408
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1409 /* A plain decl does not need it set. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1410 if (DECL_P (ref))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1411 return NULL_TREE;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1412
111
kono
parents: 67
diff changeset
1413 if (! (base = CONST_CAST_TREE (strip_invariant_refs (ref))))
kono
parents: 67
diff changeset
1414 {
kono
parents: 67
diff changeset
1415 base = get_base_address (ref);
kono
parents: 67
diff changeset
1416 if (DECL_P (base))
kono
parents: 67
diff changeset
1417 return base;
kono
parents: 67
diff changeset
1418 return NULL_TREE;
kono
parents: 67
diff changeset
1419 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1420
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1421 /* But watch out for MEM_REFs we cannot lower to a
111
kono
parents: 67
diff changeset
1422 VIEW_CONVERT_EXPR or a BIT_FIELD_REF. */
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1423 if (TREE_CODE (base) == MEM_REF
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1424 && TREE_CODE (TREE_OPERAND (base, 0)) == ADDR_EXPR)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1425 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1426 tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
111
kono
parents: 67
diff changeset
1427 if (! DECL_P (decl))
kono
parents: 67
diff changeset
1428 return NULL_TREE;
kono
parents: 67
diff changeset
1429 if (! is_gimple_reg_type (TREE_TYPE (base))
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1430 || VOID_TYPE_P (TREE_TYPE (base))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1431 || TREE_THIS_VOLATILE (decl) != TREE_THIS_VOLATILE (base))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1432 return decl;
111
kono
parents: 67
diff changeset
1433 if ((TREE_CODE (TREE_TYPE (decl)) == VECTOR_TYPE
kono
parents: 67
diff changeset
1434 || TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE)
kono
parents: 67
diff changeset
1435 && useless_type_conversion_p (TREE_TYPE (base),
kono
parents: 67
diff changeset
1436 TREE_TYPE (TREE_TYPE (decl)))
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1437 && known_ge (mem_ref_offset (base), 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1438 && known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1439 mem_ref_offset (base))
111
kono
parents: 67
diff changeset
1440 && multiple_of_p (sizetype, TREE_OPERAND (base, 1),
kono
parents: 67
diff changeset
1441 TYPE_SIZE_UNIT (TREE_TYPE (base))))
kono
parents: 67
diff changeset
1442 return NULL_TREE;
kono
parents: 67
diff changeset
1443 /* For same sizes and zero offset we can use a VIEW_CONVERT_EXPR. */
kono
parents: 67
diff changeset
1444 if (integer_zerop (TREE_OPERAND (base, 1))
kono
parents: 67
diff changeset
1445 && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (base)))
kono
parents: 67
diff changeset
1446 return NULL_TREE;
kono
parents: 67
diff changeset
1447 /* For integral typed extracts we can use a BIT_FIELD_REF. */
kono
parents: 67
diff changeset
1448 if (DECL_SIZE (decl)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1449 && (known_subrange_p
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1450 (mem_ref_offset (base),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1451 wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (base))),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1452 0, wi::to_poly_offset (DECL_SIZE_UNIT (decl))))
111
kono
parents: 67
diff changeset
1453 /* ??? We can't handle bitfield precision extracts without
kono
parents: 67
diff changeset
1454 either using an alternate type for the BIT_FIELD_REF and
kono
parents: 67
diff changeset
1455 then doing a conversion or possibly adjusting the offset
kono
parents: 67
diff changeset
1456 according to endianness. */
kono
parents: 67
diff changeset
1457 && (! INTEGRAL_TYPE_P (TREE_TYPE (base))
kono
parents: 67
diff changeset
1458 || (wi::to_offset (TYPE_SIZE (TREE_TYPE (base)))
kono
parents: 67
diff changeset
1459 == TYPE_PRECISION (TREE_TYPE (base))))
kono
parents: 67
diff changeset
1460 && wi::umod_trunc (wi::to_offset (TYPE_SIZE (TREE_TYPE (base))),
kono
parents: 67
diff changeset
1461 BITS_PER_UNIT) == 0)
kono
parents: 67
diff changeset
1462 return NULL_TREE;
kono
parents: 67
diff changeset
1463 return decl;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1464 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1465
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1466 return NULL_TREE;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1467 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1468
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1469 /* For an lvalue tree LHS return true if it cannot be rewritten into SSA form.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1470 Otherwise return true. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1471
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1472 static bool
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1473 non_rewritable_lvalue_p (tree lhs)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1474 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1475 /* A plain decl is always rewritable. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1476 if (DECL_P (lhs))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1477 return false;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1478
111
kono
parents: 67
diff changeset
1479 /* We can re-write REALPART_EXPR and IMAGPART_EXPR sets in
kono
parents: 67
diff changeset
1480 a reasonably efficient manner... */
kono
parents: 67
diff changeset
1481 if ((TREE_CODE (lhs) == REALPART_EXPR
kono
parents: 67
diff changeset
1482 || TREE_CODE (lhs) == IMAGPART_EXPR)
kono
parents: 67
diff changeset
1483 && DECL_P (TREE_OPERAND (lhs, 0)))
kono
parents: 67
diff changeset
1484 return false;
kono
parents: 67
diff changeset
1485
kono
parents: 67
diff changeset
1486 /* ??? The following could be relaxed allowing component
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1487 references that do not change the access size. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1488 if (TREE_CODE (lhs) == MEM_REF
111
kono
parents: 67
diff changeset
1489 && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1490 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1491 tree decl = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0);
111
kono
parents: 67
diff changeset
1492
kono
parents: 67
diff changeset
1493 /* A decl that is wrapped inside a MEM-REF that covers
kono
parents: 67
diff changeset
1494 it full is also rewritable. */
kono
parents: 67
diff changeset
1495 if (integer_zerop (TREE_OPERAND (lhs, 1))
kono
parents: 67
diff changeset
1496 && DECL_P (decl)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1497 && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (lhs))
111
kono
parents: 67
diff changeset
1498 /* If the dynamic type of the decl has larger precision than
kono
parents: 67
diff changeset
1499 the decl itself we can't use the decls type for SSA rewriting. */
kono
parents: 67
diff changeset
1500 && ((! INTEGRAL_TYPE_P (TREE_TYPE (decl))
kono
parents: 67
diff changeset
1501 || compare_tree_int (DECL_SIZE (decl),
kono
parents: 67
diff changeset
1502 TYPE_PRECISION (TREE_TYPE (decl))) == 0)
kono
parents: 67
diff changeset
1503 || (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
kono
parents: 67
diff changeset
1504 && (TYPE_PRECISION (TREE_TYPE (decl))
kono
parents: 67
diff changeset
1505 >= TYPE_PRECISION (TREE_TYPE (lhs)))))
kono
parents: 67
diff changeset
1506 /* Make sure we are not re-writing non-float copying into float
kono
parents: 67
diff changeset
1507 copying as that can incur normalization. */
kono
parents: 67
diff changeset
1508 && (! FLOAT_TYPE_P (TREE_TYPE (decl))
kono
parents: 67
diff changeset
1509 || types_compatible_p (TREE_TYPE (lhs), TREE_TYPE (decl)))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1510 && (TREE_THIS_VOLATILE (decl) == TREE_THIS_VOLATILE (lhs)))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1511 return false;
111
kono
parents: 67
diff changeset
1512
kono
parents: 67
diff changeset
1513 /* A vector-insert using a MEM_REF or ARRAY_REF is rewritable
kono
parents: 67
diff changeset
1514 using a BIT_INSERT_EXPR. */
kono
parents: 67
diff changeset
1515 if (DECL_P (decl)
kono
parents: 67
diff changeset
1516 && VECTOR_TYPE_P (TREE_TYPE (decl))
kono
parents: 67
diff changeset
1517 && TYPE_MODE (TREE_TYPE (decl)) != BLKmode
kono
parents: 67
diff changeset
1518 && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
kono
parents: 67
diff changeset
1519 TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl))), 0)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1520 && known_ge (mem_ref_offset (lhs), 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1521 && known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1522 mem_ref_offset (lhs))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1523 && multiple_of_p (sizetype, TREE_OPERAND (lhs, 1),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1524 TYPE_SIZE_UNIT (TREE_TYPE (lhs))))
111
kono
parents: 67
diff changeset
1525 return false;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1526 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1527
111
kono
parents: 67
diff changeset
1528 /* A vector-insert using a BIT_FIELD_REF is rewritable using
kono
parents: 67
diff changeset
1529 BIT_INSERT_EXPR. */
kono
parents: 67
diff changeset
1530 if (TREE_CODE (lhs) == BIT_FIELD_REF
kono
parents: 67
diff changeset
1531 && DECL_P (TREE_OPERAND (lhs, 0))
kono
parents: 67
diff changeset
1532 && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (lhs, 0)))
kono
parents: 67
diff changeset
1533 && TYPE_MODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) != BLKmode
kono
parents: 67
diff changeset
1534 && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
kono
parents: 67
diff changeset
1535 TYPE_SIZE_UNIT
kono
parents: 67
diff changeset
1536 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (lhs, 0)))), 0)
kono
parents: 67
diff changeset
1537 && (tree_to_uhwi (TREE_OPERAND (lhs, 2))
kono
parents: 67
diff changeset
1538 % tree_to_uhwi (TYPE_SIZE (TREE_TYPE (lhs)))) == 0)
kono
parents: 67
diff changeset
1539 return false;
kono
parents: 67
diff changeset
1540
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1541 return true;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1542 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1543
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1544 /* When possible, clear TREE_ADDRESSABLE bit or set DECL_GIMPLE_REG_P bit and
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1545 mark the variable VAR for conversion into SSA. Return true when updating
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1546 stmts is required. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1547
111
kono
parents: 67
diff changeset
1548 static void
kono
parents: 67
diff changeset
1549 maybe_optimize_var (tree var, bitmap addresses_taken, bitmap not_reg_needs,
kono
parents: 67
diff changeset
1550 bitmap suitable_for_renaming)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1551 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1552 /* Global Variables, result decls cannot be changed. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1553 if (is_global_var (var)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1554 || TREE_CODE (var) == RESULT_DECL
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1555 || bitmap_bit_p (addresses_taken, DECL_UID (var)))
111
kono
parents: 67
diff changeset
1556 return;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1557
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1558 if (TREE_ADDRESSABLE (var)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1559 /* Do not change TREE_ADDRESSABLE if we need to preserve var as
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1560 a non-register. Otherwise we are confused and forget to
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1561 add virtual operands for it. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1562 && (!is_gimple_reg_type (TREE_TYPE (var))
111
kono
parents: 67
diff changeset
1563 || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE
kono
parents: 67
diff changeset
1564 || TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1565 || !bitmap_bit_p (not_reg_needs, DECL_UID (var))))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1566 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1567 TREE_ADDRESSABLE (var) = 0;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1568 /* If we cleared TREE_ADDRESSABLE make sure DECL_GIMPLE_REG_P
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1569 is unset if we cannot rewrite the var into SSA. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1570 if ((TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1571 || TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1572 && bitmap_bit_p (not_reg_needs, DECL_UID (var)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1573 DECL_GIMPLE_REG_P (var) = 0;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1574 if (is_gimple_reg (var))
111
kono
parents: 67
diff changeset
1575 bitmap_set_bit (suitable_for_renaming, DECL_UID (var));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1576 if (dump_file)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1577 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1578 fprintf (dump_file, "No longer having address taken: ");
111
kono
parents: 67
diff changeset
1579 print_generic_expr (dump_file, var);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1580 fprintf (dump_file, "\n");
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1581 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1582 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1583
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1584 if (!DECL_GIMPLE_REG_P (var)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1585 && !bitmap_bit_p (not_reg_needs, DECL_UID (var))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1586 && (TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1587 || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1588 && !TREE_THIS_VOLATILE (var)
111
kono
parents: 67
diff changeset
1589 && (!VAR_P (var) || !DECL_HARD_REGISTER (var)))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1590 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1591 DECL_GIMPLE_REG_P (var) = 1;
111
kono
parents: 67
diff changeset
1592 bitmap_set_bit (suitable_for_renaming, DECL_UID (var));
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1593 if (dump_file)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1594 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1595 fprintf (dump_file, "Now a gimple register: ");
111
kono
parents: 67
diff changeset
1596 print_generic_expr (dump_file, var);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1597 fprintf (dump_file, "\n");
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1598 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1599 }
111
kono
parents: 67
diff changeset
1600 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1601
111
kono
parents: 67
diff changeset
1602 /* Return true when STMT is ASAN mark where second argument is an address
kono
parents: 67
diff changeset
1603 of a local variable. */
kono
parents: 67
diff changeset
1604
kono
parents: 67
diff changeset
1605 static bool
kono
parents: 67
diff changeset
1606 is_asan_mark_p (gimple *stmt)
kono
parents: 67
diff changeset
1607 {
kono
parents: 67
diff changeset
1608 if (!gimple_call_internal_p (stmt, IFN_ASAN_MARK))
kono
parents: 67
diff changeset
1609 return false;
kono
parents: 67
diff changeset
1610
kono
parents: 67
diff changeset
1611 tree addr = get_base_address (gimple_call_arg (stmt, 1));
kono
parents: 67
diff changeset
1612 if (TREE_CODE (addr) == ADDR_EXPR
kono
parents: 67
diff changeset
1613 && VAR_P (TREE_OPERAND (addr, 0)))
kono
parents: 67
diff changeset
1614 {
kono
parents: 67
diff changeset
1615 tree var = TREE_OPERAND (addr, 0);
kono
parents: 67
diff changeset
1616 if (lookup_attribute (ASAN_USE_AFTER_SCOPE_ATTRIBUTE,
kono
parents: 67
diff changeset
1617 DECL_ATTRIBUTES (var)))
kono
parents: 67
diff changeset
1618 return false;
kono
parents: 67
diff changeset
1619
kono
parents: 67
diff changeset
1620 unsigned addressable = TREE_ADDRESSABLE (var);
kono
parents: 67
diff changeset
1621 TREE_ADDRESSABLE (var) = 0;
kono
parents: 67
diff changeset
1622 bool r = is_gimple_reg (var);
kono
parents: 67
diff changeset
1623 TREE_ADDRESSABLE (var) = addressable;
kono
parents: 67
diff changeset
1624 return r;
kono
parents: 67
diff changeset
1625 }
kono
parents: 67
diff changeset
1626
kono
parents: 67
diff changeset
1627 return false;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1628 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1629
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1630 /* Compute TREE_ADDRESSABLE and DECL_GIMPLE_REG_P for local variables. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1631
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1632 void
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1633 execute_update_addresses_taken (void)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1634 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1635 basic_block bb;
111
kono
parents: 67
diff changeset
1636 auto_bitmap addresses_taken;
kono
parents: 67
diff changeset
1637 auto_bitmap not_reg_needs;
kono
parents: 67
diff changeset
1638 auto_bitmap suitable_for_renaming;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1639 tree var;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1640 unsigned i;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1641
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1642 timevar_push (TV_ADDRESS_TAKEN);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1643
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1644 /* Collect into ADDRESSES_TAKEN all variables whose address is taken within
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1645 the function body. */
111
kono
parents: 67
diff changeset
1646 FOR_EACH_BB_FN (bb, cfun)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1647 {
111
kono
parents: 67
diff changeset
1648 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
kono
parents: 67
diff changeset
1649 gsi_next (&gsi))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1650 {
111
kono
parents: 67
diff changeset
1651 gimple *stmt = gsi_stmt (gsi);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1652 enum gimple_code code = gimple_code (stmt);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1653 tree decl;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1654
111
kono
parents: 67
diff changeset
1655 if (code == GIMPLE_CALL)
kono
parents: 67
diff changeset
1656 {
kono
parents: 67
diff changeset
1657 if (optimize_atomic_compare_exchange_p (stmt))
kono
parents: 67
diff changeset
1658 {
kono
parents: 67
diff changeset
1659 /* For __atomic_compare_exchange_N if the second argument
kono
parents: 67
diff changeset
1660 is &var, don't mark var addressable;
kono
parents: 67
diff changeset
1661 if it becomes non-addressable, we'll rewrite it into
kono
parents: 67
diff changeset
1662 ATOMIC_COMPARE_EXCHANGE call. */
kono
parents: 67
diff changeset
1663 tree arg = gimple_call_arg (stmt, 1);
kono
parents: 67
diff changeset
1664 gimple_call_set_arg (stmt, 1, null_pointer_node);
kono
parents: 67
diff changeset
1665 gimple_ior_addresses_taken (addresses_taken, stmt);
kono
parents: 67
diff changeset
1666 gimple_call_set_arg (stmt, 1, arg);
kono
parents: 67
diff changeset
1667 }
kono
parents: 67
diff changeset
1668 else if (is_asan_mark_p (stmt)
kono
parents: 67
diff changeset
1669 || gimple_call_internal_p (stmt, IFN_GOMP_SIMT_ENTER))
kono
parents: 67
diff changeset
1670 ;
kono
parents: 67
diff changeset
1671 else
kono
parents: 67
diff changeset
1672 gimple_ior_addresses_taken (addresses_taken, stmt);
kono
parents: 67
diff changeset
1673 }
kono
parents: 67
diff changeset
1674 else
kono
parents: 67
diff changeset
1675 /* Note all addresses taken by the stmt. */
kono
parents: 67
diff changeset
1676 gimple_ior_addresses_taken (addresses_taken, stmt);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1677
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1678 /* If we have a call or an assignment, see if the lhs contains
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1679 a local decl that requires not to be a gimple register. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1680 if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1681 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1682 tree lhs = gimple_get_lhs (stmt);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1683 if (lhs
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1684 && TREE_CODE (lhs) != SSA_NAME
111
kono
parents: 67
diff changeset
1685 && ((code == GIMPLE_CALL && ! DECL_P (lhs))
kono
parents: 67
diff changeset
1686 || non_rewritable_lvalue_p (lhs)))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1687 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1688 decl = get_base_address (lhs);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1689 if (DECL_P (decl))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1690 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1691 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1692 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1693
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1694 if (gimple_assign_single_p (stmt))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1695 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1696 tree rhs = gimple_assign_rhs1 (stmt);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1697 if ((decl = non_rewritable_mem_ref_base (rhs)))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1698 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1699 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1700
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1701 else if (code == GIMPLE_CALL)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1702 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1703 for (i = 0; i < gimple_call_num_args (stmt); ++i)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1704 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1705 tree arg = gimple_call_arg (stmt, i);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1706 if ((decl = non_rewritable_mem_ref_base (arg)))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1707 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1708 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1709 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1710
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1711 else if (code == GIMPLE_ASM)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1712 {
111
kono
parents: 67
diff changeset
1713 gasm *asm_stmt = as_a <gasm *> (stmt);
kono
parents: 67
diff changeset
1714 for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1715 {
111
kono
parents: 67
diff changeset
1716 tree link = gimple_asm_output_op (asm_stmt, i);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1717 tree lhs = TREE_VALUE (link);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1718 if (TREE_CODE (lhs) != SSA_NAME)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1719 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1720 decl = get_base_address (lhs);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1721 if (DECL_P (decl)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1722 && (non_rewritable_lvalue_p (lhs)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1723 /* We cannot move required conversions from
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1724 the lhs to the rhs in asm statements, so
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1725 require we do not need any. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1726 || !useless_type_conversion_p
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1727 (TREE_TYPE (lhs), TREE_TYPE (decl))))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1728 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1729 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1730 }
111
kono
parents: 67
diff changeset
1731 for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1732 {
111
kono
parents: 67
diff changeset
1733 tree link = gimple_asm_input_op (asm_stmt, i);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1734 if ((decl = non_rewritable_mem_ref_base (TREE_VALUE (link))))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1735 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1736 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1737 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1738 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1739
111
kono
parents: 67
diff changeset
1740 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
kono
parents: 67
diff changeset
1741 gsi_next (&gsi))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1742 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1743 size_t i;
111
kono
parents: 67
diff changeset
1744 gphi *phi = gsi.phi ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1745
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1746 for (i = 0; i < gimple_phi_num_args (phi); i++)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1747 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1748 tree op = PHI_ARG_DEF (phi, i), var;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1749 if (TREE_CODE (op) == ADDR_EXPR
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1750 && (var = get_base_address (TREE_OPERAND (op, 0))) != NULL
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1751 && DECL_P (var))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1752 bitmap_set_bit (addresses_taken, DECL_UID (var));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1753 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1754 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1755 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1756
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1757 /* We cannot iterate over all referenced vars because that can contain
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1758 unused vars from BLOCK trees, which causes code generation differences
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1759 for -g vs. -g0. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1760 for (var = DECL_ARGUMENTS (cfun->decl); var; var = DECL_CHAIN (var))
111
kono
parents: 67
diff changeset
1761 maybe_optimize_var (var, addresses_taken, not_reg_needs,
kono
parents: 67
diff changeset
1762 suitable_for_renaming);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1763
111
kono
parents: 67
diff changeset
1764 FOR_EACH_VEC_SAFE_ELT (cfun->local_decls, i, var)
kono
parents: 67
diff changeset
1765 maybe_optimize_var (var, addresses_taken, not_reg_needs,
kono
parents: 67
diff changeset
1766 suitable_for_renaming);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1767
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1768 /* Operand caches need to be recomputed for operands referencing the updated
111
kono
parents: 67
diff changeset
1769 variables and operands need to be rewritten to expose bare symbols. */
kono
parents: 67
diff changeset
1770 if (!bitmap_empty_p (suitable_for_renaming))
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1771 {
111
kono
parents: 67
diff changeset
1772 FOR_EACH_BB_FN (bb, cfun)
kono
parents: 67
diff changeset
1773 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1774 {
111
kono
parents: 67
diff changeset
1775 gimple *stmt = gsi_stmt (gsi);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1776
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1777 /* Re-write TARGET_MEM_REFs of symbols we want to
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1778 rewrite into SSA form. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1779 if (gimple_assign_single_p (stmt))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1780 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1781 tree lhs = gimple_assign_lhs (stmt);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1782 tree rhs, *rhsp = gimple_assign_rhs1_ptr (stmt);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1783 tree sym;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1784
111
kono
parents: 67
diff changeset
1785 /* Rewrite LHS IMAG/REALPART_EXPR similar to
kono
parents: 67
diff changeset
1786 gimplify_modify_expr_complex_part. */
kono
parents: 67
diff changeset
1787 if ((TREE_CODE (lhs) == IMAGPART_EXPR
kono
parents: 67
diff changeset
1788 || TREE_CODE (lhs) == REALPART_EXPR)
kono
parents: 67
diff changeset
1789 && DECL_P (TREE_OPERAND (lhs, 0))
kono
parents: 67
diff changeset
1790 && bitmap_bit_p (suitable_for_renaming,
kono
parents: 67
diff changeset
1791 DECL_UID (TREE_OPERAND (lhs, 0))))
kono
parents: 67
diff changeset
1792 {
kono
parents: 67
diff changeset
1793 tree other = make_ssa_name (TREE_TYPE (lhs));
kono
parents: 67
diff changeset
1794 tree lrhs = build1 (TREE_CODE (lhs) == IMAGPART_EXPR
kono
parents: 67
diff changeset
1795 ? REALPART_EXPR : IMAGPART_EXPR,
kono
parents: 67
diff changeset
1796 TREE_TYPE (other),
kono
parents: 67
diff changeset
1797 TREE_OPERAND (lhs, 0));
kono
parents: 67
diff changeset
1798 gimple *load = gimple_build_assign (other, lrhs);
kono
parents: 67
diff changeset
1799 location_t loc = gimple_location (stmt);
kono
parents: 67
diff changeset
1800 gimple_set_location (load, loc);
kono
parents: 67
diff changeset
1801 gimple_set_vuse (load, gimple_vuse (stmt));
kono
parents: 67
diff changeset
1802 gsi_insert_before (&gsi, load, GSI_SAME_STMT);
kono
parents: 67
diff changeset
1803 gimple_assign_set_lhs (stmt, TREE_OPERAND (lhs, 0));
kono
parents: 67
diff changeset
1804 gimple_assign_set_rhs_with_ops
kono
parents: 67
diff changeset
1805 (&gsi, COMPLEX_EXPR,
kono
parents: 67
diff changeset
1806 TREE_CODE (lhs) == IMAGPART_EXPR
kono
parents: 67
diff changeset
1807 ? other : gimple_assign_rhs1 (stmt),
kono
parents: 67
diff changeset
1808 TREE_CODE (lhs) == IMAGPART_EXPR
kono
parents: 67
diff changeset
1809 ? gimple_assign_rhs1 (stmt) : other, NULL_TREE);
kono
parents: 67
diff changeset
1810 stmt = gsi_stmt (gsi);
kono
parents: 67
diff changeset
1811 unlink_stmt_vdef (stmt);
kono
parents: 67
diff changeset
1812 update_stmt (stmt);
kono
parents: 67
diff changeset
1813 continue;
kono
parents: 67
diff changeset
1814 }
kono
parents: 67
diff changeset
1815
kono
parents: 67
diff changeset
1816 /* Rewrite a vector insert via a BIT_FIELD_REF on the LHS
kono
parents: 67
diff changeset
1817 into a BIT_INSERT_EXPR. */
kono
parents: 67
diff changeset
1818 if (TREE_CODE (lhs) == BIT_FIELD_REF
kono
parents: 67
diff changeset
1819 && DECL_P (TREE_OPERAND (lhs, 0))
kono
parents: 67
diff changeset
1820 && bitmap_bit_p (suitable_for_renaming,
kono
parents: 67
diff changeset
1821 DECL_UID (TREE_OPERAND (lhs, 0)))
kono
parents: 67
diff changeset
1822 && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (lhs, 0)))
kono
parents: 67
diff changeset
1823 && TYPE_MODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) != BLKmode
kono
parents: 67
diff changeset
1824 && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
kono
parents: 67
diff changeset
1825 TYPE_SIZE_UNIT (TREE_TYPE
kono
parents: 67
diff changeset
1826 (TREE_TYPE (TREE_OPERAND (lhs, 0)))),
kono
parents: 67
diff changeset
1827 0)
kono
parents: 67
diff changeset
1828 && (tree_to_uhwi (TREE_OPERAND (lhs, 2))
kono
parents: 67
diff changeset
1829 % tree_to_uhwi (TYPE_SIZE (TREE_TYPE (lhs))) == 0))
kono
parents: 67
diff changeset
1830 {
kono
parents: 67
diff changeset
1831 tree var = TREE_OPERAND (lhs, 0);
kono
parents: 67
diff changeset
1832 tree val = gimple_assign_rhs1 (stmt);
kono
parents: 67
diff changeset
1833 if (! types_compatible_p (TREE_TYPE (TREE_TYPE (var)),
kono
parents: 67
diff changeset
1834 TREE_TYPE (val)))
kono
parents: 67
diff changeset
1835 {
kono
parents: 67
diff changeset
1836 tree tem = make_ssa_name (TREE_TYPE (TREE_TYPE (var)));
kono
parents: 67
diff changeset
1837 gimple *pun
kono
parents: 67
diff changeset
1838 = gimple_build_assign (tem,
kono
parents: 67
diff changeset
1839 build1 (VIEW_CONVERT_EXPR,
kono
parents: 67
diff changeset
1840 TREE_TYPE (tem), val));
kono
parents: 67
diff changeset
1841 gsi_insert_before (&gsi, pun, GSI_SAME_STMT);
kono
parents: 67
diff changeset
1842 val = tem;
kono
parents: 67
diff changeset
1843 }
kono
parents: 67
diff changeset
1844 tree bitpos = TREE_OPERAND (lhs, 2);
kono
parents: 67
diff changeset
1845 gimple_assign_set_lhs (stmt, var);
kono
parents: 67
diff changeset
1846 gimple_assign_set_rhs_with_ops
kono
parents: 67
diff changeset
1847 (&gsi, BIT_INSERT_EXPR, var, val, bitpos);
kono
parents: 67
diff changeset
1848 stmt = gsi_stmt (gsi);
kono
parents: 67
diff changeset
1849 unlink_stmt_vdef (stmt);
kono
parents: 67
diff changeset
1850 update_stmt (stmt);
kono
parents: 67
diff changeset
1851 continue;
kono
parents: 67
diff changeset
1852 }
kono
parents: 67
diff changeset
1853
kono
parents: 67
diff changeset
1854 /* Rewrite a vector insert using a MEM_REF on the LHS
kono
parents: 67
diff changeset
1855 into a BIT_INSERT_EXPR. */
kono
parents: 67
diff changeset
1856 if (TREE_CODE (lhs) == MEM_REF
kono
parents: 67
diff changeset
1857 && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
kono
parents: 67
diff changeset
1858 && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
kono
parents: 67
diff changeset
1859 && DECL_P (sym)
kono
parents: 67
diff changeset
1860 && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))
kono
parents: 67
diff changeset
1861 && VECTOR_TYPE_P (TREE_TYPE (sym))
kono
parents: 67
diff changeset
1862 && TYPE_MODE (TREE_TYPE (sym)) != BLKmode
kono
parents: 67
diff changeset
1863 && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
kono
parents: 67
diff changeset
1864 TYPE_SIZE_UNIT
kono
parents: 67
diff changeset
1865 (TREE_TYPE (TREE_TYPE (sym))), 0)
kono
parents: 67
diff changeset
1866 && tree_fits_uhwi_p (TREE_OPERAND (lhs, 1))
kono
parents: 67
diff changeset
1867 && tree_int_cst_lt (TREE_OPERAND (lhs, 1),
kono
parents: 67
diff changeset
1868 TYPE_SIZE_UNIT (TREE_TYPE (sym)))
kono
parents: 67
diff changeset
1869 && (tree_to_uhwi (TREE_OPERAND (lhs, 1))
kono
parents: 67
diff changeset
1870 % tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (lhs)))) == 0)
kono
parents: 67
diff changeset
1871 {
kono
parents: 67
diff changeset
1872 tree val = gimple_assign_rhs1 (stmt);
kono
parents: 67
diff changeset
1873 if (! types_compatible_p (TREE_TYPE (val),
kono
parents: 67
diff changeset
1874 TREE_TYPE (TREE_TYPE (sym))))
kono
parents: 67
diff changeset
1875 {
kono
parents: 67
diff changeset
1876 tree tem = make_ssa_name (TREE_TYPE (TREE_TYPE (sym)));
kono
parents: 67
diff changeset
1877 gimple *pun
kono
parents: 67
diff changeset
1878 = gimple_build_assign (tem,
kono
parents: 67
diff changeset
1879 build1 (VIEW_CONVERT_EXPR,
kono
parents: 67
diff changeset
1880 TREE_TYPE (tem), val));
kono
parents: 67
diff changeset
1881 gsi_insert_before (&gsi, pun, GSI_SAME_STMT);
kono
parents: 67
diff changeset
1882 val = tem;
kono
parents: 67
diff changeset
1883 }
kono
parents: 67
diff changeset
1884 tree bitpos
kono
parents: 67
diff changeset
1885 = wide_int_to_tree (bitsizetype,
kono
parents: 67
diff changeset
1886 mem_ref_offset (lhs) * BITS_PER_UNIT);
kono
parents: 67
diff changeset
1887 gimple_assign_set_lhs (stmt, sym);
kono
parents: 67
diff changeset
1888 gimple_assign_set_rhs_with_ops
kono
parents: 67
diff changeset
1889 (&gsi, BIT_INSERT_EXPR, sym, val, bitpos);
kono
parents: 67
diff changeset
1890 stmt = gsi_stmt (gsi);
kono
parents: 67
diff changeset
1891 unlink_stmt_vdef (stmt);
kono
parents: 67
diff changeset
1892 update_stmt (stmt);
kono
parents: 67
diff changeset
1893 continue;
kono
parents: 67
diff changeset
1894 }
kono
parents: 67
diff changeset
1895
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1896 /* We shouldn't have any fancy wrapping of
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1897 component-refs on the LHS, but look through
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1898 VIEW_CONVERT_EXPRs as that is easy. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1899 while (TREE_CODE (lhs) == VIEW_CONVERT_EXPR)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1900 lhs = TREE_OPERAND (lhs, 0);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1901 if (TREE_CODE (lhs) == MEM_REF
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1902 && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1903 && integer_zerop (TREE_OPERAND (lhs, 1))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1904 && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1905 && DECL_P (sym)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1906 && !TREE_ADDRESSABLE (sym)
111
kono
parents: 67
diff changeset
1907 && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym)))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1908 lhs = sym;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1909 else
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1910 lhs = gimple_assign_lhs (stmt);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1911
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1912 /* Rewrite the RHS and make sure the resulting assignment
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1913 is validly typed. */
111
kono
parents: 67
diff changeset
1914 maybe_rewrite_mem_ref_base (rhsp, suitable_for_renaming);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1915 rhs = gimple_assign_rhs1 (stmt);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1916 if (gimple_assign_lhs (stmt) != lhs
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1917 && !useless_type_conversion_p (TREE_TYPE (lhs),
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1918 TREE_TYPE (rhs)))
111
kono
parents: 67
diff changeset
1919 {
kono
parents: 67
diff changeset
1920 if (gimple_clobber_p (stmt))
kono
parents: 67
diff changeset
1921 {
kono
parents: 67
diff changeset
1922 rhs = build_constructor (TREE_TYPE (lhs), NULL);
kono
parents: 67
diff changeset
1923 TREE_THIS_VOLATILE (rhs) = 1;
kono
parents: 67
diff changeset
1924 }
kono
parents: 67
diff changeset
1925 else
kono
parents: 67
diff changeset
1926 rhs = fold_build1 (VIEW_CONVERT_EXPR,
kono
parents: 67
diff changeset
1927 TREE_TYPE (lhs), rhs);
kono
parents: 67
diff changeset
1928 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1929 if (gimple_assign_lhs (stmt) != lhs)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1930 gimple_assign_set_lhs (stmt, lhs);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1931
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1932 if (gimple_assign_rhs1 (stmt) != rhs)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1933 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1934 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1935 gimple_assign_set_rhs_from_tree (&gsi, rhs);
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1936 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1937 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1938
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1939 else if (gimple_code (stmt) == GIMPLE_CALL)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1940 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1941 unsigned i;
111
kono
parents: 67
diff changeset
1942 if (optimize_atomic_compare_exchange_p (stmt))
kono
parents: 67
diff changeset
1943 {
kono
parents: 67
diff changeset
1944 tree expected = gimple_call_arg (stmt, 1);
kono
parents: 67
diff changeset
1945 if (bitmap_bit_p (suitable_for_renaming,
kono
parents: 67
diff changeset
1946 DECL_UID (TREE_OPERAND (expected, 0))))
kono
parents: 67
diff changeset
1947 {
kono
parents: 67
diff changeset
1948 fold_builtin_atomic_compare_exchange (&gsi);
kono
parents: 67
diff changeset
1949 continue;
kono
parents: 67
diff changeset
1950 }
kono
parents: 67
diff changeset
1951 }
kono
parents: 67
diff changeset
1952 else if (is_asan_mark_p (stmt))
kono
parents: 67
diff changeset
1953 {
kono
parents: 67
diff changeset
1954 tree var = TREE_OPERAND (gimple_call_arg (stmt, 1), 0);
kono
parents: 67
diff changeset
1955 if (bitmap_bit_p (suitable_for_renaming, DECL_UID (var)))
kono
parents: 67
diff changeset
1956 {
kono
parents: 67
diff changeset
1957 unlink_stmt_vdef (stmt);
kono
parents: 67
diff changeset
1958 if (asan_mark_p (stmt, ASAN_MARK_POISON))
kono
parents: 67
diff changeset
1959 {
kono
parents: 67
diff changeset
1960 gcall *call
kono
parents: 67
diff changeset
1961 = gimple_build_call_internal (IFN_ASAN_POISON, 0);
kono
parents: 67
diff changeset
1962 gimple_call_set_lhs (call, var);
kono
parents: 67
diff changeset
1963 gsi_replace (&gsi, call, GSI_SAME_STMT);
kono
parents: 67
diff changeset
1964 }
kono
parents: 67
diff changeset
1965 else
kono
parents: 67
diff changeset
1966 {
kono
parents: 67
diff changeset
1967 /* In ASAN_MARK (UNPOISON, &b, ...) the variable
kono
parents: 67
diff changeset
1968 is uninitialized. Avoid dependencies on
kono
parents: 67
diff changeset
1969 previous out of scope value. */
kono
parents: 67
diff changeset
1970 tree clobber
kono
parents: 67
diff changeset
1971 = build_constructor (TREE_TYPE (var), NULL);
kono
parents: 67
diff changeset
1972 TREE_THIS_VOLATILE (clobber) = 1;
kono
parents: 67
diff changeset
1973 gimple *g = gimple_build_assign (var, clobber);
kono
parents: 67
diff changeset
1974 gsi_replace (&gsi, g, GSI_SAME_STMT);
kono
parents: 67
diff changeset
1975 }
kono
parents: 67
diff changeset
1976 continue;
kono
parents: 67
diff changeset
1977 }
kono
parents: 67
diff changeset
1978 }
kono
parents: 67
diff changeset
1979 else if (gimple_call_internal_p (stmt, IFN_GOMP_SIMT_ENTER))
kono
parents: 67
diff changeset
1980 for (i = 1; i < gimple_call_num_args (stmt); i++)
kono
parents: 67
diff changeset
1981 {
kono
parents: 67
diff changeset
1982 tree *argp = gimple_call_arg_ptr (stmt, i);
kono
parents: 67
diff changeset
1983 if (*argp == null_pointer_node)
kono
parents: 67
diff changeset
1984 continue;
kono
parents: 67
diff changeset
1985 gcc_assert (TREE_CODE (*argp) == ADDR_EXPR
kono
parents: 67
diff changeset
1986 && VAR_P (TREE_OPERAND (*argp, 0)));
kono
parents: 67
diff changeset
1987 tree var = TREE_OPERAND (*argp, 0);
kono
parents: 67
diff changeset
1988 if (bitmap_bit_p (suitable_for_renaming, DECL_UID (var)))
kono
parents: 67
diff changeset
1989 *argp = null_pointer_node;
kono
parents: 67
diff changeset
1990 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1991 for (i = 0; i < gimple_call_num_args (stmt); ++i)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1992 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1993 tree *argp = gimple_call_arg_ptr (stmt, i);
111
kono
parents: 67
diff changeset
1994 maybe_rewrite_mem_ref_base (argp, suitable_for_renaming);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1995 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1996 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1997
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1998 else if (gimple_code (stmt) == GIMPLE_ASM)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1999 {
111
kono
parents: 67
diff changeset
2000 gasm *asm_stmt = as_a <gasm *> (stmt);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2001 unsigned i;
111
kono
parents: 67
diff changeset
2002 for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2003 {
111
kono
parents: 67
diff changeset
2004 tree link = gimple_asm_output_op (asm_stmt, i);
kono
parents: 67
diff changeset
2005 maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
kono
parents: 67
diff changeset
2006 suitable_for_renaming);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2007 }
111
kono
parents: 67
diff changeset
2008 for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2009 {
111
kono
parents: 67
diff changeset
2010 tree link = gimple_asm_input_op (asm_stmt, i);
kono
parents: 67
diff changeset
2011 maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
kono
parents: 67
diff changeset
2012 suitable_for_renaming);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2013 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2014 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2015
111
kono
parents: 67
diff changeset
2016 else if (gimple_debug_bind_p (stmt)
kono
parents: 67
diff changeset
2017 && gimple_debug_bind_has_value_p (stmt))
kono
parents: 67
diff changeset
2018 {
kono
parents: 67
diff changeset
2019 tree *valuep = gimple_debug_bind_get_value_ptr (stmt);
kono
parents: 67
diff changeset
2020 tree decl;
kono
parents: 67
diff changeset
2021 maybe_rewrite_mem_ref_base (valuep, suitable_for_renaming);
kono
parents: 67
diff changeset
2022 decl = non_rewritable_mem_ref_base (*valuep);
kono
parents: 67
diff changeset
2023 if (decl
kono
parents: 67
diff changeset
2024 && bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
kono
parents: 67
diff changeset
2025 gimple_debug_bind_reset_value (stmt);
kono
parents: 67
diff changeset
2026 }
kono
parents: 67
diff changeset
2027
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2028 if (gimple_references_memory_p (stmt)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2029 || is_gimple_debug (stmt))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2030 update_stmt (stmt);
111
kono
parents: 67
diff changeset
2031
kono
parents: 67
diff changeset
2032 gsi_next (&gsi);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2033 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
2034
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
2035 /* Update SSA form here, we are called as non-pass as well. */
111
kono
parents: 67
diff changeset
2036 if (number_of_loops (cfun) > 1
kono
parents: 67
diff changeset
2037 && loops_state_satisfies_p (LOOP_CLOSED_SSA))
kono
parents: 67
diff changeset
2038 rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
kono
parents: 67
diff changeset
2039 else
kono
parents: 67
diff changeset
2040 update_ssa (TODO_update_ssa);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
2041 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
2042
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2043 timevar_pop (TV_ADDRESS_TAKEN);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2044 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2045
111
kono
parents: 67
diff changeset
2046 namespace {
kono
parents: 67
diff changeset
2047
kono
parents: 67
diff changeset
2048 const pass_data pass_data_update_address_taken =
kono
parents: 67
diff changeset
2049 {
kono
parents: 67
diff changeset
2050 GIMPLE_PASS, /* type */
kono
parents: 67
diff changeset
2051 "addressables", /* name */
kono
parents: 67
diff changeset
2052 OPTGROUP_NONE, /* optinfo_flags */
kono
parents: 67
diff changeset
2053 TV_ADDRESS_TAKEN, /* tv_id */
kono
parents: 67
diff changeset
2054 PROP_ssa, /* properties_required */
kono
parents: 67
diff changeset
2055 0, /* properties_provided */
kono
parents: 67
diff changeset
2056 0, /* properties_destroyed */
kono
parents: 67
diff changeset
2057 0, /* todo_flags_start */
kono
parents: 67
diff changeset
2058 TODO_update_address_taken, /* todo_flags_finish */
kono
parents: 67
diff changeset
2059 };
kono
parents: 67
diff changeset
2060
kono
parents: 67
diff changeset
2061 class pass_update_address_taken : public gimple_opt_pass
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2062 {
111
kono
parents: 67
diff changeset
2063 public:
kono
parents: 67
diff changeset
2064 pass_update_address_taken (gcc::context *ctxt)
kono
parents: 67
diff changeset
2065 : gimple_opt_pass (pass_data_update_address_taken, ctxt)
kono
parents: 67
diff changeset
2066 {}
kono
parents: 67
diff changeset
2067
kono
parents: 67
diff changeset
2068 /* opt_pass methods: */
kono
parents: 67
diff changeset
2069
kono
parents: 67
diff changeset
2070 }; // class pass_update_address_taken
kono
parents: 67
diff changeset
2071
kono
parents: 67
diff changeset
2072 } // anon namespace
kono
parents: 67
diff changeset
2073
kono
parents: 67
diff changeset
2074 gimple_opt_pass *
kono
parents: 67
diff changeset
2075 make_pass_update_address_taken (gcc::context *ctxt)
kono
parents: 67
diff changeset
2076 {
kono
parents: 67
diff changeset
2077 return new pass_update_address_taken (ctxt);
kono
parents: 67
diff changeset
2078 }