annotate gcc/tree-ssa.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
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.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 2001-2020 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
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
55 redirect_edge_var_map_add (edge e, tree result, tree def, location_t 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;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
154 location_t 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 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
361 else if (gimple_clobber_p (def_stmt))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
362 /* We can end up here when rewriting a decl into SSA and coming
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
363 along a clobber for the original decl. Turn that into
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
364 # DEBUG decl => NULL */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
365 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
366 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
367 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
368 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
369
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
370 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
371 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
372 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
373
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
374 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
375
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
376 /* 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
377 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
378 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
379 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
380
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
381 <bb X>:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
382 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
383
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
384 <bb Y>:
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
385 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
386 # 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
387
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
388 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
389 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
390 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
391 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
392 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
393 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
394 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
395
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
396 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
397 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
398 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
399 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
400 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
401 errors. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
402 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
403 || 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
404 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
405 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
406
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
407 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
408 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
409 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
410
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
411 if (value)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
412 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
413 /* 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
414 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
415 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
416 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
417 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
418
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
419 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
420 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
421 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
422
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
423 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
424 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
425 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
426
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
427 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
428 || 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
429 || (usecount == 1
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
430 && (!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
431 || 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
432 || is_gimple_reg (value))
111
kono
parents: 67
diff changeset
433 ;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
434 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
435 {
111
kono
parents: 67
diff changeset
436 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
437 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
438
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
439 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
440 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
441 def_stmt);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
442
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
443 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
444 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
445 if (DECL_P (value))
111
kono
parents: 67
diff changeset
446 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
447 else
111
kono
parents: 67
diff changeset
448 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
449
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
450 if (gsi)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
451 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
452 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
453 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
454 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
455 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
456 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
457
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
458 value = vexpr;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
459 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
460 }
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 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
463 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
464 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
465 continue;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
466
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
467 if (value)
111
kono
parents: 67
diff changeset
468 {
kono
parents: 67
diff changeset
469 FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
kono
parents: 67
diff changeset
470 /* unshare_expr is not needed here. vexpr is either a
kono
parents: 67
diff changeset
471 SINGLE_RHS, that can be safely shared, some other RHS
kono
parents: 67
diff changeset
472 that was unshared when we found it had a single debug
kono
parents: 67
diff changeset
473 use, or a DEBUG_EXPR_DECL, that can be safely
kono
parents: 67
diff changeset
474 shared. */
kono
parents: 67
diff changeset
475 SET_USE (use_p, unshare_expr (value));
kono
parents: 67
diff changeset
476 /* If we didn't replace uses with a debug decl fold the
kono
parents: 67
diff changeset
477 resulting expression. Otherwise we end up with invalid IL. */
kono
parents: 67
diff changeset
478 if (TREE_CODE (value) != DEBUG_EXPR_DECL)
kono
parents: 67
diff changeset
479 {
kono
parents: 67
diff changeset
480 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
kono
parents: 67
diff changeset
481 fold_stmt_inplace (&gsi);
kono
parents: 67
diff changeset
482 }
kono
parents: 67
diff changeset
483 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
484 else
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
485 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
486
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
487 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
488 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
489 }
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
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
492 /* 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
493 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
494 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
495
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
496 void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
497 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
498 {
111
kono
parents: 67
diff changeset
499 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
500 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
501 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
502
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
503 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
504 return;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
505
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
506 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
507
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
508 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
509 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
510 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
511
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
512 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
513 continue;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
514
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
515 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
516 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
517 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
518
111
kono
parents: 67
diff changeset
519 /* Reset all debug stmts that use SSA_NAME(s) defined in STMT. */
kono
parents: 67
diff changeset
520
kono
parents: 67
diff changeset
521 void
kono
parents: 67
diff changeset
522 reset_debug_uses (gimple *stmt)
kono
parents: 67
diff changeset
523 {
kono
parents: 67
diff changeset
524 ssa_op_iter op_iter;
kono
parents: 67
diff changeset
525 def_operand_p def_p;
kono
parents: 67
diff changeset
526 imm_use_iterator imm_iter;
kono
parents: 67
diff changeset
527 gimple *use_stmt;
kono
parents: 67
diff changeset
528
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
529 if (!MAY_HAVE_DEBUG_BIND_STMTS)
111
kono
parents: 67
diff changeset
530 return;
kono
parents: 67
diff changeset
531
kono
parents: 67
diff changeset
532 FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
kono
parents: 67
diff changeset
533 {
kono
parents: 67
diff changeset
534 tree var = DEF_FROM_PTR (def_p);
kono
parents: 67
diff changeset
535
kono
parents: 67
diff changeset
536 if (TREE_CODE (var) != SSA_NAME)
kono
parents: 67
diff changeset
537 continue;
kono
parents: 67
diff changeset
538
kono
parents: 67
diff changeset
539 FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, var)
kono
parents: 67
diff changeset
540 {
kono
parents: 67
diff changeset
541 if (!gimple_debug_bind_p (use_stmt))
kono
parents: 67
diff changeset
542 continue;
kono
parents: 67
diff changeset
543
kono
parents: 67
diff changeset
544 gimple_debug_bind_reset_value (use_stmt);
kono
parents: 67
diff changeset
545 update_stmt (use_stmt);
kono
parents: 67
diff changeset
546 }
kono
parents: 67
diff changeset
547 }
kono
parents: 67
diff changeset
548 }
kono
parents: 67
diff changeset
549
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
550 /* 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
551 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
552 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
553
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
554 void
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
555 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
556 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
557 unsigned j;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
558 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
559
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
560 /* 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
561 most likely run in slightly superlinear time, rather than the
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
562 pathological quadratic worst case.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
563 But iterate from max SSA name version to min one because
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
564 that mimics allocation order during code generation behavior best.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
565 Use an array for this which we compact on-the-fly with a NULL
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
566 marker moving towards the end of the vector. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
567 auto_vec<tree, 16> names;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
568 names.reserve (bitmap_count_bits (toremove) + 1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
569 names.quick_push (NULL_TREE);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
570 EXECUTE_IF_SET_IN_BITMAP (toremove, 0, j, bi)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
571 names.quick_push (ssa_name (j));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
572
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
573 bitmap_tree_view (toremove);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
574 while (!bitmap_empty_p (toremove))
111
kono
parents: 67
diff changeset
575 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
576 j = names.length () - 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
577 for (unsigned i = names.length () - 1; names[i];)
111
kono
parents: 67
diff changeset
578 {
kono
parents: 67
diff changeset
579 bool remove_now = true;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
580 tree var = names[i];
111
kono
parents: 67
diff changeset
581 gimple *stmt;
kono
parents: 67
diff changeset
582 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
583
111
kono
parents: 67
diff changeset
584 FOR_EACH_IMM_USE_STMT (stmt, uit, var)
kono
parents: 67
diff changeset
585 {
kono
parents: 67
diff changeset
586 ssa_op_iter dit;
kono
parents: 67
diff changeset
587 def_operand_p def_p;
kono
parents: 67
diff changeset
588
kono
parents: 67
diff changeset
589 /* We can't propagate PHI nodes into debug stmts. */
kono
parents: 67
diff changeset
590 if (gimple_code (stmt) == GIMPLE_PHI
kono
parents: 67
diff changeset
591 || is_gimple_debug (stmt))
kono
parents: 67
diff changeset
592 continue;
kono
parents: 67
diff changeset
593
kono
parents: 67
diff changeset
594 /* If we find another definition to remove that uses
kono
parents: 67
diff changeset
595 the one we're looking at, defer the removal of this
kono
parents: 67
diff changeset
596 one, so that it can be propagated into debug stmts
kono
parents: 67
diff changeset
597 after the other is. */
kono
parents: 67
diff changeset
598 FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, dit, SSA_OP_DEF)
kono
parents: 67
diff changeset
599 {
kono
parents: 67
diff changeset
600 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
601
111
kono
parents: 67
diff changeset
602 if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef)))
kono
parents: 67
diff changeset
603 {
kono
parents: 67
diff changeset
604 remove_now = false;
kono
parents: 67
diff changeset
605 break;
kono
parents: 67
diff changeset
606 }
kono
parents: 67
diff changeset
607 }
kono
parents: 67
diff changeset
608
kono
parents: 67
diff changeset
609 if (!remove_now)
kono
parents: 67
diff changeset
610 BREAK_FROM_IMM_USE_STMT (uit);
kono
parents: 67
diff changeset
611 }
kono
parents: 67
diff changeset
612
kono
parents: 67
diff changeset
613 if (remove_now)
kono
parents: 67
diff changeset
614 {
kono
parents: 67
diff changeset
615 gimple *def = SSA_NAME_DEF_STMT (var);
kono
parents: 67
diff changeset
616 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
617
111
kono
parents: 67
diff changeset
618 if (gimple_code (def) == GIMPLE_PHI)
kono
parents: 67
diff changeset
619 remove_phi_node (&gsi, true);
kono
parents: 67
diff changeset
620 else
kono
parents: 67
diff changeset
621 {
kono
parents: 67
diff changeset
622 gsi_remove (&gsi, true);
kono
parents: 67
diff changeset
623 release_defs (def);
kono
parents: 67
diff changeset
624 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
625 bitmap_clear_bit (toremove, SSA_NAME_VERSION (var));
111
kono
parents: 67
diff changeset
626 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
627 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
628 --i;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
629 if (--j != i)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
630 names[i] = names[j];
111
kono
parents: 67
diff changeset
631 }
kono
parents: 67
diff changeset
632 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
633 bitmap_list_view (toremove);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
634 }
111
kono
parents: 67
diff changeset
635
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
636 /* Disable warnings about missing quoting in GCC diagnostics for
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
637 the verification errors. Their format strings don't follow GCC
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
638 diagnostic conventions and the calls are ultimately followed by
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
639 one to internal_error. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
640 #if __GNUC__ >= 10
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
641 # pragma GCC diagnostic push
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
642 # pragma GCC diagnostic ignored "-Wformat-diag"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
643 #endif
111
kono
parents: 67
diff changeset
644
kono
parents: 67
diff changeset
645 /* Verify virtual SSA form. */
kono
parents: 67
diff changeset
646
kono
parents: 67
diff changeset
647 bool
kono
parents: 67
diff changeset
648 verify_vssa (basic_block bb, tree current_vdef, sbitmap visited)
kono
parents: 67
diff changeset
649 {
kono
parents: 67
diff changeset
650 bool err = false;
kono
parents: 67
diff changeset
651
kono
parents: 67
diff changeset
652 if (bitmap_bit_p (visited, bb->index))
kono
parents: 67
diff changeset
653 return false;
kono
parents: 67
diff changeset
654
kono
parents: 67
diff changeset
655 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
656
111
kono
parents: 67
diff changeset
657 /* Pick up the single virtual PHI def. */
kono
parents: 67
diff changeset
658 gphi *phi = NULL;
kono
parents: 67
diff changeset
659 for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
kono
parents: 67
diff changeset
660 gsi_next (&si))
kono
parents: 67
diff changeset
661 {
kono
parents: 67
diff changeset
662 tree res = gimple_phi_result (si.phi ());
kono
parents: 67
diff changeset
663 if (virtual_operand_p (res))
kono
parents: 67
diff changeset
664 {
kono
parents: 67
diff changeset
665 if (phi)
kono
parents: 67
diff changeset
666 {
kono
parents: 67
diff changeset
667 error ("multiple virtual PHI nodes in BB %d", bb->index);
kono
parents: 67
diff changeset
668 print_gimple_stmt (stderr, phi, 0);
kono
parents: 67
diff changeset
669 print_gimple_stmt (stderr, si.phi (), 0);
kono
parents: 67
diff changeset
670 err = true;
kono
parents: 67
diff changeset
671 }
kono
parents: 67
diff changeset
672 else
kono
parents: 67
diff changeset
673 phi = si.phi ();
kono
parents: 67
diff changeset
674 }
kono
parents: 67
diff changeset
675 }
kono
parents: 67
diff changeset
676 if (phi)
kono
parents: 67
diff changeset
677 {
kono
parents: 67
diff changeset
678 current_vdef = gimple_phi_result (phi);
kono
parents: 67
diff changeset
679 if (TREE_CODE (current_vdef) != SSA_NAME)
kono
parents: 67
diff changeset
680 {
kono
parents: 67
diff changeset
681 error ("virtual definition is not an SSA name");
kono
parents: 67
diff changeset
682 print_gimple_stmt (stderr, phi, 0);
kono
parents: 67
diff changeset
683 err = true;
kono
parents: 67
diff changeset
684 }
kono
parents: 67
diff changeset
685 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
686
111
kono
parents: 67
diff changeset
687 /* Verify stmts. */
kono
parents: 67
diff changeset
688 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
kono
parents: 67
diff changeset
689 gsi_next (&gsi))
kono
parents: 67
diff changeset
690 {
kono
parents: 67
diff changeset
691 gimple *stmt = gsi_stmt (gsi);
kono
parents: 67
diff changeset
692 tree vuse = gimple_vuse (stmt);
kono
parents: 67
diff changeset
693 if (vuse)
kono
parents: 67
diff changeset
694 {
kono
parents: 67
diff changeset
695 if (vuse != current_vdef)
kono
parents: 67
diff changeset
696 {
kono
parents: 67
diff changeset
697 error ("stmt with wrong VUSE");
kono
parents: 67
diff changeset
698 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
kono
parents: 67
diff changeset
699 fprintf (stderr, "expected ");
kono
parents: 67
diff changeset
700 print_generic_expr (stderr, current_vdef);
kono
parents: 67
diff changeset
701 fprintf (stderr, "\n");
kono
parents: 67
diff changeset
702 err = true;
kono
parents: 67
diff changeset
703 }
kono
parents: 67
diff changeset
704 tree vdef = gimple_vdef (stmt);
kono
parents: 67
diff changeset
705 if (vdef)
kono
parents: 67
diff changeset
706 {
kono
parents: 67
diff changeset
707 current_vdef = vdef;
kono
parents: 67
diff changeset
708 if (TREE_CODE (current_vdef) != SSA_NAME)
kono
parents: 67
diff changeset
709 {
kono
parents: 67
diff changeset
710 error ("virtual definition is not an SSA name");
kono
parents: 67
diff changeset
711 print_gimple_stmt (stderr, phi, 0);
kono
parents: 67
diff changeset
712 err = true;
kono
parents: 67
diff changeset
713 }
kono
parents: 67
diff changeset
714 }
kono
parents: 67
diff changeset
715 }
kono
parents: 67
diff changeset
716 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
717
111
kono
parents: 67
diff changeset
718 /* Verify destination PHI uses and recurse. */
kono
parents: 67
diff changeset
719 edge_iterator ei;
kono
parents: 67
diff changeset
720 edge e;
kono
parents: 67
diff changeset
721 FOR_EACH_EDGE (e, ei, bb->succs)
kono
parents: 67
diff changeset
722 {
kono
parents: 67
diff changeset
723 gphi *phi = get_virtual_phi (e->dest);
kono
parents: 67
diff changeset
724 if (phi
kono
parents: 67
diff changeset
725 && PHI_ARG_DEF_FROM_EDGE (phi, e) != current_vdef)
kono
parents: 67
diff changeset
726 {
kono
parents: 67
diff changeset
727 error ("PHI node with wrong VUSE on edge from BB %d",
kono
parents: 67
diff changeset
728 e->src->index);
kono
parents: 67
diff changeset
729 print_gimple_stmt (stderr, phi, 0, TDF_VOPS);
kono
parents: 67
diff changeset
730 fprintf (stderr, "expected ");
kono
parents: 67
diff changeset
731 print_generic_expr (stderr, current_vdef);
kono
parents: 67
diff changeset
732 fprintf (stderr, "\n");
kono
parents: 67
diff changeset
733 err = true;
kono
parents: 67
diff changeset
734 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
735
111
kono
parents: 67
diff changeset
736 /* Recurse. */
kono
parents: 67
diff changeset
737 err |= verify_vssa (e->dest, current_vdef, visited);
kono
parents: 67
diff changeset
738 }
kono
parents: 67
diff changeset
739
kono
parents: 67
diff changeset
740 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
741 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
742
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
743 /* 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
744
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
745 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
746 operand. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
747
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
748 static bool
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
749 verify_ssa_name (tree ssa_name, bool is_virtual)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
750 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
751 if (TREE_CODE (ssa_name) != SSA_NAME)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
752 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
753 error ("expected an SSA_NAME object");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
754 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
755 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
756
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
757 if (SSA_NAME_IN_FREE_LIST (ssa_name))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
758 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
759 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
760 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
761 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
762
111
kono
parents: 67
diff changeset
763 if (SSA_NAME_VAR (ssa_name) != NULL_TREE
kono
parents: 67
diff changeset
764 && TREE_TYPE (ssa_name) != TREE_TYPE (SSA_NAME_VAR (ssa_name)))
kono
parents: 67
diff changeset
765 {
kono
parents: 67
diff changeset
766 error ("type mismatch between an SSA_NAME and its symbol");
kono
parents: 67
diff changeset
767 return true;
kono
parents: 67
diff changeset
768 }
kono
parents: 67
diff changeset
769
kono
parents: 67
diff changeset
770 if (is_virtual && !virtual_operand_p (ssa_name))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
771 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
772 error ("found a virtual definition for a GIMPLE register");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
773 return true;
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
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
776 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
777 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
778 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
779 return true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
780 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
781
111
kono
parents: 67
diff changeset
782 if (!is_virtual && virtual_operand_p (ssa_name))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
783 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
784 error ("found a real definition for a non-register");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
785 return true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
786 }
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 if (SSA_NAME_IS_DEFAULT_DEF (ssa_name)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
789 && !gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name)))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
790 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
791 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
792 return true;
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
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
795 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
796 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
797
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
798
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
799 /* 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
800
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
801 STMT is the statement where SSA_NAME is created.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
802
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
803 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
804 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
805 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
806 definition of SSA_NAME.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
807
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
808 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
809
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
810 static bool
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
811 verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
111
kono
parents: 67
diff changeset
812 gimple *stmt, bool is_virtual)
0
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 (verify_ssa_name (ssa_name, is_virtual))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
815 goto err;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
816
111
kono
parents: 67
diff changeset
817 if (SSA_NAME_VAR (ssa_name)
kono
parents: 67
diff changeset
818 && 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
819 && 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
820 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
821 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
822 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
823 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
824
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
825 if (definition_block[SSA_NAME_VERSION (ssa_name)])
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
826 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
827 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
828 definition_block[SSA_NAME_VERSION (ssa_name)]->index, bb->index);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
829 goto err;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
830 }
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 definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
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 if (SSA_NAME_DEF_STMT (ssa_name) != stmt)
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 error ("SSA_NAME_DEF_STMT is wrong");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
837 fprintf (stderr, "Expected definition statement:\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
838 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
839 fprintf (stderr, "\nActual definition statement:\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
840 print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
841 goto err;
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
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
844 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
845
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
846 err:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
847 fprintf (stderr, "while verifying SSA_NAME ");
111
kono
parents: 67
diff changeset
848 print_generic_expr (stderr, ssa_name);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
849 fprintf (stderr, " in statement\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
850 print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
851
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
852 return true;
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
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
855
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
856 /* 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
857 malformed.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
858
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
859 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
860
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
861 IDOM contains immediate dominator information for the flowgraph.
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 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
864 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
865 arguments).
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
866
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
867 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
868 that are defined before STMT in basic block BB. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
869
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
870 static bool
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
871 verify_use (basic_block bb, basic_block def_bb, use_operand_p use_p,
111
kono
parents: 67
diff changeset
872 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
873 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
874 bool err = false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
875 tree ssa_name = USE_FROM_PTR (use_p);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
876
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
877 if (!TREE_VISITED (ssa_name))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
878 if (verify_imm_links (stderr, ssa_name))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
879 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
880
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
881 TREE_VISITED (ssa_name) = 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
882
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
883 if (gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
884 && SSA_NAME_IS_DEFAULT_DEF (ssa_name))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
885 ; /* Default definitions have empty statements. Nothing to do. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
886 else if (!def_bb)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
887 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
888 error ("missing definition");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
889 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
890 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
891 else if (bb != def_bb
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
892 && !dominated_by_p (CDI_DOMINATORS, bb, def_bb))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
893 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
894 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
895 def_bb->index, bb->index);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
896 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
897 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
898 else if (bb == def_bb
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
899 && names_defined_in_bb != NULL
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
900 && !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
901 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
902 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
903 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
904 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
905
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
906 if (check_abnormal
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
907 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (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 ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set");
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
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
913 /* 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
914 element to make sure it's the same. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
915 if (use_p->prev == NULL)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
916 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
917 error ("no immediate_use list");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
918 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
919 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
920 else
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 tree listvar;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
923 if (use_p->prev->use == NULL)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
924 listvar = use_p->prev->loc.ssa_name;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
925 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
926 listvar = USE_FROM_PTR (use_p->prev);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
927 if (listvar != ssa_name)
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 error ("wrong immediate use list");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
930 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
931 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
932 }
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 if (err)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
935 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
936 fprintf (stderr, "for SSA_NAME: ");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
937 print_generic_expr (stderr, ssa_name, TDF_VOPS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
938 fprintf (stderr, " in statement:\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
939 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
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
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
942 return err;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
943 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
944
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
945
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
946 /* 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
947 malformed.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
948
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
949 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
950 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
951 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
952 definition of SSA_NAME. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
953
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
954 static bool
111
kono
parents: 67
diff changeset
955 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
956 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
957 edge e;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
958 bool err = false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
959 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
960
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
961 if (EDGE_COUNT (bb->preds) != phi_num_args)
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 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
964 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
965 goto error;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
966 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
967
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
968 for (i = 0; i < phi_num_args; i++)
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 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
971 tree op = USE_FROM_PTR (op_p);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
972
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
973 e = EDGE_PRED (bb, i);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
974
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
975 if (op == NULL_TREE)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
976 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
977 error ("PHI argument is missing for edge %d->%d",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
978 e->src->index,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
979 e->dest->index);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
980 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
981 goto error;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
982 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
983
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
984 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
985 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
986 error ("PHI argument is not SSA_NAME, or invariant");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
987 err = true;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
988 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
989
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
990 if (TREE_CODE (op) == SSA_NAME)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
991 {
111
kono
parents: 67
diff changeset
992 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
993 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
994 op_p, phi, e->flags & EDGE_ABNORMAL, NULL);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
995 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
996
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
997 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
998 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
999 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
1000 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
1001 base = TREE_OPERAND (base, 0);
111
kono
parents: 67
diff changeset
1002 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
1003 || 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
1004 || 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
1005 && !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
1006 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1007 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
1008 err = true;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1009 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1010 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1011
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1012 if (e->dest != bb)
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 error ("wrong edge %d->%d for PHI argument",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1015 e->src->index, e->dest->index);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1016 err = true;
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 if (err)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1020 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1021 fprintf (stderr, "PHI argument\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1022 print_generic_stmt (stderr, op, TDF_VOPS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1023 goto error;
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 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1026
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1027 error:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1028 if (err)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1029 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1030 fprintf (stderr, "for PHI node\n");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1031 print_gimple_stmt (stderr, phi, 0, TDF_VOPS|TDF_MEMSYMS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1032 }
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
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1035 return err;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1036 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1037
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1038
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1039 /* Verify common invariants in the SSA web.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1040 TODO: verify the variable annotations. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1041
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
1042 DEBUG_FUNCTION void
111
kono
parents: 67
diff changeset
1043 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
1044 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1045 basic_block bb;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1046 basic_block *definition_block = XCNEWVEC (basic_block, num_ssa_names);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1047 ssa_op_iter iter;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1048 tree op;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1049 enum dom_state orig_dom_state = dom_info_state (CDI_DOMINATORS);
111
kono
parents: 67
diff changeset
1050 auto_bitmap names_defined_in_bb;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1051
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1052 gcc_assert (!need_ssa_update_p (cfun));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1053
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1054 timevar_push (TV_TREE_SSA_VERIFY);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1055
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1056 {
111
kono
parents: 67
diff changeset
1057 /* Keep track of SSA names present in the IL. */
kono
parents: 67
diff changeset
1058 size_t i;
kono
parents: 67
diff changeset
1059 tree name;
kono
parents: 67
diff changeset
1060 hash_map <void *, tree> ssa_info;
kono
parents: 67
diff changeset
1061
kono
parents: 67
diff changeset
1062 FOR_EACH_SSA_NAME (i, name, cfun)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1063 {
111
kono
parents: 67
diff changeset
1064 gimple *stmt;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1065 TREE_VISITED (name) = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1066
111
kono
parents: 67
diff changeset
1067 verify_ssa_name (name, virtual_operand_p (name));
kono
parents: 67
diff changeset
1068
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1069 stmt = SSA_NAME_DEF_STMT (name);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1070 if (!gimple_nop_p (stmt))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1071 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1072 basic_block bb = gimple_bb (stmt);
111
kono
parents: 67
diff changeset
1073 if (verify_def (bb, definition_block,
kono
parents: 67
diff changeset
1074 name, stmt, virtual_operand_p (name)))
kono
parents: 67
diff changeset
1075 goto err;
kono
parents: 67
diff changeset
1076 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1077
111
kono
parents: 67
diff changeset
1078 void *info = NULL;
kono
parents: 67
diff changeset
1079 if (POINTER_TYPE_P (TREE_TYPE (name)))
kono
parents: 67
diff changeset
1080 info = SSA_NAME_PTR_INFO (name);
kono
parents: 67
diff changeset
1081 else if (INTEGRAL_TYPE_P (TREE_TYPE (name)))
kono
parents: 67
diff changeset
1082 info = SSA_NAME_RANGE_INFO (name);
kono
parents: 67
diff changeset
1083 if (info)
kono
parents: 67
diff changeset
1084 {
kono
parents: 67
diff changeset
1085 bool existed;
kono
parents: 67
diff changeset
1086 tree &val = ssa_info.get_or_insert (info, &existed);
kono
parents: 67
diff changeset
1087 if (existed)
kono
parents: 67
diff changeset
1088 {
kono
parents: 67
diff changeset
1089 error ("shared SSA name info");
kono
parents: 67
diff changeset
1090 print_generic_expr (stderr, val);
kono
parents: 67
diff changeset
1091 fprintf (stderr, " and ");
kono
parents: 67
diff changeset
1092 print_generic_expr (stderr, name);
kono
parents: 67
diff changeset
1093 fprintf (stderr, "\n");
kono
parents: 67
diff changeset
1094 goto err;
kono
parents: 67
diff changeset
1095 }
kono
parents: 67
diff changeset
1096 else
kono
parents: 67
diff changeset
1097 val = name;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1098 }
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 calculate_dominance_info (CDI_DOMINATORS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1103
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1104 /* 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
1105 found in the previous pass. */
111
kono
parents: 67
diff changeset
1106 FOR_EACH_BB_FN (bb, cfun)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1107 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1108 edge e;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1109 edge_iterator ei;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1110
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1111 /* Make sure that all edges have a clear 'aux' field. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1112 FOR_EACH_EDGE (e, ei, bb->preds)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1113 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1114 if (e->aux)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1115 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1116 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
1117 e->dest->index);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1118 goto err;
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 }
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 /* Verify the arguments for every PHI node in the block. */
111
kono
parents: 67
diff changeset
1123 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
1124 {
111
kono
parents: 67
diff changeset
1125 gphi *phi = gsi.phi ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1126 if (verify_phi_args (phi, bb, definition_block))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1127 goto err;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1128
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1129 bitmap_set_bit (names_defined_in_bb,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1130 SSA_NAME_VERSION (gimple_phi_result (phi)));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1131 }
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 /* Now verify all the uses and vuses in every statement of the block. */
111
kono
parents: 67
diff changeset
1134 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
kono
parents: 67
diff changeset
1135 gsi_next (&gsi))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1136 {
111
kono
parents: 67
diff changeset
1137 gimple *stmt = gsi_stmt (gsi);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1138 use_operand_p use_p;
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 if (check_modified_stmt && gimple_modified_p (stmt))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1141 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1142 error ("stmt (%p) marked modified after optimization pass: ",
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1143 (void *)stmt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1144 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1145 goto err;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1146 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1147
111
kono
parents: 67
diff changeset
1148 if (check_ssa_operands && verify_ssa_operands (cfun, stmt))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1149 {
111
kono
parents: 67
diff changeset
1150 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
1151 goto err;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1152 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1153
111
kono
parents: 67
diff changeset
1154 if (gimple_debug_bind_p (stmt)
kono
parents: 67
diff changeset
1155 && !gimple_debug_bind_has_value_p (stmt))
kono
parents: 67
diff changeset
1156 continue;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1157
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1158 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
1159 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1160 op = USE_FROM_PTR (use_p);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1161 if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1162 use_p, stmt, false, names_defined_in_bb))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1163 goto err;
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
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1166 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
1167 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1168 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
1169 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1170 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
1171 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
1172 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
1173 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
1174 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
1175 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
1176 goto err;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1177 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1178 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
1179 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1180 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1181
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1182 bitmap_clear (names_defined_in_bb);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1183 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1184
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1185 free (definition_block);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1186
111
kono
parents: 67
diff changeset
1187 if (gimple_vop (cfun)
kono
parents: 67
diff changeset
1188 && ssa_default_def (cfun, gimple_vop (cfun)))
kono
parents: 67
diff changeset
1189 {
kono
parents: 67
diff changeset
1190 auto_sbitmap visited (last_basic_block_for_fn (cfun) + 1);
kono
parents: 67
diff changeset
1191 bitmap_clear (visited);
kono
parents: 67
diff changeset
1192 if (verify_vssa (ENTRY_BLOCK_PTR_FOR_FN (cfun),
kono
parents: 67
diff changeset
1193 ssa_default_def (cfun, gimple_vop (cfun)), visited))
kono
parents: 67
diff changeset
1194 goto err;
kono
parents: 67
diff changeset
1195 }
kono
parents: 67
diff changeset
1196
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1197 /* Restore the dominance information to its prior known state, so
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1198 that we do not perturb the compiler's subsequent behavior. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1199 if (orig_dom_state == DOM_NONE)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1200 free_dominance_info (CDI_DOMINATORS);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1201 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1202 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
1203
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1204 timevar_pop (TV_TREE_SSA_VERIFY);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1205 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1206
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1207 err:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1208 internal_error ("verify_ssa failed");
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
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1211 #if __GNUC__ >= 10
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1212 # pragma GCC diagnostic pop
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1213 #endif
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1214
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1215 /* Initialize global DFA and SSA structures. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1216
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1217 void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1218 init_tree_ssa (struct function *fn)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1219 {
111
kono
parents: 67
diff changeset
1220 fn->gimple_df = ggc_cleared_alloc<gimple_df> ();
kono
parents: 67
diff changeset
1221 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
1222 pt_solution_reset (&fn->gimple_df->escaped);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1223 init_ssanames (fn, 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 /* Deallocate memory associated with SSA data structures for FNDECL. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1227
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1228 void
111
kono
parents: 67
diff changeset
1229 delete_tree_ssa (struct function *fn)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1230 {
111
kono
parents: 67
diff changeset
1231 fini_ssanames (fn);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1232
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1233 /* We no longer maintain the SSA operand cache at this point. */
111
kono
parents: 67
diff changeset
1234 if (ssa_operands_active (fn))
kono
parents: 67
diff changeset
1235 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
1236
111
kono
parents: 67
diff changeset
1237 fn->gimple_df->default_defs->empty ();
kono
parents: 67
diff changeset
1238 fn->gimple_df->default_defs = NULL;
kono
parents: 67
diff changeset
1239 pt_solution_reset (&fn->gimple_df->escaped);
kono
parents: 67
diff changeset
1240 if (fn->gimple_df->decls_to_pointers != NULL)
kono
parents: 67
diff changeset
1241 delete fn->gimple_df->decls_to_pointers;
kono
parents: 67
diff changeset
1242 fn->gimple_df->decls_to_pointers = NULL;
kono
parents: 67
diff changeset
1243 fn->gimple_df = NULL;
0
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 /* We no longer need the edge variable maps. */
111
kono
parents: 67
diff changeset
1246 redirect_edge_var_map_empty ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1247 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1248
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1249 /* 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
1250 false. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1251
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1252 bool
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1253 tree_ssa_useless_type_conversion (tree expr)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1254 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1255 /* 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
1256 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
1257 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
1258 enter LHS = RHS into the const_and_copies table. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1259 if (CONVERT_EXPR_P (expr)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1260 || TREE_CODE (expr) == VIEW_CONVERT_EXPR
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1261 || TREE_CODE (expr) == NON_LVALUE_EXPR)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1262 return useless_type_conversion_p
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1263 (TREE_TYPE (expr),
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1264 TREE_TYPE (TREE_OPERAND (expr, 0)));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1265
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1266 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1267 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1268
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1269 /* 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
1270 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
1271 expression. */
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1272
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1273 tree
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1274 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
1275 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1276 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
1277 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
1278 return exp;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1279 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1280
111
kono
parents: 67
diff changeset
1281 /* 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
1282
111
kono
parents: 67
diff changeset
1283 bool
kono
parents: 67
diff changeset
1284 ssa_defined_default_def_p (tree t)
kono
parents: 67
diff changeset
1285 {
kono
parents: 67
diff changeset
1286 tree var = SSA_NAME_VAR (t);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1287
111
kono
parents: 67
diff changeset
1288 if (!var)
kono
parents: 67
diff changeset
1289 ;
kono
parents: 67
diff changeset
1290 /* Parameters get their initial value from the function entry. */
kono
parents: 67
diff changeset
1291 else if (TREE_CODE (var) == PARM_DECL)
kono
parents: 67
diff changeset
1292 return true;
kono
parents: 67
diff changeset
1293 /* When returning by reference the return address is actually a hidden
kono
parents: 67
diff changeset
1294 parameter. */
kono
parents: 67
diff changeset
1295 else if (TREE_CODE (var) == RESULT_DECL && DECL_BY_REFERENCE (var))
kono
parents: 67
diff changeset
1296 return true;
kono
parents: 67
diff changeset
1297 /* Hard register variables get their initial value from the ether. */
kono
parents: 67
diff changeset
1298 else if (VAR_P (var) && DECL_HARD_REGISTER (var))
kono
parents: 67
diff changeset
1299 return true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1300
111
kono
parents: 67
diff changeset
1301 return false;
kono
parents: 67
diff changeset
1302 }
kono
parents: 67
diff changeset
1303
kono
parents: 67
diff changeset
1304
kono
parents: 67
diff changeset
1305 /* Return true if T, an SSA_NAME, has an undefined value. PARTIAL is what
kono
parents: 67
diff changeset
1306 should be returned if the value is only partially undefined. */
kono
parents: 67
diff changeset
1307
kono
parents: 67
diff changeset
1308 bool
kono
parents: 67
diff changeset
1309 ssa_undefined_value_p (tree t, bool partial)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1310 {
111
kono
parents: 67
diff changeset
1311 gimple *def_stmt;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1312
111
kono
parents: 67
diff changeset
1313 if (ssa_defined_default_def_p (t))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1314 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1315
111
kono
parents: 67
diff changeset
1316 /* The value is undefined iff its definition statement is empty. */
kono
parents: 67
diff changeset
1317 def_stmt = SSA_NAME_DEF_STMT (t);
kono
parents: 67
diff changeset
1318 if (gimple_nop_p (def_stmt))
kono
parents: 67
diff changeset
1319 return true;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1320
111
kono
parents: 67
diff changeset
1321 /* Check if the complex was not only partially defined. */
kono
parents: 67
diff changeset
1322 if (partial && is_gimple_assign (def_stmt)
kono
parents: 67
diff changeset
1323 && gimple_assign_rhs_code (def_stmt) == COMPLEX_EXPR)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1324 {
111
kono
parents: 67
diff changeset
1325 tree rhs1, rhs2;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1326
111
kono
parents: 67
diff changeset
1327 rhs1 = gimple_assign_rhs1 (def_stmt);
kono
parents: 67
diff changeset
1328 rhs2 = gimple_assign_rhs2 (def_stmt);
kono
parents: 67
diff changeset
1329 return (TREE_CODE (rhs1) == SSA_NAME && ssa_undefined_value_p (rhs1))
kono
parents: 67
diff changeset
1330 || (TREE_CODE (rhs2) == SSA_NAME && ssa_undefined_value_p (rhs2));
kono
parents: 67
diff changeset
1331 }
kono
parents: 67
diff changeset
1332 return false;
kono
parents: 67
diff changeset
1333 }
kono
parents: 67
diff changeset
1334
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1335
111
kono
parents: 67
diff changeset
1336 /* Return TRUE iff STMT, a gimple statement, references an undefined
kono
parents: 67
diff changeset
1337 SSA name. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1338
111
kono
parents: 67
diff changeset
1339 bool
kono
parents: 67
diff changeset
1340 gimple_uses_undefined_value_p (gimple *stmt)
kono
parents: 67
diff changeset
1341 {
kono
parents: 67
diff changeset
1342 ssa_op_iter iter;
kono
parents: 67
diff changeset
1343 tree op;
kono
parents: 67
diff changeset
1344
kono
parents: 67
diff changeset
1345 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
kono
parents: 67
diff changeset
1346 if (ssa_undefined_value_p (op))
kono
parents: 67
diff changeset
1347 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
1348
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1349 return false;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1350 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1351
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1352
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1353
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
1354 /* 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
1355 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
1356
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1357 static void
111
kono
parents: 67
diff changeset
1358 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
1359 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1360 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
1361
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1362 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
1363 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
1364 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
1365 && 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
1366 && (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
1367 && 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
1368 && !TREE_ADDRESSABLE (sym)
111
kono
parents: 67
diff changeset
1369 && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))
kono
parents: 67
diff changeset
1370 && is_gimple_reg_type (TREE_TYPE (*tp))
kono
parents: 67
diff changeset
1371 && ! 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
1372 {
111
kono
parents: 67
diff changeset
1373 if (TREE_CODE (TREE_TYPE (sym)) == VECTOR_TYPE
kono
parents: 67
diff changeset
1374 && useless_type_conversion_p (TREE_TYPE (*tp),
kono
parents: 67
diff changeset
1375 TREE_TYPE (TREE_TYPE (sym)))
kono
parents: 67
diff changeset
1376 && multiple_of_p (sizetype, TREE_OPERAND (*tp, 1),
kono
parents: 67
diff changeset
1377 TYPE_SIZE_UNIT (TREE_TYPE (*tp))))
kono
parents: 67
diff changeset
1378 {
kono
parents: 67
diff changeset
1379 *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym,
kono
parents: 67
diff changeset
1380 TYPE_SIZE (TREE_TYPE (*tp)),
kono
parents: 67
diff changeset
1381 int_const_binop (MULT_EXPR,
kono
parents: 67
diff changeset
1382 bitsize_int (BITS_PER_UNIT),
kono
parents: 67
diff changeset
1383 TREE_OPERAND (*tp, 1)));
kono
parents: 67
diff changeset
1384 }
kono
parents: 67
diff changeset
1385 else if (TREE_CODE (TREE_TYPE (sym)) == COMPLEX_TYPE
kono
parents: 67
diff changeset
1386 && useless_type_conversion_p (TREE_TYPE (*tp),
kono
parents: 67
diff changeset
1387 TREE_TYPE (TREE_TYPE (sym))))
kono
parents: 67
diff changeset
1388 {
kono
parents: 67
diff changeset
1389 *tp = build1 (integer_zerop (TREE_OPERAND (*tp, 1))
kono
parents: 67
diff changeset
1390 ? 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
1391 TREE_TYPE (*tp), sym);
111
kono
parents: 67
diff changeset
1392 }
kono
parents: 67
diff changeset
1393 else if (integer_zerop (TREE_OPERAND (*tp, 1))
kono
parents: 67
diff changeset
1394 && DECL_SIZE (sym) == TYPE_SIZE (TREE_TYPE (*tp)))
kono
parents: 67
diff changeset
1395 {
kono
parents: 67
diff changeset
1396 if (!useless_type_conversion_p (TREE_TYPE (*tp),
kono
parents: 67
diff changeset
1397 TREE_TYPE (sym)))
kono
parents: 67
diff changeset
1398 *tp = build1 (VIEW_CONVERT_EXPR,
kono
parents: 67
diff changeset
1399 TREE_TYPE (*tp), sym);
kono
parents: 67
diff changeset
1400 else
kono
parents: 67
diff changeset
1401 *tp = sym;
kono
parents: 67
diff changeset
1402 }
kono
parents: 67
diff changeset
1403 else if (DECL_SIZE (sym)
kono
parents: 67
diff changeset
1404 && TREE_CODE (DECL_SIZE (sym)) == INTEGER_CST
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1405 && (known_subrange_p
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1406 (mem_ref_offset (*tp),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1407 wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (*tp))),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1408 0, wi::to_offset (DECL_SIZE_UNIT (sym))))
111
kono
parents: 67
diff changeset
1409 && (! INTEGRAL_TYPE_P (TREE_TYPE (*tp))
kono
parents: 67
diff changeset
1410 || (wi::to_offset (TYPE_SIZE (TREE_TYPE (*tp)))
kono
parents: 67
diff changeset
1411 == TYPE_PRECISION (TREE_TYPE (*tp))))
kono
parents: 67
diff changeset
1412 && wi::umod_trunc (wi::to_offset (TYPE_SIZE (TREE_TYPE (*tp))),
kono
parents: 67
diff changeset
1413 BITS_PER_UNIT) == 0)
kono
parents: 67
diff changeset
1414 {
kono
parents: 67
diff changeset
1415 *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym,
kono
parents: 67
diff changeset
1416 TYPE_SIZE (TREE_TYPE (*tp)),
kono
parents: 67
diff changeset
1417 wide_int_to_tree (bitsizetype,
kono
parents: 67
diff changeset
1418 mem_ref_offset (*tp)
kono
parents: 67
diff changeset
1419 << LOG2_BITS_PER_UNIT));
kono
parents: 67
diff changeset
1420 }
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
1421 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1422 }
f6334be47118 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
f6334be47118 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 /* 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
1425 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
1426
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1427 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
1428 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
1429 {
111
kono
parents: 67
diff changeset
1430 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
1431
f6334be47118 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 /* 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
1433 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
1434 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
1435
111
kono
parents: 67
diff changeset
1436 if (! (base = CONST_CAST_TREE (strip_invariant_refs (ref))))
kono
parents: 67
diff changeset
1437 {
kono
parents: 67
diff changeset
1438 base = get_base_address (ref);
kono
parents: 67
diff changeset
1439 if (DECL_P (base))
kono
parents: 67
diff changeset
1440 return base;
kono
parents: 67
diff changeset
1441 return NULL_TREE;
kono
parents: 67
diff changeset
1442 }
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
1443
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1444 /* But watch out for MEM_REFs we cannot lower to a
111
kono
parents: 67
diff changeset
1445 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
1446 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
1447 && 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
1448 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1449 tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
111
kono
parents: 67
diff changeset
1450 if (! DECL_P (decl))
kono
parents: 67
diff changeset
1451 return NULL_TREE;
kono
parents: 67
diff changeset
1452 if (! is_gimple_reg_type (TREE_TYPE (base))
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1453 || VOID_TYPE_P (TREE_TYPE (base))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1454 || 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
1455 return decl;
111
kono
parents: 67
diff changeset
1456 if ((TREE_CODE (TREE_TYPE (decl)) == VECTOR_TYPE
kono
parents: 67
diff changeset
1457 || TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE)
kono
parents: 67
diff changeset
1458 && useless_type_conversion_p (TREE_TYPE (base),
kono
parents: 67
diff changeset
1459 TREE_TYPE (TREE_TYPE (decl)))
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1460 && known_ge (mem_ref_offset (base), 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1461 && known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1462 mem_ref_offset (base))
111
kono
parents: 67
diff changeset
1463 && multiple_of_p (sizetype, TREE_OPERAND (base, 1),
kono
parents: 67
diff changeset
1464 TYPE_SIZE_UNIT (TREE_TYPE (base))))
kono
parents: 67
diff changeset
1465 return NULL_TREE;
kono
parents: 67
diff changeset
1466 /* For same sizes and zero offset we can use a VIEW_CONVERT_EXPR. */
kono
parents: 67
diff changeset
1467 if (integer_zerop (TREE_OPERAND (base, 1))
kono
parents: 67
diff changeset
1468 && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (base)))
kono
parents: 67
diff changeset
1469 return NULL_TREE;
kono
parents: 67
diff changeset
1470 /* For integral typed extracts we can use a BIT_FIELD_REF. */
kono
parents: 67
diff changeset
1471 if (DECL_SIZE (decl)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1472 && TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1473 && (known_subrange_p
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1474 (mem_ref_offset (base),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1475 wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (base))),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1476 0, wi::to_poly_offset (DECL_SIZE_UNIT (decl))))
111
kono
parents: 67
diff changeset
1477 /* ??? We can't handle bitfield precision extracts without
kono
parents: 67
diff changeset
1478 either using an alternate type for the BIT_FIELD_REF and
kono
parents: 67
diff changeset
1479 then doing a conversion or possibly adjusting the offset
kono
parents: 67
diff changeset
1480 according to endianness. */
kono
parents: 67
diff changeset
1481 && (! INTEGRAL_TYPE_P (TREE_TYPE (base))
kono
parents: 67
diff changeset
1482 || (wi::to_offset (TYPE_SIZE (TREE_TYPE (base)))
kono
parents: 67
diff changeset
1483 == TYPE_PRECISION (TREE_TYPE (base))))
kono
parents: 67
diff changeset
1484 && wi::umod_trunc (wi::to_offset (TYPE_SIZE (TREE_TYPE (base))),
kono
parents: 67
diff changeset
1485 BITS_PER_UNIT) == 0)
kono
parents: 67
diff changeset
1486 return NULL_TREE;
kono
parents: 67
diff changeset
1487 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
1488 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1489
f6334be47118 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 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
1491 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1492
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1493 /* 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
1494 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
1495
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1496 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
1497 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
1498 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1499 /* 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
1500 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
1501 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
1502
111
kono
parents: 67
diff changeset
1503 /* We can re-write REALPART_EXPR and IMAGPART_EXPR sets in
kono
parents: 67
diff changeset
1504 a reasonably efficient manner... */
kono
parents: 67
diff changeset
1505 if ((TREE_CODE (lhs) == REALPART_EXPR
kono
parents: 67
diff changeset
1506 || TREE_CODE (lhs) == IMAGPART_EXPR)
kono
parents: 67
diff changeset
1507 && DECL_P (TREE_OPERAND (lhs, 0)))
kono
parents: 67
diff changeset
1508 return false;
kono
parents: 67
diff changeset
1509
kono
parents: 67
diff changeset
1510 /* ??? 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
1511 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
1512 if (TREE_CODE (lhs) == MEM_REF
111
kono
parents: 67
diff changeset
1513 && 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
1514 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1515 tree decl = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0);
111
kono
parents: 67
diff changeset
1516
kono
parents: 67
diff changeset
1517 /* A decl that is wrapped inside a MEM-REF that covers
kono
parents: 67
diff changeset
1518 it full is also rewritable. */
kono
parents: 67
diff changeset
1519 if (integer_zerop (TREE_OPERAND (lhs, 1))
kono
parents: 67
diff changeset
1520 && 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
1521 && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (lhs))
111
kono
parents: 67
diff changeset
1522 /* If the dynamic type of the decl has larger precision than
kono
parents: 67
diff changeset
1523 the decl itself we can't use the decls type for SSA rewriting. */
kono
parents: 67
diff changeset
1524 && ((! INTEGRAL_TYPE_P (TREE_TYPE (decl))
kono
parents: 67
diff changeset
1525 || compare_tree_int (DECL_SIZE (decl),
kono
parents: 67
diff changeset
1526 TYPE_PRECISION (TREE_TYPE (decl))) == 0)
kono
parents: 67
diff changeset
1527 || (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
kono
parents: 67
diff changeset
1528 && (TYPE_PRECISION (TREE_TYPE (decl))
kono
parents: 67
diff changeset
1529 >= TYPE_PRECISION (TREE_TYPE (lhs)))))
kono
parents: 67
diff changeset
1530 /* Make sure we are not re-writing non-float copying into float
kono
parents: 67
diff changeset
1531 copying as that can incur normalization. */
kono
parents: 67
diff changeset
1532 && (! FLOAT_TYPE_P (TREE_TYPE (decl))
kono
parents: 67
diff changeset
1533 || 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
1534 && (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
1535 return false;
111
kono
parents: 67
diff changeset
1536
kono
parents: 67
diff changeset
1537 /* A vector-insert using a MEM_REF or ARRAY_REF is rewritable
kono
parents: 67
diff changeset
1538 using a BIT_INSERT_EXPR. */
kono
parents: 67
diff changeset
1539 if (DECL_P (decl)
kono
parents: 67
diff changeset
1540 && VECTOR_TYPE_P (TREE_TYPE (decl))
kono
parents: 67
diff changeset
1541 && TYPE_MODE (TREE_TYPE (decl)) != BLKmode
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1542 && known_ge (mem_ref_offset (lhs), 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1543 && known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1544 mem_ref_offset (lhs))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1545 && multiple_of_p (sizetype, TREE_OPERAND (lhs, 1),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1546 TYPE_SIZE_UNIT (TREE_TYPE (lhs))))
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1547 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1548 poly_uint64 lhs_bits, nelts;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1549 if (poly_int_tree_p (TYPE_SIZE (TREE_TYPE (lhs)), &lhs_bits)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1550 && multiple_p (lhs_bits,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1551 tree_to_uhwi
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1552 (TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl)))),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1553 &nelts))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1554 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1555 if (known_eq (nelts, 1u))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1556 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1557 /* For sub-vector inserts the insert vector mode has to be
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1558 supported. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1559 tree vtype = build_vector_type (TREE_TYPE (TREE_TYPE (decl)),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1560 nelts);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1561 if (TYPE_MODE (vtype) != BLKmode)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1562 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1563 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1564 }
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 }
f6334be47118 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
111
kono
parents: 67
diff changeset
1567 /* A vector-insert using a BIT_FIELD_REF is rewritable using
kono
parents: 67
diff changeset
1568 BIT_INSERT_EXPR. */
kono
parents: 67
diff changeset
1569 if (TREE_CODE (lhs) == BIT_FIELD_REF
kono
parents: 67
diff changeset
1570 && DECL_P (TREE_OPERAND (lhs, 0))
kono
parents: 67
diff changeset
1571 && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (lhs, 0)))
kono
parents: 67
diff changeset
1572 && TYPE_MODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) != BLKmode
kono
parents: 67
diff changeset
1573 && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
kono
parents: 67
diff changeset
1574 TYPE_SIZE_UNIT
kono
parents: 67
diff changeset
1575 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (lhs, 0)))), 0)
kono
parents: 67
diff changeset
1576 && (tree_to_uhwi (TREE_OPERAND (lhs, 2))
kono
parents: 67
diff changeset
1577 % tree_to_uhwi (TYPE_SIZE (TREE_TYPE (lhs)))) == 0)
kono
parents: 67
diff changeset
1578 return false;
kono
parents: 67
diff changeset
1579
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 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
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 /* 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
1584 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
1585 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
1586
111
kono
parents: 67
diff changeset
1587 static void
kono
parents: 67
diff changeset
1588 maybe_optimize_var (tree var, bitmap addresses_taken, bitmap not_reg_needs,
kono
parents: 67
diff changeset
1589 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
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 /* 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
1592 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
1593 || 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
1594 || bitmap_bit_p (addresses_taken, DECL_UID (var)))
111
kono
parents: 67
diff changeset
1595 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
1596
f6334be47118 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 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
1598 /* 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
1599 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
1600 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
1601 && (!is_gimple_reg_type (TREE_TYPE (var))
111
kono
parents: 67
diff changeset
1602 || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE
kono
parents: 67
diff changeset
1603 || 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
1604 || !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
1605 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1606 TREE_ADDRESSABLE (var) = 0;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1607 /* If we cleared TREE_ADDRESSABLE make sure DECL_GIMPLE_REG_P
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1608 is unset if we cannot rewrite the var into SSA. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1609 if ((TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1610 || TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1611 && bitmap_bit_p (not_reg_needs, DECL_UID (var)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1612 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
1613 if (is_gimple_reg (var))
111
kono
parents: 67
diff changeset
1614 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
1615 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
1616 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1617 fprintf (dump_file, "No longer having address taken: ");
111
kono
parents: 67
diff changeset
1618 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
1619 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
1620 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1621 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1622
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1623 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
1624 && !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
1625 && (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
1626 || 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
1627 && !TREE_THIS_VOLATILE (var)
111
kono
parents: 67
diff changeset
1628 && (!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
1629 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1630 DECL_GIMPLE_REG_P (var) = 1;
111
kono
parents: 67
diff changeset
1631 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
1632 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
1633 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1634 fprintf (dump_file, "Now a gimple register: ");
111
kono
parents: 67
diff changeset
1635 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
1636 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
1637 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1638 }
111
kono
parents: 67
diff changeset
1639 }
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
1640
111
kono
parents: 67
diff changeset
1641 /* Return true when STMT is ASAN mark where second argument is an address
kono
parents: 67
diff changeset
1642 of a local variable. */
kono
parents: 67
diff changeset
1643
kono
parents: 67
diff changeset
1644 static bool
kono
parents: 67
diff changeset
1645 is_asan_mark_p (gimple *stmt)
kono
parents: 67
diff changeset
1646 {
kono
parents: 67
diff changeset
1647 if (!gimple_call_internal_p (stmt, IFN_ASAN_MARK))
kono
parents: 67
diff changeset
1648 return false;
kono
parents: 67
diff changeset
1649
kono
parents: 67
diff changeset
1650 tree addr = get_base_address (gimple_call_arg (stmt, 1));
kono
parents: 67
diff changeset
1651 if (TREE_CODE (addr) == ADDR_EXPR
kono
parents: 67
diff changeset
1652 && VAR_P (TREE_OPERAND (addr, 0)))
kono
parents: 67
diff changeset
1653 {
kono
parents: 67
diff changeset
1654 tree var = TREE_OPERAND (addr, 0);
kono
parents: 67
diff changeset
1655 if (lookup_attribute (ASAN_USE_AFTER_SCOPE_ATTRIBUTE,
kono
parents: 67
diff changeset
1656 DECL_ATTRIBUTES (var)))
kono
parents: 67
diff changeset
1657 return false;
kono
parents: 67
diff changeset
1658
kono
parents: 67
diff changeset
1659 unsigned addressable = TREE_ADDRESSABLE (var);
kono
parents: 67
diff changeset
1660 TREE_ADDRESSABLE (var) = 0;
kono
parents: 67
diff changeset
1661 bool r = is_gimple_reg (var);
kono
parents: 67
diff changeset
1662 TREE_ADDRESSABLE (var) = addressable;
kono
parents: 67
diff changeset
1663 return r;
kono
parents: 67
diff changeset
1664 }
kono
parents: 67
diff changeset
1665
kono
parents: 67
diff changeset
1666 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
1667 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1668
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1669 /* 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
1670
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1671 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
1672 execute_update_addresses_taken (void)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1673 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1674 basic_block bb;
111
kono
parents: 67
diff changeset
1675 auto_bitmap addresses_taken;
kono
parents: 67
diff changeset
1676 auto_bitmap not_reg_needs;
kono
parents: 67
diff changeset
1677 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
1678 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
1679 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
1680
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1681 timevar_push (TV_ADDRESS_TAKEN);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1682
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1683 /* 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
1684 the function body. */
111
kono
parents: 67
diff changeset
1685 FOR_EACH_BB_FN (bb, cfun)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1686 {
111
kono
parents: 67
diff changeset
1687 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
kono
parents: 67
diff changeset
1688 gsi_next (&gsi))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1689 {
111
kono
parents: 67
diff changeset
1690 gimple *stmt = gsi_stmt (gsi);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1691 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
1692 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
1693
111
kono
parents: 67
diff changeset
1694 if (code == GIMPLE_CALL)
kono
parents: 67
diff changeset
1695 {
kono
parents: 67
diff changeset
1696 if (optimize_atomic_compare_exchange_p (stmt))
kono
parents: 67
diff changeset
1697 {
kono
parents: 67
diff changeset
1698 /* For __atomic_compare_exchange_N if the second argument
kono
parents: 67
diff changeset
1699 is &var, don't mark var addressable;
kono
parents: 67
diff changeset
1700 if it becomes non-addressable, we'll rewrite it into
kono
parents: 67
diff changeset
1701 ATOMIC_COMPARE_EXCHANGE call. */
kono
parents: 67
diff changeset
1702 tree arg = gimple_call_arg (stmt, 1);
kono
parents: 67
diff changeset
1703 gimple_call_set_arg (stmt, 1, null_pointer_node);
kono
parents: 67
diff changeset
1704 gimple_ior_addresses_taken (addresses_taken, stmt);
kono
parents: 67
diff changeset
1705 gimple_call_set_arg (stmt, 1, arg);
kono
parents: 67
diff changeset
1706 }
kono
parents: 67
diff changeset
1707 else if (is_asan_mark_p (stmt)
kono
parents: 67
diff changeset
1708 || gimple_call_internal_p (stmt, IFN_GOMP_SIMT_ENTER))
kono
parents: 67
diff changeset
1709 ;
kono
parents: 67
diff changeset
1710 else
kono
parents: 67
diff changeset
1711 gimple_ior_addresses_taken (addresses_taken, stmt);
kono
parents: 67
diff changeset
1712 }
kono
parents: 67
diff changeset
1713 else
kono
parents: 67
diff changeset
1714 /* Note all addresses taken by the stmt. */
kono
parents: 67
diff changeset
1715 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
1716
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1717 /* 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
1718 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
1719 if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1720 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1721 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
1722 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
1723 && TREE_CODE (lhs) != SSA_NAME
111
kono
parents: 67
diff changeset
1724 && ((code == GIMPLE_CALL && ! DECL_P (lhs))
kono
parents: 67
diff changeset
1725 || 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
1726 {
f6334be47118 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 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
1728 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
1729 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
1730 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1731 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1732
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
1733 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
1734 {
f6334be47118 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 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
1736 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
1737 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
1738 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
1739
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
1740 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
1741 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1742 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
1743 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1744 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
1745 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
1746 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
1747 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1748 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1749
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1750 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
1751 {
111
kono
parents: 67
diff changeset
1752 gasm *asm_stmt = as_a <gasm *> (stmt);
kono
parents: 67
diff changeset
1753 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
1754 {
111
kono
parents: 67
diff changeset
1755 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
1756 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
1757 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
1758 {
f6334be47118 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 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
1760 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
1761 && (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
1762 /* 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
1763 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
1764 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
1765 || !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
1766 (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
1767 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
1768 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1769 }
111
kono
parents: 67
diff changeset
1770 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
1771 {
111
kono
parents: 67
diff changeset
1772 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
1773 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
1774 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
1775 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1776 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1777 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1778
111
kono
parents: 67
diff changeset
1779 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
kono
parents: 67
diff changeset
1780 gsi_next (&gsi))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1781 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1782 size_t i;
111
kono
parents: 67
diff changeset
1783 gphi *phi = gsi.phi ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1784
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1785 for (i = 0; i < gimple_phi_num_args (phi); i++)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1786 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1787 tree op = PHI_ARG_DEF (phi, i), var;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1788 if (TREE_CODE (op) == ADDR_EXPR
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1789 && (var = get_base_address (TREE_OPERAND (op, 0))) != NULL
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1790 && DECL_P (var))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1791 bitmap_set_bit (addresses_taken, DECL_UID (var));
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1792 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1793 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1794 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1795
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
1796 /* 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
1797 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
1798 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
1799 for (var = DECL_ARGUMENTS (cfun->decl); var; var = DECL_CHAIN (var))
111
kono
parents: 67
diff changeset
1800 maybe_optimize_var (var, addresses_taken, not_reg_needs,
kono
parents: 67
diff changeset
1801 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
1802
111
kono
parents: 67
diff changeset
1803 FOR_EACH_VEC_SAFE_ELT (cfun->local_decls, i, var)
kono
parents: 67
diff changeset
1804 maybe_optimize_var (var, addresses_taken, not_reg_needs,
kono
parents: 67
diff changeset
1805 suitable_for_renaming);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1806
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
1807 /* Operand caches need to be recomputed for operands referencing the updated
111
kono
parents: 67
diff changeset
1808 variables and operands need to be rewritten to expose bare symbols. */
kono
parents: 67
diff changeset
1809 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
1810 {
111
kono
parents: 67
diff changeset
1811 FOR_EACH_BB_FN (bb, cfun)
kono
parents: 67
diff changeset
1812 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
1813 {
111
kono
parents: 67
diff changeset
1814 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
1815
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1816 /* 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
1817 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
1818 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
1819 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1820 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
1821 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
1822 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
1823
111
kono
parents: 67
diff changeset
1824 /* Rewrite LHS IMAG/REALPART_EXPR similar to
kono
parents: 67
diff changeset
1825 gimplify_modify_expr_complex_part. */
kono
parents: 67
diff changeset
1826 if ((TREE_CODE (lhs) == IMAGPART_EXPR
kono
parents: 67
diff changeset
1827 || TREE_CODE (lhs) == REALPART_EXPR)
kono
parents: 67
diff changeset
1828 && DECL_P (TREE_OPERAND (lhs, 0))
kono
parents: 67
diff changeset
1829 && bitmap_bit_p (suitable_for_renaming,
kono
parents: 67
diff changeset
1830 DECL_UID (TREE_OPERAND (lhs, 0))))
kono
parents: 67
diff changeset
1831 {
kono
parents: 67
diff changeset
1832 tree other = make_ssa_name (TREE_TYPE (lhs));
kono
parents: 67
diff changeset
1833 tree lrhs = build1 (TREE_CODE (lhs) == IMAGPART_EXPR
kono
parents: 67
diff changeset
1834 ? REALPART_EXPR : IMAGPART_EXPR,
kono
parents: 67
diff changeset
1835 TREE_TYPE (other),
kono
parents: 67
diff changeset
1836 TREE_OPERAND (lhs, 0));
kono
parents: 67
diff changeset
1837 gimple *load = gimple_build_assign (other, lrhs);
kono
parents: 67
diff changeset
1838 location_t loc = gimple_location (stmt);
kono
parents: 67
diff changeset
1839 gimple_set_location (load, loc);
kono
parents: 67
diff changeset
1840 gimple_set_vuse (load, gimple_vuse (stmt));
kono
parents: 67
diff changeset
1841 gsi_insert_before (&gsi, load, GSI_SAME_STMT);
kono
parents: 67
diff changeset
1842 gimple_assign_set_lhs (stmt, TREE_OPERAND (lhs, 0));
kono
parents: 67
diff changeset
1843 gimple_assign_set_rhs_with_ops
kono
parents: 67
diff changeset
1844 (&gsi, COMPLEX_EXPR,
kono
parents: 67
diff changeset
1845 TREE_CODE (lhs) == IMAGPART_EXPR
kono
parents: 67
diff changeset
1846 ? other : gimple_assign_rhs1 (stmt),
kono
parents: 67
diff changeset
1847 TREE_CODE (lhs) == IMAGPART_EXPR
kono
parents: 67
diff changeset
1848 ? gimple_assign_rhs1 (stmt) : other, NULL_TREE);
kono
parents: 67
diff changeset
1849 stmt = gsi_stmt (gsi);
kono
parents: 67
diff changeset
1850 unlink_stmt_vdef (stmt);
kono
parents: 67
diff changeset
1851 update_stmt (stmt);
kono
parents: 67
diff changeset
1852 continue;
kono
parents: 67
diff changeset
1853 }
kono
parents: 67
diff changeset
1854
kono
parents: 67
diff changeset
1855 /* Rewrite a vector insert via a BIT_FIELD_REF on the LHS
kono
parents: 67
diff changeset
1856 into a BIT_INSERT_EXPR. */
kono
parents: 67
diff changeset
1857 if (TREE_CODE (lhs) == BIT_FIELD_REF
kono
parents: 67
diff changeset
1858 && DECL_P (TREE_OPERAND (lhs, 0))
kono
parents: 67
diff changeset
1859 && bitmap_bit_p (suitable_for_renaming,
kono
parents: 67
diff changeset
1860 DECL_UID (TREE_OPERAND (lhs, 0)))
kono
parents: 67
diff changeset
1861 && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (lhs, 0)))
kono
parents: 67
diff changeset
1862 && TYPE_MODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) != 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 (TREE_TYPE
kono
parents: 67
diff changeset
1865 (TREE_TYPE (TREE_OPERAND (lhs, 0)))),
kono
parents: 67
diff changeset
1866 0)
kono
parents: 67
diff changeset
1867 && (tree_to_uhwi (TREE_OPERAND (lhs, 2))
kono
parents: 67
diff changeset
1868 % tree_to_uhwi (TYPE_SIZE (TREE_TYPE (lhs))) == 0))
kono
parents: 67
diff changeset
1869 {
kono
parents: 67
diff changeset
1870 tree var = TREE_OPERAND (lhs, 0);
kono
parents: 67
diff changeset
1871 tree val = gimple_assign_rhs1 (stmt);
kono
parents: 67
diff changeset
1872 if (! types_compatible_p (TREE_TYPE (TREE_TYPE (var)),
kono
parents: 67
diff changeset
1873 TREE_TYPE (val)))
kono
parents: 67
diff changeset
1874 {
kono
parents: 67
diff changeset
1875 tree tem = make_ssa_name (TREE_TYPE (TREE_TYPE (var)));
kono
parents: 67
diff changeset
1876 gimple *pun
kono
parents: 67
diff changeset
1877 = gimple_build_assign (tem,
kono
parents: 67
diff changeset
1878 build1 (VIEW_CONVERT_EXPR,
kono
parents: 67
diff changeset
1879 TREE_TYPE (tem), val));
kono
parents: 67
diff changeset
1880 gsi_insert_before (&gsi, pun, GSI_SAME_STMT);
kono
parents: 67
diff changeset
1881 val = tem;
kono
parents: 67
diff changeset
1882 }
kono
parents: 67
diff changeset
1883 tree bitpos = TREE_OPERAND (lhs, 2);
kono
parents: 67
diff changeset
1884 gimple_assign_set_lhs (stmt, var);
kono
parents: 67
diff changeset
1885 gimple_assign_set_rhs_with_ops
kono
parents: 67
diff changeset
1886 (&gsi, BIT_INSERT_EXPR, var, val, bitpos);
kono
parents: 67
diff changeset
1887 stmt = gsi_stmt (gsi);
kono
parents: 67
diff changeset
1888 unlink_stmt_vdef (stmt);
kono
parents: 67
diff changeset
1889 update_stmt (stmt);
kono
parents: 67
diff changeset
1890 continue;
kono
parents: 67
diff changeset
1891 }
kono
parents: 67
diff changeset
1892
kono
parents: 67
diff changeset
1893 /* Rewrite a vector insert using a MEM_REF on the LHS
kono
parents: 67
diff changeset
1894 into a BIT_INSERT_EXPR. */
kono
parents: 67
diff changeset
1895 if (TREE_CODE (lhs) == MEM_REF
kono
parents: 67
diff changeset
1896 && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
kono
parents: 67
diff changeset
1897 && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
kono
parents: 67
diff changeset
1898 && DECL_P (sym)
kono
parents: 67
diff changeset
1899 && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))
kono
parents: 67
diff changeset
1900 && VECTOR_TYPE_P (TREE_TYPE (sym))
kono
parents: 67
diff changeset
1901 && TYPE_MODE (TREE_TYPE (sym)) != BLKmode
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1902 /* If it is a full replacement we can do better below. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1903 && maybe_ne (wi::to_poly_offset
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1904 (TYPE_SIZE_UNIT (TREE_TYPE (lhs))),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1905 wi::to_poly_offset
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1906 (TYPE_SIZE_UNIT (TREE_TYPE (sym))))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1907 && known_ge (mem_ref_offset (lhs), 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1908 && known_gt (wi::to_poly_offset
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1909 (TYPE_SIZE_UNIT (TREE_TYPE (sym))),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1910 mem_ref_offset (lhs))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1911 && multiple_of_p (sizetype,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1912 TREE_OPERAND (lhs, 1),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1913 TYPE_SIZE_UNIT (TREE_TYPE (lhs))))
111
kono
parents: 67
diff changeset
1914 {
kono
parents: 67
diff changeset
1915 tree val = gimple_assign_rhs1 (stmt);
kono
parents: 67
diff changeset
1916 if (! types_compatible_p (TREE_TYPE (val),
kono
parents: 67
diff changeset
1917 TREE_TYPE (TREE_TYPE (sym))))
kono
parents: 67
diff changeset
1918 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1919 poly_uint64 lhs_bits, nelts;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1920 tree temtype = TREE_TYPE (TREE_TYPE (sym));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1921 if (poly_int_tree_p (TYPE_SIZE (TREE_TYPE (lhs)),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1922 &lhs_bits)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1923 && multiple_p (lhs_bits,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1924 tree_to_uhwi
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1925 (TYPE_SIZE (TREE_TYPE
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1926 (TREE_TYPE (sym)))),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1927 &nelts)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1928 && maybe_ne (nelts, 1u))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1929 temtype = build_vector_type (temtype, nelts);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1930 tree tem = make_ssa_name (temtype);
111
kono
parents: 67
diff changeset
1931 gimple *pun
kono
parents: 67
diff changeset
1932 = gimple_build_assign (tem,
kono
parents: 67
diff changeset
1933 build1 (VIEW_CONVERT_EXPR,
kono
parents: 67
diff changeset
1934 TREE_TYPE (tem), val));
kono
parents: 67
diff changeset
1935 gsi_insert_before (&gsi, pun, GSI_SAME_STMT);
kono
parents: 67
diff changeset
1936 val = tem;
kono
parents: 67
diff changeset
1937 }
kono
parents: 67
diff changeset
1938 tree bitpos
kono
parents: 67
diff changeset
1939 = wide_int_to_tree (bitsizetype,
kono
parents: 67
diff changeset
1940 mem_ref_offset (lhs) * BITS_PER_UNIT);
kono
parents: 67
diff changeset
1941 gimple_assign_set_lhs (stmt, sym);
kono
parents: 67
diff changeset
1942 gimple_assign_set_rhs_with_ops
kono
parents: 67
diff changeset
1943 (&gsi, BIT_INSERT_EXPR, sym, val, bitpos);
kono
parents: 67
diff changeset
1944 stmt = gsi_stmt (gsi);
kono
parents: 67
diff changeset
1945 unlink_stmt_vdef (stmt);
kono
parents: 67
diff changeset
1946 update_stmt (stmt);
kono
parents: 67
diff changeset
1947 continue;
kono
parents: 67
diff changeset
1948 }
kono
parents: 67
diff changeset
1949
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
1950 /* 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
1951 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
1952 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
1953 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
1954 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
1955 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
1956 && 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
1957 && 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
1958 && (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
1959 && 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
1960 && !TREE_ADDRESSABLE (sym)
111
kono
parents: 67
diff changeset
1961 && 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
1962 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
1963 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
1964 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
1965
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1966 /* 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
1967 is validly typed. */
111
kono
parents: 67
diff changeset
1968 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
1969 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
1970 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
1971 && !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
1972 TREE_TYPE (rhs)))
111
kono
parents: 67
diff changeset
1973 {
kono
parents: 67
diff changeset
1974 if (gimple_clobber_p (stmt))
kono
parents: 67
diff changeset
1975 {
kono
parents: 67
diff changeset
1976 rhs = build_constructor (TREE_TYPE (lhs), NULL);
kono
parents: 67
diff changeset
1977 TREE_THIS_VOLATILE (rhs) = 1;
kono
parents: 67
diff changeset
1978 }
kono
parents: 67
diff changeset
1979 else
kono
parents: 67
diff changeset
1980 rhs = fold_build1 (VIEW_CONVERT_EXPR,
kono
parents: 67
diff changeset
1981 TREE_TYPE (lhs), rhs);
kono
parents: 67
diff changeset
1982 }
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
1983 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
1984 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
1985
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1986 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
1987 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1988 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
1989 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
1990 }
f6334be47118 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 }
f6334be47118 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 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
1994 {
f6334be47118 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 unsigned i;
111
kono
parents: 67
diff changeset
1996 if (optimize_atomic_compare_exchange_p (stmt))
kono
parents: 67
diff changeset
1997 {
kono
parents: 67
diff changeset
1998 tree expected = gimple_call_arg (stmt, 1);
kono
parents: 67
diff changeset
1999 if (bitmap_bit_p (suitable_for_renaming,
kono
parents: 67
diff changeset
2000 DECL_UID (TREE_OPERAND (expected, 0))))
kono
parents: 67
diff changeset
2001 {
kono
parents: 67
diff changeset
2002 fold_builtin_atomic_compare_exchange (&gsi);
kono
parents: 67
diff changeset
2003 continue;
kono
parents: 67
diff changeset
2004 }
kono
parents: 67
diff changeset
2005 }
kono
parents: 67
diff changeset
2006 else if (is_asan_mark_p (stmt))
kono
parents: 67
diff changeset
2007 {
kono
parents: 67
diff changeset
2008 tree var = TREE_OPERAND (gimple_call_arg (stmt, 1), 0);
kono
parents: 67
diff changeset
2009 if (bitmap_bit_p (suitable_for_renaming, DECL_UID (var)))
kono
parents: 67
diff changeset
2010 {
kono
parents: 67
diff changeset
2011 unlink_stmt_vdef (stmt);
kono
parents: 67
diff changeset
2012 if (asan_mark_p (stmt, ASAN_MARK_POISON))
kono
parents: 67
diff changeset
2013 {
kono
parents: 67
diff changeset
2014 gcall *call
kono
parents: 67
diff changeset
2015 = gimple_build_call_internal (IFN_ASAN_POISON, 0);
kono
parents: 67
diff changeset
2016 gimple_call_set_lhs (call, var);
kono
parents: 67
diff changeset
2017 gsi_replace (&gsi, call, GSI_SAME_STMT);
kono
parents: 67
diff changeset
2018 }
kono
parents: 67
diff changeset
2019 else
kono
parents: 67
diff changeset
2020 {
kono
parents: 67
diff changeset
2021 /* In ASAN_MARK (UNPOISON, &b, ...) the variable
kono
parents: 67
diff changeset
2022 is uninitialized. Avoid dependencies on
kono
parents: 67
diff changeset
2023 previous out of scope value. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2024 tree clobber = build_clobber (TREE_TYPE (var));
111
kono
parents: 67
diff changeset
2025 gimple *g = gimple_build_assign (var, clobber);
kono
parents: 67
diff changeset
2026 gsi_replace (&gsi, g, GSI_SAME_STMT);
kono
parents: 67
diff changeset
2027 }
kono
parents: 67
diff changeset
2028 continue;
kono
parents: 67
diff changeset
2029 }
kono
parents: 67
diff changeset
2030 }
kono
parents: 67
diff changeset
2031 else if (gimple_call_internal_p (stmt, IFN_GOMP_SIMT_ENTER))
kono
parents: 67
diff changeset
2032 for (i = 1; i < gimple_call_num_args (stmt); i++)
kono
parents: 67
diff changeset
2033 {
kono
parents: 67
diff changeset
2034 tree *argp = gimple_call_arg_ptr (stmt, i);
kono
parents: 67
diff changeset
2035 if (*argp == null_pointer_node)
kono
parents: 67
diff changeset
2036 continue;
kono
parents: 67
diff changeset
2037 gcc_assert (TREE_CODE (*argp) == ADDR_EXPR
kono
parents: 67
diff changeset
2038 && VAR_P (TREE_OPERAND (*argp, 0)));
kono
parents: 67
diff changeset
2039 tree var = TREE_OPERAND (*argp, 0);
kono
parents: 67
diff changeset
2040 if (bitmap_bit_p (suitable_for_renaming, DECL_UID (var)))
kono
parents: 67
diff changeset
2041 *argp = null_pointer_node;
kono
parents: 67
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 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
2044 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2045 tree *argp = gimple_call_arg_ptr (stmt, i);
111
kono
parents: 67
diff changeset
2046 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
2047 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2048 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2049
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2050 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
2051 {
111
kono
parents: 67
diff changeset
2052 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
2053 unsigned i;
111
kono
parents: 67
diff changeset
2054 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
2055 {
111
kono
parents: 67
diff changeset
2056 tree link = gimple_asm_output_op (asm_stmt, i);
kono
parents: 67
diff changeset
2057 maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
kono
parents: 67
diff changeset
2058 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
2059 }
111
kono
parents: 67
diff changeset
2060 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
2061 {
111
kono
parents: 67
diff changeset
2062 tree link = gimple_asm_input_op (asm_stmt, i);
kono
parents: 67
diff changeset
2063 maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
kono
parents: 67
diff changeset
2064 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
2065 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2066 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
2067
111
kono
parents: 67
diff changeset
2068 else if (gimple_debug_bind_p (stmt)
kono
parents: 67
diff changeset
2069 && gimple_debug_bind_has_value_p (stmt))
kono
parents: 67
diff changeset
2070 {
kono
parents: 67
diff changeset
2071 tree *valuep = gimple_debug_bind_get_value_ptr (stmt);
kono
parents: 67
diff changeset
2072 tree decl;
kono
parents: 67
diff changeset
2073 maybe_rewrite_mem_ref_base (valuep, suitable_for_renaming);
kono
parents: 67
diff changeset
2074 decl = non_rewritable_mem_ref_base (*valuep);
kono
parents: 67
diff changeset
2075 if (decl
kono
parents: 67
diff changeset
2076 && bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
kono
parents: 67
diff changeset
2077 gimple_debug_bind_reset_value (stmt);
kono
parents: 67
diff changeset
2078 }
kono
parents: 67
diff changeset
2079
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
2080 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
2081 || 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
2082 update_stmt (stmt);
111
kono
parents: 67
diff changeset
2083
kono
parents: 67
diff changeset
2084 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
2085 }
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
2086
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
2087 /* Update SSA form here, we are called as non-pass as well. */
111
kono
parents: 67
diff changeset
2088 if (number_of_loops (cfun) > 1
kono
parents: 67
diff changeset
2089 && loops_state_satisfies_p (LOOP_CLOSED_SSA))
kono
parents: 67
diff changeset
2090 rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
kono
parents: 67
diff changeset
2091 else
kono
parents: 67
diff changeset
2092 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
2093 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
2094
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
2095 timevar_pop (TV_ADDRESS_TAKEN);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2096 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2097
111
kono
parents: 67
diff changeset
2098 namespace {
kono
parents: 67
diff changeset
2099
kono
parents: 67
diff changeset
2100 const pass_data pass_data_update_address_taken =
kono
parents: 67
diff changeset
2101 {
kono
parents: 67
diff changeset
2102 GIMPLE_PASS, /* type */
kono
parents: 67
diff changeset
2103 "addressables", /* name */
kono
parents: 67
diff changeset
2104 OPTGROUP_NONE, /* optinfo_flags */
kono
parents: 67
diff changeset
2105 TV_ADDRESS_TAKEN, /* tv_id */
kono
parents: 67
diff changeset
2106 PROP_ssa, /* properties_required */
kono
parents: 67
diff changeset
2107 0, /* properties_provided */
kono
parents: 67
diff changeset
2108 0, /* properties_destroyed */
kono
parents: 67
diff changeset
2109 0, /* todo_flags_start */
kono
parents: 67
diff changeset
2110 TODO_update_address_taken, /* todo_flags_finish */
kono
parents: 67
diff changeset
2111 };
kono
parents: 67
diff changeset
2112
kono
parents: 67
diff changeset
2113 class pass_update_address_taken : public gimple_opt_pass
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2114 {
111
kono
parents: 67
diff changeset
2115 public:
kono
parents: 67
diff changeset
2116 pass_update_address_taken (gcc::context *ctxt)
kono
parents: 67
diff changeset
2117 : gimple_opt_pass (pass_data_update_address_taken, ctxt)
kono
parents: 67
diff changeset
2118 {}
kono
parents: 67
diff changeset
2119
kono
parents: 67
diff changeset
2120 /* opt_pass methods: */
kono
parents: 67
diff changeset
2121
kono
parents: 67
diff changeset
2122 }; // class pass_update_address_taken
kono
parents: 67
diff changeset
2123
kono
parents: 67
diff changeset
2124 } // anon namespace
kono
parents: 67
diff changeset
2125
kono
parents: 67
diff changeset
2126 gimple_opt_pass *
kono
parents: 67
diff changeset
2127 make_pass_update_address_taken (gcc::context *ctxt)
kono
parents: 67
diff changeset
2128 {
kono
parents: 67
diff changeset
2129 return new pass_update_address_taken (ctxt);
kono
parents: 67
diff changeset
2130 }