value-relation.cc revision 1.1 1 1.1 mrg /* Header file for the value range relational processing.
2 1.1 mrg Copyright (C) 2020-2022 Free Software Foundation, Inc.
3 1.1 mrg Contributed by Andrew MacLeod <amacleod (at) redhat.com>
4 1.1 mrg
5 1.1 mrg This file is part of GCC.
6 1.1 mrg
7 1.1 mrg GCC is free software; you can redistribute it and/or modify it under
8 1.1 mrg the terms of the GNU General Public License as published by the Free
9 1.1 mrg Software Foundation; either version 3, or (at your option) any later
10 1.1 mrg version.
11 1.1 mrg
12 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 1.1 mrg for more details.
16 1.1 mrg
17 1.1 mrg You should have received a copy of the GNU General Public License
18 1.1 mrg along with GCC; see the file COPYING3. If not see
19 1.1 mrg <http://www.gnu.org/licenses/>. */
20 1.1 mrg
21 1.1 mrg #include "config.h"
22 1.1 mrg #include "system.h"
23 1.1 mrg #include "coretypes.h"
24 1.1 mrg #include "backend.h"
25 1.1 mrg #include "tree.h"
26 1.1 mrg #include "gimple.h"
27 1.1 mrg #include "ssa.h"
28 1.1 mrg
29 1.1 mrg #include "gimple-range.h"
30 1.1 mrg #include "tree-pretty-print.h"
31 1.1 mrg #include "gimple-pretty-print.h"
32 1.1 mrg #include "alloc-pool.h"
33 1.1 mrg #include "dominance.h"
34 1.1 mrg
35 1.1 mrg // These VREL codes are arranged such that VREL_NONE is the first
36 1.1 mrg // code, and all the rest are contiguous up to and including VREL_LAST.
37 1.1 mrg
38 1.1 mrg #define VREL_FIRST VREL_NONE
39 1.1 mrg #define VREL_LAST NE_EXPR
40 1.1 mrg #define VREL_COUNT (VREL_LAST - VREL_FIRST + 1)
41 1.1 mrg
42 1.1 mrg // vrel_range_assert will either assert that the tree code passed is valid,
43 1.1 mrg // or mark invalid codes as unreachable to help with table optimation.
44 1.1 mrg #if CHECKING_P
45 1.1 mrg #define vrel_range_assert(c) \
46 1.1 mrg gcc_checking_assert ((c) >= VREL_FIRST && (c) <= VREL_LAST)
47 1.1 mrg #else
48 1.1 mrg #define vrel_range_assert(c) \
49 1.1 mrg if ((c) < VREL_FIRST || (c) > VREL_LAST) \
50 1.1 mrg gcc_unreachable ();
51 1.1 mrg #endif
52 1.1 mrg
53 1.1 mrg static const char *kind_string[VREL_COUNT] =
54 1.1 mrg { "none", "<", "<=", ">", ">=", "empty", "==", "!=" };
55 1.1 mrg
56 1.1 mrg // Print a relation_kind REL to file F.
57 1.1 mrg
58 1.1 mrg void
59 1.1 mrg print_relation (FILE *f, relation_kind rel)
60 1.1 mrg {
61 1.1 mrg vrel_range_assert (rel);
62 1.1 mrg fprintf (f, " %s ", kind_string[rel - VREL_FIRST]);
63 1.1 mrg }
64 1.1 mrg
65 1.1 mrg // This table is used to negate the operands. op1 REL op2 -> !(op1 REL op2).
66 1.1 mrg relation_kind rr_negate_table[VREL_COUNT] = {
67 1.1 mrg // NONE, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, EMPTY, EQ_EXPR, NE_EXPR
68 1.1 mrg VREL_NONE, GE_EXPR, GT_EXPR, LE_EXPR, LT_EXPR, VREL_EMPTY, NE_EXPR, EQ_EXPR };
69 1.1 mrg
70 1.1 mrg // Negate the relation, as in logical negation.
71 1.1 mrg
72 1.1 mrg relation_kind
73 1.1 mrg relation_negate (relation_kind r)
74 1.1 mrg {
75 1.1 mrg vrel_range_assert (r);
76 1.1 mrg return rr_negate_table [r - VREL_FIRST];
77 1.1 mrg }
78 1.1 mrg
79 1.1 mrg // This table is used to swap the operands. op1 REL op2 -> op2 REL op1.
80 1.1 mrg relation_kind rr_swap_table[VREL_COUNT] = {
81 1.1 mrg // NONE, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, EMPTY, EQ_EXPR, NE_EXPR
82 1.1 mrg VREL_NONE, GT_EXPR, GE_EXPR, LT_EXPR, LE_EXPR, VREL_EMPTY, EQ_EXPR, NE_EXPR };
83 1.1 mrg
84 1.1 mrg // Return the relation as if the operands were swapped.
85 1.1 mrg
86 1.1 mrg relation_kind
87 1.1 mrg relation_swap (relation_kind r)
88 1.1 mrg {
89 1.1 mrg vrel_range_assert (r);
90 1.1 mrg return rr_swap_table [r - VREL_FIRST];
91 1.1 mrg }
92 1.1 mrg
93 1.1 mrg // This table is used to perform an intersection between 2 relations.
94 1.1 mrg
95 1.1 mrg relation_kind rr_intersect_table[VREL_COUNT][VREL_COUNT] = {
96 1.1 mrg // NONE, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, EMPTY, EQ_EXPR, NE_EXPR
97 1.1 mrg // VREL_NONE
98 1.1 mrg { VREL_NONE, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, VREL_EMPTY, EQ_EXPR, NE_EXPR },
99 1.1 mrg // LT_EXPR
100 1.1 mrg { LT_EXPR, LT_EXPR, LT_EXPR, VREL_EMPTY, VREL_EMPTY, VREL_EMPTY, VREL_EMPTY, LT_EXPR },
101 1.1 mrg // LE_EXPR
102 1.1 mrg { LE_EXPR, LT_EXPR, LE_EXPR, VREL_EMPTY, EQ_EXPR, VREL_EMPTY, EQ_EXPR, LT_EXPR },
103 1.1 mrg // GT_EXPR
104 1.1 mrg { GT_EXPR, VREL_EMPTY, VREL_EMPTY, GT_EXPR, GT_EXPR, VREL_EMPTY, VREL_EMPTY, GT_EXPR },
105 1.1 mrg // GE_EXPR
106 1.1 mrg { GE_EXPR, VREL_EMPTY, EQ_EXPR, GT_EXPR, GE_EXPR, VREL_EMPTY, EQ_EXPR, GT_EXPR },
107 1.1 mrg // VREL_EMPTY
108 1.1 mrg { VREL_EMPTY, VREL_EMPTY, VREL_EMPTY, VREL_EMPTY, VREL_EMPTY, VREL_EMPTY, VREL_EMPTY, VREL_EMPTY },
109 1.1 mrg // EQ_EXPR
110 1.1 mrg { EQ_EXPR, VREL_EMPTY, EQ_EXPR, VREL_EMPTY, EQ_EXPR, VREL_EMPTY, EQ_EXPR, VREL_EMPTY },
111 1.1 mrg // NE_EXPR
112 1.1 mrg { NE_EXPR, LT_EXPR, LT_EXPR, GT_EXPR, GT_EXPR, VREL_EMPTY, VREL_EMPTY, NE_EXPR } };
113 1.1 mrg
114 1.1 mrg
115 1.1 mrg // Intersect relation R1 with relation R2 and return the resulting relation.
116 1.1 mrg
117 1.1 mrg relation_kind
118 1.1 mrg relation_intersect (relation_kind r1, relation_kind r2)
119 1.1 mrg {
120 1.1 mrg vrel_range_assert (r1);
121 1.1 mrg vrel_range_assert (r2);
122 1.1 mrg return rr_intersect_table[r1 - VREL_FIRST][r2 - VREL_FIRST];
123 1.1 mrg }
124 1.1 mrg
125 1.1 mrg
126 1.1 mrg // This table is used to perform a union between 2 relations.
127 1.1 mrg
128 1.1 mrg relation_kind rr_union_table[VREL_COUNT][VREL_COUNT] = {
129 1.1 mrg // NONE, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, EMPTY, EQ_EXPR, NE_EXPR
130 1.1 mrg // VREL_NONE
131 1.1 mrg { VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE },
132 1.1 mrg // LT_EXPR
133 1.1 mrg { VREL_NONE, LT_EXPR, LE_EXPR, NE_EXPR, VREL_NONE, LT_EXPR, LE_EXPR, NE_EXPR },
134 1.1 mrg // LE_EXPR
135 1.1 mrg { VREL_NONE, LE_EXPR, LE_EXPR, VREL_NONE, VREL_NONE, LE_EXPR, LE_EXPR, VREL_NONE },
136 1.1 mrg // GT_EXPR
137 1.1 mrg { VREL_NONE, NE_EXPR, VREL_NONE, GT_EXPR, GE_EXPR, GT_EXPR, GE_EXPR, NE_EXPR },
138 1.1 mrg // GE_EXPR
139 1.1 mrg { VREL_NONE, VREL_NONE, VREL_NONE, GE_EXPR, GE_EXPR, GE_EXPR, GE_EXPR, VREL_NONE },
140 1.1 mrg // VREL_EMPTY
141 1.1 mrg { VREL_NONE, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, VREL_EMPTY, EQ_EXPR, NE_EXPR },
142 1.1 mrg // EQ_EXPR
143 1.1 mrg { VREL_NONE, LE_EXPR, LE_EXPR, GE_EXPR, GE_EXPR, EQ_EXPR, EQ_EXPR, VREL_NONE },
144 1.1 mrg // NE_EXPR
145 1.1 mrg { VREL_NONE, NE_EXPR, VREL_NONE, NE_EXPR, VREL_NONE, NE_EXPR, VREL_NONE, NE_EXPR } };
146 1.1 mrg
147 1.1 mrg // Union relation R1 with relation R2 and return the result.
148 1.1 mrg
149 1.1 mrg relation_kind
150 1.1 mrg relation_union (relation_kind r1, relation_kind r2)
151 1.1 mrg {
152 1.1 mrg vrel_range_assert (r1);
153 1.1 mrg vrel_range_assert (r2);
154 1.1 mrg return rr_union_table[r1 - VREL_FIRST][r2 - VREL_FIRST];
155 1.1 mrg }
156 1.1 mrg
157 1.1 mrg
158 1.1 mrg // This table is used to determine transitivity between 2 relations.
159 1.1 mrg // (A relation0 B) and (B relation1 C) implies (A result C)
160 1.1 mrg
161 1.1 mrg relation_kind rr_transitive_table[VREL_COUNT][VREL_COUNT] = {
162 1.1 mrg // NONE, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, EMPTY, EQ_EXPR, NE_EXPR
163 1.1 mrg // VREL_NONE
164 1.1 mrg { VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE },
165 1.1 mrg // LT_EXPR
166 1.1 mrg { VREL_NONE, LT_EXPR, LT_EXPR, VREL_NONE, VREL_NONE, VREL_NONE, LT_EXPR, VREL_NONE },
167 1.1 mrg // LE_EXPR
168 1.1 mrg { VREL_NONE, LT_EXPR, LE_EXPR, VREL_NONE, VREL_NONE, VREL_NONE, LE_EXPR, VREL_NONE },
169 1.1 mrg // GT_EXPR
170 1.1 mrg { VREL_NONE, VREL_NONE, VREL_NONE, GT_EXPR, GT_EXPR, VREL_NONE, GT_EXPR, VREL_NONE },
171 1.1 mrg // GE_EXPR
172 1.1 mrg { VREL_NONE, VREL_NONE, VREL_NONE, GT_EXPR, GE_EXPR, VREL_NONE, GE_EXPR, VREL_NONE },
173 1.1 mrg // VREL_EMPTY
174 1.1 mrg { VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE },
175 1.1 mrg // EQ_EXPR
176 1.1 mrg { VREL_NONE, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, VREL_NONE, EQ_EXPR, VREL_NONE },
177 1.1 mrg // NE_EXPR
178 1.1 mrg { VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE, VREL_NONE } };
179 1.1 mrg
180 1.1 mrg // Apply transitive operation between relation R1 and relation R2, and
181 1.1 mrg // return the resulting relation, if any.
182 1.1 mrg
183 1.1 mrg relation_kind
184 1.1 mrg relation_transitive (relation_kind r1, relation_kind r2)
185 1.1 mrg {
186 1.1 mrg vrel_range_assert (r1);
187 1.1 mrg vrel_range_assert (r2);
188 1.1 mrg return rr_transitive_table[r1 - VREL_FIRST][r2 - VREL_FIRST];
189 1.1 mrg }
190 1.1 mrg
191 1.1 mrg // Given an equivalence set EQUIV, set all the bits in B that are still valid
192 1.1 mrg // members of EQUIV in basic block BB.
193 1.1 mrg
194 1.1 mrg void
195 1.1 mrg relation_oracle::valid_equivs (bitmap b, const_bitmap equivs, basic_block bb)
196 1.1 mrg {
197 1.1 mrg unsigned i;
198 1.1 mrg bitmap_iterator bi;
199 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (equivs, 0, i, bi)
200 1.1 mrg {
201 1.1 mrg tree ssa = ssa_name (i);
202 1.1 mrg const_bitmap ssa_equiv = equiv_set (ssa, bb);
203 1.1 mrg if (ssa_equiv == equivs)
204 1.1 mrg bitmap_set_bit (b, i);
205 1.1 mrg }
206 1.1 mrg }
207 1.1 mrg
208 1.1 mrg // -------------------------------------------------------------------------
209 1.1 mrg
210 1.1 mrg // The very first element in the m_equiv chain is actually just a summary
211 1.1 mrg // element in which the m_names bitmap is used to indicate that an ssa_name
212 1.1 mrg // has an equivalence set in this block.
213 1.1 mrg // This allows for much faster traversal of the DOM chain, as a search for
214 1.1 mrg // SSA_NAME simply requires walking the DOM chain until a block is found
215 1.1 mrg // which has the bit for SSA_NAME set. Then scan for the equivalency set in
216 1.1 mrg // that block. No previous lists need be searched.
217 1.1 mrg
218 1.1 mrg // If SSA has an equivalence in this list, find and return it.
219 1.1 mrg // Otherwise return NULL.
220 1.1 mrg
221 1.1 mrg equiv_chain *
222 1.1 mrg equiv_chain::find (unsigned ssa)
223 1.1 mrg {
224 1.1 mrg equiv_chain *ptr = NULL;
225 1.1 mrg // If there are equiv sets and SSA is in one in this list, find it.
226 1.1 mrg // Otherwise return NULL.
227 1.1 mrg if (bitmap_bit_p (m_names, ssa))
228 1.1 mrg {
229 1.1 mrg for (ptr = m_next; ptr; ptr = ptr->m_next)
230 1.1 mrg if (bitmap_bit_p (ptr->m_names, ssa))
231 1.1 mrg break;
232 1.1 mrg }
233 1.1 mrg return ptr;
234 1.1 mrg }
235 1.1 mrg
236 1.1 mrg // Dump the names in this equivalence set.
237 1.1 mrg
238 1.1 mrg void
239 1.1 mrg equiv_chain::dump (FILE *f) const
240 1.1 mrg {
241 1.1 mrg bitmap_iterator bi;
242 1.1 mrg unsigned i;
243 1.1 mrg
244 1.1 mrg if (!m_names)
245 1.1 mrg return;
246 1.1 mrg fprintf (f, "Equivalence set : [");
247 1.1 mrg unsigned c = 0;
248 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (m_names, 0, i, bi)
249 1.1 mrg {
250 1.1 mrg if (ssa_name (i))
251 1.1 mrg {
252 1.1 mrg if (c++)
253 1.1 mrg fprintf (f, ", ");
254 1.1 mrg print_generic_expr (f, ssa_name (i), TDF_SLIM);
255 1.1 mrg }
256 1.1 mrg }
257 1.1 mrg fprintf (f, "]\n");
258 1.1 mrg }
259 1.1 mrg
260 1.1 mrg // Instantiate an equivalency oracle.
261 1.1 mrg
262 1.1 mrg equiv_oracle::equiv_oracle ()
263 1.1 mrg {
264 1.1 mrg bitmap_obstack_initialize (&m_bitmaps);
265 1.1 mrg m_equiv.create (0);
266 1.1 mrg m_equiv.safe_grow_cleared (last_basic_block_for_fn (cfun) + 1);
267 1.1 mrg m_equiv_set = BITMAP_ALLOC (&m_bitmaps);
268 1.1 mrg obstack_init (&m_chain_obstack);
269 1.1 mrg m_self_equiv.create (0);
270 1.1 mrg m_self_equiv.safe_grow_cleared (num_ssa_names + 1);
271 1.1 mrg }
272 1.1 mrg
273 1.1 mrg // Destruct an equivalency oracle.
274 1.1 mrg
275 1.1 mrg equiv_oracle::~equiv_oracle ()
276 1.1 mrg {
277 1.1 mrg m_self_equiv.release ();
278 1.1 mrg obstack_free (&m_chain_obstack, NULL);
279 1.1 mrg m_equiv.release ();
280 1.1 mrg bitmap_obstack_release (&m_bitmaps);
281 1.1 mrg }
282 1.1 mrg
283 1.1 mrg // Find and return the equivalency set for SSA along the dominators of BB.
284 1.1 mrg // This is the external API.
285 1.1 mrg
286 1.1 mrg const_bitmap
287 1.1 mrg equiv_oracle::equiv_set (tree ssa, basic_block bb)
288 1.1 mrg {
289 1.1 mrg // Search the dominator tree for an equivalency.
290 1.1 mrg equiv_chain *equiv = find_equiv_dom (ssa, bb);
291 1.1 mrg if (equiv)
292 1.1 mrg return equiv->m_names;
293 1.1 mrg
294 1.1 mrg // Otherwise return a cached equiv set containing just this SSA.
295 1.1 mrg unsigned v = SSA_NAME_VERSION (ssa);
296 1.1 mrg if (v >= m_self_equiv.length ())
297 1.1 mrg m_self_equiv.safe_grow_cleared (num_ssa_names + 1);
298 1.1 mrg
299 1.1 mrg if (!m_self_equiv[v])
300 1.1 mrg {
301 1.1 mrg m_self_equiv[v] = BITMAP_ALLOC (&m_bitmaps);
302 1.1 mrg bitmap_set_bit (m_self_equiv[v], v);
303 1.1 mrg }
304 1.1 mrg return m_self_equiv[v];
305 1.1 mrg }
306 1.1 mrg
307 1.1 mrg // Query if thre is a relation (equivalence) between 2 SSA_NAMEs.
308 1.1 mrg
309 1.1 mrg relation_kind
310 1.1 mrg equiv_oracle::query_relation (basic_block bb, tree ssa1, tree ssa2)
311 1.1 mrg {
312 1.1 mrg // If the 2 ssa names share the same equiv set, they are equal.
313 1.1 mrg if (equiv_set (ssa1, bb) == equiv_set (ssa2, bb))
314 1.1 mrg return EQ_EXPR;
315 1.1 mrg return VREL_NONE;
316 1.1 mrg }
317 1.1 mrg
318 1.1 mrg // Query if thre is a relation (equivalence) between 2 SSA_NAMEs.
319 1.1 mrg
320 1.1 mrg relation_kind
321 1.1 mrg equiv_oracle::query_relation (basic_block bb ATTRIBUTE_UNUSED, const_bitmap e1,
322 1.1 mrg const_bitmap e2)
323 1.1 mrg {
324 1.1 mrg // If the 2 ssa names share the same equiv set, they are equal.
325 1.1 mrg if (bitmap_equal_p (e1, e2))
326 1.1 mrg return EQ_EXPR;
327 1.1 mrg return VREL_NONE;
328 1.1 mrg }
329 1.1 mrg
330 1.1 mrg // If SSA has an equivalence in block BB, find and return it.
331 1.1 mrg // Otherwise return NULL.
332 1.1 mrg
333 1.1 mrg equiv_chain *
334 1.1 mrg equiv_oracle::find_equiv_block (unsigned ssa, int bb) const
335 1.1 mrg {
336 1.1 mrg if (bb >= (int)m_equiv.length () || !m_equiv[bb])
337 1.1 mrg return NULL;
338 1.1 mrg
339 1.1 mrg return m_equiv[bb]->find (ssa);
340 1.1 mrg }
341 1.1 mrg
342 1.1 mrg // Starting at block BB, walk the dominator chain looking for the nearest
343 1.1 mrg // equivalence set containing NAME.
344 1.1 mrg
345 1.1 mrg equiv_chain *
346 1.1 mrg equiv_oracle::find_equiv_dom (tree name, basic_block bb) const
347 1.1 mrg {
348 1.1 mrg unsigned v = SSA_NAME_VERSION (name);
349 1.1 mrg // Short circuit looking for names which have no equivalences.
350 1.1 mrg // Saves time looking for something which does not exist.
351 1.1 mrg if (!bitmap_bit_p (m_equiv_set, v))
352 1.1 mrg return NULL;
353 1.1 mrg
354 1.1 mrg // NAME has at least once equivalence set, check to see if it has one along
355 1.1 mrg // the dominator tree.
356 1.1 mrg for ( ; bb; bb = get_immediate_dominator (CDI_DOMINATORS, bb))
357 1.1 mrg {
358 1.1 mrg equiv_chain *ptr = find_equiv_block (v, bb->index);
359 1.1 mrg if (ptr)
360 1.1 mrg return ptr;
361 1.1 mrg }
362 1.1 mrg return NULL;
363 1.1 mrg }
364 1.1 mrg
365 1.1 mrg // Register equivalance between ssa_name V and set EQUIV in block BB,
366 1.1 mrg
367 1.1 mrg bitmap
368 1.1 mrg equiv_oracle::register_equiv (basic_block bb, unsigned v, equiv_chain *equiv)
369 1.1 mrg {
370 1.1 mrg // V will have an equivalency now.
371 1.1 mrg bitmap_set_bit (m_equiv_set, v);
372 1.1 mrg
373 1.1 mrg // If that equiv chain is in this block, simply use it.
374 1.1 mrg if (equiv->m_bb == bb)
375 1.1 mrg {
376 1.1 mrg bitmap_set_bit (equiv->m_names, v);
377 1.1 mrg bitmap_set_bit (m_equiv[bb->index]->m_names, v);
378 1.1 mrg return NULL;
379 1.1 mrg }
380 1.1 mrg
381 1.1 mrg // Otherwise create an equivalence for this block which is a copy
382 1.1 mrg // of equiv, the add V to the set.
383 1.1 mrg bitmap b = BITMAP_ALLOC (&m_bitmaps);
384 1.1 mrg valid_equivs (b, equiv->m_names, bb);
385 1.1 mrg bitmap_set_bit (b, v);
386 1.1 mrg return b;
387 1.1 mrg }
388 1.1 mrg
389 1.1 mrg // Register equivalence between set equiv_1 and equiv_2 in block BB.
390 1.1 mrg // Return NULL if either name can be merged with the other. Otherwise
391 1.1 mrg // return a pointer to the combined bitmap of names. This allows the
392 1.1 mrg // caller to do any setup required for a new element.
393 1.1 mrg
394 1.1 mrg bitmap
395 1.1 mrg equiv_oracle::register_equiv (basic_block bb, equiv_chain *equiv_1,
396 1.1 mrg equiv_chain *equiv_2)
397 1.1 mrg {
398 1.1 mrg // If equiv_1 is already in BB, use it as the combined set.
399 1.1 mrg if (equiv_1->m_bb == bb)
400 1.1 mrg {
401 1.1 mrg valid_equivs (equiv_1->m_names, equiv_2->m_names, bb);
402 1.1 mrg // Its hard to delete from a single linked list, so
403 1.1 mrg // just clear the second one.
404 1.1 mrg if (equiv_2->m_bb == bb)
405 1.1 mrg bitmap_clear (equiv_2->m_names);
406 1.1 mrg else
407 1.1 mrg // Ensure the new names are in the summary for BB.
408 1.1 mrg bitmap_ior_into (m_equiv[bb->index]->m_names, equiv_1->m_names);
409 1.1 mrg return NULL;
410 1.1 mrg }
411 1.1 mrg // If equiv_2 is in BB, use it for the combined set.
412 1.1 mrg if (equiv_2->m_bb == bb)
413 1.1 mrg {
414 1.1 mrg valid_equivs (equiv_2->m_names, equiv_1->m_names, bb);
415 1.1 mrg // Ensure the new names are in the summary.
416 1.1 mrg bitmap_ior_into (m_equiv[bb->index]->m_names, equiv_2->m_names);
417 1.1 mrg return NULL;
418 1.1 mrg }
419 1.1 mrg
420 1.1 mrg // At this point, neither equivalence is from this block.
421 1.1 mrg bitmap b = BITMAP_ALLOC (&m_bitmaps);
422 1.1 mrg valid_equivs (b, equiv_1->m_names, bb);
423 1.1 mrg valid_equivs (b, equiv_2->m_names, bb);
424 1.1 mrg return b;
425 1.1 mrg }
426 1.1 mrg
427 1.1 mrg // Create an equivalency set containing only SSA in its definition block.
428 1.1 mrg // This is done the first time SSA is registered in an equivalency and blocks
429 1.1 mrg // any DOM searches past the definition.
430 1.1 mrg
431 1.1 mrg void
432 1.1 mrg equiv_oracle::register_initial_def (tree ssa)
433 1.1 mrg {
434 1.1 mrg if (SSA_NAME_IS_DEFAULT_DEF (ssa))
435 1.1 mrg return;
436 1.1 mrg basic_block bb = gimple_bb (SSA_NAME_DEF_STMT (ssa));
437 1.1 mrg gcc_checking_assert (bb && !find_equiv_dom (ssa, bb));
438 1.1 mrg
439 1.1 mrg unsigned v = SSA_NAME_VERSION (ssa);
440 1.1 mrg bitmap_set_bit (m_equiv_set, v);
441 1.1 mrg bitmap equiv_set = BITMAP_ALLOC (&m_bitmaps);
442 1.1 mrg bitmap_set_bit (equiv_set, v);
443 1.1 mrg add_equiv_to_block (bb, equiv_set);
444 1.1 mrg }
445 1.1 mrg
446 1.1 mrg // Register an equivalence between SSA1 and SSA2 in block BB.
447 1.1 mrg // The equivalence oracle maintains a vector of equivalencies indexed by basic
448 1.1 mrg // block. When an equivalence bteween SSA1 and SSA2 is registered in block BB,
449 1.1 mrg // a query is made as to what equivalences both names have already, and
450 1.1 mrg // any preexisting equivalences are merged to create a single equivalence
451 1.1 mrg // containing all the ssa_names in this basic block.
452 1.1 mrg
453 1.1 mrg void
454 1.1 mrg equiv_oracle::register_relation (basic_block bb, relation_kind k, tree ssa1,
455 1.1 mrg tree ssa2)
456 1.1 mrg {
457 1.1 mrg // Only handle equality relations.
458 1.1 mrg if (k != EQ_EXPR)
459 1.1 mrg return;
460 1.1 mrg
461 1.1 mrg unsigned v1 = SSA_NAME_VERSION (ssa1);
462 1.1 mrg unsigned v2 = SSA_NAME_VERSION (ssa2);
463 1.1 mrg
464 1.1 mrg // If this is the first time an ssa_name has an equivalency registered
465 1.1 mrg // create a self-equivalency record in the def block.
466 1.1 mrg if (!bitmap_bit_p (m_equiv_set, v1))
467 1.1 mrg register_initial_def (ssa1);
468 1.1 mrg if (!bitmap_bit_p (m_equiv_set, v2))
469 1.1 mrg register_initial_def (ssa2);
470 1.1 mrg
471 1.1 mrg equiv_chain *equiv_1 = find_equiv_dom (ssa1, bb);
472 1.1 mrg equiv_chain *equiv_2 = find_equiv_dom (ssa2, bb);
473 1.1 mrg
474 1.1 mrg // Check if they are the same set
475 1.1 mrg if (equiv_1 && equiv_1 == equiv_2)
476 1.1 mrg return;
477 1.1 mrg
478 1.1 mrg bitmap equiv_set;
479 1.1 mrg
480 1.1 mrg // Case where we have 2 SSA_NAMEs that are not in any set.
481 1.1 mrg if (!equiv_1 && !equiv_2)
482 1.1 mrg {
483 1.1 mrg bitmap_set_bit (m_equiv_set, v1);
484 1.1 mrg bitmap_set_bit (m_equiv_set, v2);
485 1.1 mrg
486 1.1 mrg equiv_set = BITMAP_ALLOC (&m_bitmaps);
487 1.1 mrg bitmap_set_bit (equiv_set, v1);
488 1.1 mrg bitmap_set_bit (equiv_set, v2);
489 1.1 mrg }
490 1.1 mrg else if (!equiv_1 && equiv_2)
491 1.1 mrg equiv_set = register_equiv (bb, v1, equiv_2);
492 1.1 mrg else if (equiv_1 && !equiv_2)
493 1.1 mrg equiv_set = register_equiv (bb, v2, equiv_1);
494 1.1 mrg else
495 1.1 mrg equiv_set = register_equiv (bb, equiv_1, equiv_2);
496 1.1 mrg
497 1.1 mrg // A non-null return is a bitmap that is to be added to the current
498 1.1 mrg // block as a new equivalence.
499 1.1 mrg if (!equiv_set)
500 1.1 mrg return;
501 1.1 mrg
502 1.1 mrg add_equiv_to_block (bb, equiv_set);
503 1.1 mrg }
504 1.1 mrg
505 1.1 mrg // Add an equivalency record in block BB containing bitmap EQUIV_SET.
506 1.1 mrg // Note the internal caller is responible for allocating EQUIV_SET properly.
507 1.1 mrg
508 1.1 mrg void
509 1.1 mrg equiv_oracle::add_equiv_to_block (basic_block bb, bitmap equiv_set)
510 1.1 mrg {
511 1.1 mrg equiv_chain *ptr;
512 1.1 mrg
513 1.1 mrg // Check if this is the first time a block has an equivalence added.
514 1.1 mrg // and create a header block. And set the summary for this block.
515 1.1 mrg if (!m_equiv[bb->index])
516 1.1 mrg {
517 1.1 mrg ptr = (equiv_chain *) obstack_alloc (&m_chain_obstack,
518 1.1 mrg sizeof (equiv_chain));
519 1.1 mrg ptr->m_names = BITMAP_ALLOC (&m_bitmaps);
520 1.1 mrg bitmap_copy (ptr->m_names, equiv_set);
521 1.1 mrg ptr->m_bb = bb;
522 1.1 mrg ptr->m_next = NULL;
523 1.1 mrg m_equiv[bb->index] = ptr;
524 1.1 mrg }
525 1.1 mrg
526 1.1 mrg // Now create the element for this equiv set and initialize it.
527 1.1 mrg ptr = (equiv_chain *) obstack_alloc (&m_chain_obstack, sizeof (equiv_chain));
528 1.1 mrg ptr->m_names = equiv_set;
529 1.1 mrg ptr->m_bb = bb;
530 1.1 mrg gcc_checking_assert (bb->index < (int)m_equiv.length ());
531 1.1 mrg ptr->m_next = m_equiv[bb->index]->m_next;
532 1.1 mrg m_equiv[bb->index]->m_next = ptr;
533 1.1 mrg bitmap_ior_into (m_equiv[bb->index]->m_names, equiv_set);
534 1.1 mrg }
535 1.1 mrg
536 1.1 mrg // Make sure the BB vector is big enough and grow it if needed.
537 1.1 mrg
538 1.1 mrg void
539 1.1 mrg equiv_oracle::limit_check (basic_block bb)
540 1.1 mrg {
541 1.1 mrg int i = (bb) ? bb->index : last_basic_block_for_fn (cfun);
542 1.1 mrg if (i >= (int)m_equiv.length ())
543 1.1 mrg m_equiv.safe_grow_cleared (last_basic_block_for_fn (cfun) + 1);
544 1.1 mrg }
545 1.1 mrg
546 1.1 mrg // Dump the equivalence sets in BB to file F.
547 1.1 mrg
548 1.1 mrg void
549 1.1 mrg equiv_oracle::dump (FILE *f, basic_block bb) const
550 1.1 mrg {
551 1.1 mrg if (bb->index >= (int)m_equiv.length ())
552 1.1 mrg return;
553 1.1 mrg if (!m_equiv[bb->index])
554 1.1 mrg return;
555 1.1 mrg
556 1.1 mrg equiv_chain *ptr = m_equiv[bb->index]->m_next;
557 1.1 mrg for (; ptr; ptr = ptr->m_next)
558 1.1 mrg ptr->dump (f);
559 1.1 mrg }
560 1.1 mrg
561 1.1 mrg // Dump all equivalence sets known to the oracle.
562 1.1 mrg
563 1.1 mrg void
564 1.1 mrg equiv_oracle::dump (FILE *f) const
565 1.1 mrg {
566 1.1 mrg fprintf (f, "Equivalency dump\n");
567 1.1 mrg for (unsigned i = 0; i < m_equiv.length (); i++)
568 1.1 mrg if (m_equiv[i] && BASIC_BLOCK_FOR_FN (cfun, i))
569 1.1 mrg {
570 1.1 mrg fprintf (f, "BB%d\n", i);
571 1.1 mrg dump (f, BASIC_BLOCK_FOR_FN (cfun, i));
572 1.1 mrg }
573 1.1 mrg }
574 1.1 mrg
575 1.1 mrg
576 1.1 mrg // --------------------------------------------------------------------------
577 1.1 mrg
578 1.1 mrg // The value-relation class is used to encapsulate the represention of an
579 1.1 mrg // individual relation between 2 ssa-names, and to facilitate operating on
580 1.1 mrg // the relation.
581 1.1 mrg
582 1.1 mrg class value_relation
583 1.1 mrg {
584 1.1 mrg public:
585 1.1 mrg value_relation ();
586 1.1 mrg value_relation (relation_kind kind, tree n1, tree n2);
587 1.1 mrg void set_relation (relation_kind kind, tree n1, tree n2);
588 1.1 mrg
589 1.1 mrg inline relation_kind kind () const { return related; }
590 1.1 mrg inline tree op1 () const { return name1; }
591 1.1 mrg inline tree op2 () const { return name2; }
592 1.1 mrg
593 1.1 mrg bool union_ (value_relation &p);
594 1.1 mrg bool intersect (value_relation &p);
595 1.1 mrg void negate ();
596 1.1 mrg bool apply_transitive (const value_relation &rel);
597 1.1 mrg
598 1.1 mrg void dump (FILE *f) const;
599 1.1 mrg private:
600 1.1 mrg relation_kind related;
601 1.1 mrg tree name1, name2;
602 1.1 mrg };
603 1.1 mrg
604 1.1 mrg // Set relation R between ssa_name N1 and N2.
605 1.1 mrg
606 1.1 mrg inline void
607 1.1 mrg value_relation::set_relation (relation_kind r, tree n1, tree n2)
608 1.1 mrg {
609 1.1 mrg gcc_checking_assert (SSA_NAME_VERSION (n1) != SSA_NAME_VERSION (n2));
610 1.1 mrg related = r;
611 1.1 mrg name1 = n1;
612 1.1 mrg name2 = n2;
613 1.1 mrg }
614 1.1 mrg
615 1.1 mrg // Default constructor.
616 1.1 mrg
617 1.1 mrg inline
618 1.1 mrg value_relation::value_relation ()
619 1.1 mrg {
620 1.1 mrg related = VREL_NONE;
621 1.1 mrg name1 = NULL_TREE;
622 1.1 mrg name2 = NULL_TREE;
623 1.1 mrg }
624 1.1 mrg
625 1.1 mrg // Constructor for relation R between SSA version N1 nd N2.
626 1.1 mrg
627 1.1 mrg inline
628 1.1 mrg value_relation::value_relation (relation_kind kind, tree n1, tree n2)
629 1.1 mrg {
630 1.1 mrg set_relation (kind, n1, n2);
631 1.1 mrg }
632 1.1 mrg
633 1.1 mrg // Negate the current relation.
634 1.1 mrg
635 1.1 mrg void
636 1.1 mrg value_relation::negate ()
637 1.1 mrg {
638 1.1 mrg related = relation_negate (related);
639 1.1 mrg }
640 1.1 mrg
641 1.1 mrg // Perform an intersection between 2 relations. *this &&= p.
642 1.1 mrg
643 1.1 mrg bool
644 1.1 mrg value_relation::intersect (value_relation &p)
645 1.1 mrg {
646 1.1 mrg // Save previous value
647 1.1 mrg relation_kind old = related;
648 1.1 mrg
649 1.1 mrg if (p.op1 () == op1 () && p.op2 () == op2 ())
650 1.1 mrg related = relation_intersect (kind (), p.kind ());
651 1.1 mrg else if (p.op2 () == op1 () && p.op1 () == op2 ())
652 1.1 mrg related = relation_intersect (kind (), relation_swap (p.kind ()));
653 1.1 mrg else
654 1.1 mrg return false;
655 1.1 mrg
656 1.1 mrg return old != related;
657 1.1 mrg }
658 1.1 mrg
659 1.1 mrg // Perform a union between 2 relations. *this ||= p.
660 1.1 mrg
661 1.1 mrg bool
662 1.1 mrg value_relation::union_ (value_relation &p)
663 1.1 mrg {
664 1.1 mrg // Save previous value
665 1.1 mrg relation_kind old = related;
666 1.1 mrg
667 1.1 mrg if (p.op1 () == op1 () && p.op2 () == op2 ())
668 1.1 mrg related = relation_union (kind(), p.kind());
669 1.1 mrg else if (p.op2 () == op1 () && p.op1 () == op2 ())
670 1.1 mrg related = relation_union (kind(), relation_swap (p.kind ()));
671 1.1 mrg else
672 1.1 mrg return false;
673 1.1 mrg
674 1.1 mrg return old != related;
675 1.1 mrg }
676 1.1 mrg
677 1.1 mrg // Identify and apply any transitive relations between REL
678 1.1 mrg // and THIS. Return true if there was a transformation.
679 1.1 mrg
680 1.1 mrg bool
681 1.1 mrg value_relation::apply_transitive (const value_relation &rel)
682 1.1 mrg {
683 1.1 mrg relation_kind k = VREL_NONE;
684 1.1 mrg
685 1.1 mrg // Idenity any common operand, and notrmalize the relations to
686 1.1 mrg // the form : A < B B < C produces A < C
687 1.1 mrg if (rel.op1 () == name2)
688 1.1 mrg {
689 1.1 mrg // A < B B < C
690 1.1 mrg if (rel.op2 () == name1)
691 1.1 mrg return false;
692 1.1 mrg k = relation_transitive (kind (), rel.kind ());
693 1.1 mrg if (k != VREL_NONE)
694 1.1 mrg {
695 1.1 mrg related = k;
696 1.1 mrg name2 = rel.op2 ();
697 1.1 mrg return true;
698 1.1 mrg }
699 1.1 mrg }
700 1.1 mrg else if (rel.op1 () == name1)
701 1.1 mrg {
702 1.1 mrg // B > A B < C
703 1.1 mrg if (rel.op2 () == name2)
704 1.1 mrg return false;
705 1.1 mrg k = relation_transitive (relation_swap (kind ()), rel.kind ());
706 1.1 mrg if (k != VREL_NONE)
707 1.1 mrg {
708 1.1 mrg related = k;
709 1.1 mrg name1 = name2;
710 1.1 mrg name2 = rel.op2 ();
711 1.1 mrg return true;
712 1.1 mrg }
713 1.1 mrg }
714 1.1 mrg else if (rel.op2 () == name2)
715 1.1 mrg {
716 1.1 mrg // A < B C > B
717 1.1 mrg if (rel.op1 () == name1)
718 1.1 mrg return false;
719 1.1 mrg k = relation_transitive (kind (), relation_swap (rel.kind ()));
720 1.1 mrg if (k != VREL_NONE)
721 1.1 mrg {
722 1.1 mrg related = k;
723 1.1 mrg name2 = rel.op1 ();
724 1.1 mrg return true;
725 1.1 mrg }
726 1.1 mrg }
727 1.1 mrg else if (rel.op2 () == name1)
728 1.1 mrg {
729 1.1 mrg // B > A C > B
730 1.1 mrg if (rel.op1 () == name2)
731 1.1 mrg return false;
732 1.1 mrg k = relation_transitive (relation_swap (kind ()),
733 1.1 mrg relation_swap (rel.kind ()));
734 1.1 mrg if (k != VREL_NONE)
735 1.1 mrg {
736 1.1 mrg related = k;
737 1.1 mrg name1 = name2;
738 1.1 mrg name2 = rel.op1 ();
739 1.1 mrg return true;
740 1.1 mrg }
741 1.1 mrg }
742 1.1 mrg return false;
743 1.1 mrg }
744 1.1 mrg
745 1.1 mrg // Dump the relation to file F.
746 1.1 mrg
747 1.1 mrg void
748 1.1 mrg value_relation::dump (FILE *f) const
749 1.1 mrg {
750 1.1 mrg if (!name1 || !name2)
751 1.1 mrg {
752 1.1 mrg fprintf (f, "uninitialized");
753 1.1 mrg return;
754 1.1 mrg }
755 1.1 mrg fputc ('(', f);
756 1.1 mrg print_generic_expr (f, op1 (), TDF_SLIM);
757 1.1 mrg print_relation (f, kind ());
758 1.1 mrg print_generic_expr (f, op2 (), TDF_SLIM);
759 1.1 mrg fputc(')', f);
760 1.1 mrg }
761 1.1 mrg
762 1.1 mrg // This container is used to link relations in a chain.
763 1.1 mrg
764 1.1 mrg class relation_chain : public value_relation
765 1.1 mrg {
766 1.1 mrg public:
767 1.1 mrg relation_chain *m_next;
768 1.1 mrg };
769 1.1 mrg
770 1.1 mrg // ------------------------------------------------------------------------
771 1.1 mrg
772 1.1 mrg // Find the relation between any ssa_name in B1 and any name in B2 in LIST.
773 1.1 mrg // This will allow equivalencies to be applied to any SSA_NAME in a relation.
774 1.1 mrg
775 1.1 mrg relation_kind
776 1.1 mrg relation_chain_head::find_relation (const_bitmap b1, const_bitmap b2) const
777 1.1 mrg {
778 1.1 mrg if (!m_names)
779 1.1 mrg return VREL_NONE;
780 1.1 mrg
781 1.1 mrg // If both b1 and b2 aren't referenced in thie block, cant be a relation
782 1.1 mrg if (!bitmap_intersect_p (m_names, b1) || !bitmap_intersect_p (m_names, b2))
783 1.1 mrg return VREL_NONE;
784 1.1 mrg
785 1.1 mrg // Search for the fiorst relation that contains BOTH an element from B1
786 1.1 mrg // and B2, and return that relation.
787 1.1 mrg for (relation_chain *ptr = m_head; ptr ; ptr = ptr->m_next)
788 1.1 mrg {
789 1.1 mrg unsigned op1 = SSA_NAME_VERSION (ptr->op1 ());
790 1.1 mrg unsigned op2 = SSA_NAME_VERSION (ptr->op2 ());
791 1.1 mrg if (bitmap_bit_p (b1, op1) && bitmap_bit_p (b2, op2))
792 1.1 mrg return ptr->kind ();
793 1.1 mrg if (bitmap_bit_p (b1, op2) && bitmap_bit_p (b2, op1))
794 1.1 mrg return relation_swap (ptr->kind ());
795 1.1 mrg }
796 1.1 mrg
797 1.1 mrg return VREL_NONE;
798 1.1 mrg }
799 1.1 mrg
800 1.1 mrg // Instantiate a relation oracle.
801 1.1 mrg
802 1.1 mrg dom_oracle::dom_oracle ()
803 1.1 mrg {
804 1.1 mrg m_relations.create (0);
805 1.1 mrg m_relations.safe_grow_cleared (last_basic_block_for_fn (cfun) + 1);
806 1.1 mrg m_relation_set = BITMAP_ALLOC (&m_bitmaps);
807 1.1 mrg m_tmp = BITMAP_ALLOC (&m_bitmaps);
808 1.1 mrg m_tmp2 = BITMAP_ALLOC (&m_bitmaps);
809 1.1 mrg }
810 1.1 mrg
811 1.1 mrg // Destruct a relation oracle.
812 1.1 mrg
813 1.1 mrg dom_oracle::~dom_oracle ()
814 1.1 mrg {
815 1.1 mrg m_relations.release ();
816 1.1 mrg }
817 1.1 mrg
818 1.1 mrg // Register relation K between ssa_name OP1 and OP2 on STMT.
819 1.1 mrg
820 1.1 mrg void
821 1.1 mrg relation_oracle::register_stmt (gimple *stmt, relation_kind k, tree op1,
822 1.1 mrg tree op2)
823 1.1 mrg {
824 1.1 mrg gcc_checking_assert (TREE_CODE (op1) == SSA_NAME);
825 1.1 mrg gcc_checking_assert (TREE_CODE (op2) == SSA_NAME);
826 1.1 mrg gcc_checking_assert (stmt && gimple_bb (stmt));
827 1.1 mrg
828 1.1 mrg // Don't register lack of a relation.
829 1.1 mrg if (k == VREL_NONE)
830 1.1 mrg return;
831 1.1 mrg
832 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
833 1.1 mrg {
834 1.1 mrg value_relation vr (k, op1, op2);
835 1.1 mrg fprintf (dump_file, " Registering value_relation ");
836 1.1 mrg vr.dump (dump_file);
837 1.1 mrg fprintf (dump_file, " (bb%d) at ", gimple_bb (stmt)->index);
838 1.1 mrg print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
839 1.1 mrg }
840 1.1 mrg
841 1.1 mrg // If an equivalence is being added between a PHI and one of its arguments
842 1.1 mrg // make sure that that argument is not defined in the same block.
843 1.1 mrg // This can happen along back edges and the equivalence will not be
844 1.1 mrg // applicable as it would require a use before def.
845 1.1 mrg if (k == EQ_EXPR && is_a<gphi *> (stmt))
846 1.1 mrg {
847 1.1 mrg tree phi_def = gimple_phi_result (stmt);
848 1.1 mrg gcc_checking_assert (phi_def == op1 || phi_def == op2);
849 1.1 mrg tree arg = op2;
850 1.1 mrg if (phi_def == op2)
851 1.1 mrg arg = op1;
852 1.1 mrg if (gimple_bb (stmt) == gimple_bb (SSA_NAME_DEF_STMT (arg)))
853 1.1 mrg {
854 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
855 1.1 mrg {
856 1.1 mrg fprintf (dump_file, " Not registered due to ");
857 1.1 mrg print_generic_expr (dump_file, arg, TDF_SLIM);
858 1.1 mrg fprintf (dump_file, " being defined in the same block.\n");
859 1.1 mrg }
860 1.1 mrg return;
861 1.1 mrg }
862 1.1 mrg }
863 1.1 mrg register_relation (gimple_bb (stmt), k, op1, op2);
864 1.1 mrg }
865 1.1 mrg
866 1.1 mrg // Register relation K between ssa_name OP1 and OP2 on edge E.
867 1.1 mrg
868 1.1 mrg void
869 1.1 mrg relation_oracle::register_edge (edge e, relation_kind k, tree op1, tree op2)
870 1.1 mrg {
871 1.1 mrg gcc_checking_assert (TREE_CODE (op1) == SSA_NAME);
872 1.1 mrg gcc_checking_assert (TREE_CODE (op2) == SSA_NAME);
873 1.1 mrg
874 1.1 mrg // Do not register lack of relation, or blocks which have more than
875 1.1 mrg // edge E for a predecessor.
876 1.1 mrg if (k == VREL_NONE || !single_pred_p (e->dest))
877 1.1 mrg return;
878 1.1 mrg
879 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
880 1.1 mrg {
881 1.1 mrg value_relation vr (k, op1, op2);
882 1.1 mrg fprintf (dump_file, " Registering value_relation ");
883 1.1 mrg vr.dump (dump_file);
884 1.1 mrg fprintf (dump_file, " on (%d->%d)\n", e->src->index, e->dest->index);
885 1.1 mrg }
886 1.1 mrg
887 1.1 mrg register_relation (e->dest, k, op1, op2);
888 1.1 mrg }
889 1.1 mrg
890 1.1 mrg // Register relation K between OP! and OP2 in block BB.
891 1.1 mrg // This creates the record and searches for existing records in the dominator
892 1.1 mrg // tree to merge with.
893 1.1 mrg
894 1.1 mrg void
895 1.1 mrg dom_oracle::register_relation (basic_block bb, relation_kind k, tree op1,
896 1.1 mrg tree op2)
897 1.1 mrg {
898 1.1 mrg // If the 2 ssa_names are the same, do nothing. An equivalence is implied,
899 1.1 mrg // and no other relation makes sense.
900 1.1 mrg if (op1 == op2)
901 1.1 mrg return;
902 1.1 mrg
903 1.1 mrg // Equivalencies are handled by the equivalence oracle.
904 1.1 mrg if (k == EQ_EXPR)
905 1.1 mrg equiv_oracle::register_relation (bb, k, op1, op2);
906 1.1 mrg else
907 1.1 mrg {
908 1.1 mrg relation_chain *ptr = set_one_relation (bb, k, op1, op2);
909 1.1 mrg if (ptr)
910 1.1 mrg register_transitives (bb, *ptr);
911 1.1 mrg }
912 1.1 mrg }
913 1.1 mrg
914 1.1 mrg // Register relation K between OP! and OP2 in block BB.
915 1.1 mrg // This creates the record and searches for existing records in the dominator
916 1.1 mrg // tree to merge with. Return the record, or NULL if no record was created.
917 1.1 mrg
918 1.1 mrg relation_chain *
919 1.1 mrg dom_oracle::set_one_relation (basic_block bb, relation_kind k, tree op1,
920 1.1 mrg tree op2)
921 1.1 mrg {
922 1.1 mrg gcc_checking_assert (k != VREL_NONE && k != EQ_EXPR);
923 1.1 mrg
924 1.1 mrg value_relation vr(k, op1, op2);
925 1.1 mrg int bbi = bb->index;
926 1.1 mrg
927 1.1 mrg if (bbi >= (int)m_relations.length())
928 1.1 mrg m_relations.safe_grow_cleared (last_basic_block_for_fn (cfun) + 1);
929 1.1 mrg
930 1.1 mrg // Summary bitmap indicating what ssa_names have relations in this BB.
931 1.1 mrg bitmap bm = m_relations[bbi].m_names;
932 1.1 mrg if (!bm)
933 1.1 mrg bm = m_relations[bbi].m_names = BITMAP_ALLOC (&m_bitmaps);
934 1.1 mrg unsigned v1 = SSA_NAME_VERSION (op1);
935 1.1 mrg unsigned v2 = SSA_NAME_VERSION (op2);
936 1.1 mrg
937 1.1 mrg relation_kind curr;
938 1.1 mrg relation_chain *ptr;
939 1.1 mrg curr = find_relation_block (bbi, v1, v2, &ptr);
940 1.1 mrg // There is an existing relation in this block, just intersect with it.
941 1.1 mrg if (curr != VREL_NONE)
942 1.1 mrg {
943 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
944 1.1 mrg {
945 1.1 mrg fprintf (dump_file, " Intersecting with existing ");
946 1.1 mrg ptr->dump (dump_file);
947 1.1 mrg }
948 1.1 mrg // Check into whether we can simply replace the relation rather than
949 1.1 mrg // intersecting it. THis may help with some optimistic iterative
950 1.1 mrg // updating algorithms.
951 1.1 mrg ptr->intersect (vr);
952 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
953 1.1 mrg {
954 1.1 mrg fprintf (dump_file, " to produce ");
955 1.1 mrg ptr->dump (dump_file);
956 1.1 mrg fprintf (dump_file, "\n");
957 1.1 mrg }
958 1.1 mrg }
959 1.1 mrg else
960 1.1 mrg {
961 1.1 mrg if (m_relations[bbi].m_num_relations >= param_relation_block_limit)
962 1.1 mrg {
963 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
964 1.1 mrg fprintf (dump_file, " Not registered due to bb being full\n");
965 1.1 mrg return NULL;
966 1.1 mrg }
967 1.1 mrg m_relations[bbi].m_num_relations++;
968 1.1 mrg // Check for an existing relation further up the DOM chain.
969 1.1 mrg // By including dominating relations, The first one found in any search
970 1.1 mrg // will be the aggregate of all the previous ones.
971 1.1 mrg curr = find_relation_dom (bb, v1, v2);
972 1.1 mrg if (curr != VREL_NONE)
973 1.1 mrg k = relation_intersect (curr, k);
974 1.1 mrg
975 1.1 mrg bitmap_set_bit (bm, v1);
976 1.1 mrg bitmap_set_bit (bm, v2);
977 1.1 mrg bitmap_set_bit (m_relation_set, v1);
978 1.1 mrg bitmap_set_bit (m_relation_set, v2);
979 1.1 mrg
980 1.1 mrg ptr = (relation_chain *) obstack_alloc (&m_chain_obstack,
981 1.1 mrg sizeof (relation_chain));
982 1.1 mrg ptr->set_relation (k, op1, op2);
983 1.1 mrg ptr->m_next = m_relations[bbi].m_head;
984 1.1 mrg m_relations[bbi].m_head = ptr;
985 1.1 mrg }
986 1.1 mrg return ptr;
987 1.1 mrg }
988 1.1 mrg
989 1.1 mrg // Starting at ROOT_BB search the DOM tree looking for relations which
990 1.1 mrg // may produce transitive relations to RELATION. EQUIV1 and EQUIV2 are
991 1.1 mrg // bitmaps for op1/op2 and any of their equivalences that should also be
992 1.1 mrg // considered.
993 1.1 mrg
994 1.1 mrg void
995 1.1 mrg dom_oracle::register_transitives (basic_block root_bb,
996 1.1 mrg const value_relation &relation)
997 1.1 mrg {
998 1.1 mrg basic_block bb;
999 1.1 mrg // Only apply transitives to certain kinds of operations.
1000 1.1 mrg switch (relation.kind ())
1001 1.1 mrg {
1002 1.1 mrg case LE_EXPR:
1003 1.1 mrg case LT_EXPR:
1004 1.1 mrg case GT_EXPR:
1005 1.1 mrg case GE_EXPR:
1006 1.1 mrg break;
1007 1.1 mrg default:
1008 1.1 mrg return;
1009 1.1 mrg }
1010 1.1 mrg
1011 1.1 mrg const_bitmap equiv1 = equiv_set (relation.op1 (), root_bb);
1012 1.1 mrg const_bitmap equiv2 = equiv_set (relation.op2 (), root_bb);
1013 1.1 mrg
1014 1.1 mrg for (bb = root_bb; bb; bb = get_immediate_dominator (CDI_DOMINATORS, bb))
1015 1.1 mrg {
1016 1.1 mrg int bbi = bb->index;
1017 1.1 mrg if (bbi >= (int)m_relations.length())
1018 1.1 mrg continue;
1019 1.1 mrg const_bitmap bm = m_relations[bbi].m_names;
1020 1.1 mrg if (!bm)
1021 1.1 mrg continue;
1022 1.1 mrg if (!bitmap_intersect_p (bm, equiv1) && !bitmap_intersect_p (bm, equiv2))
1023 1.1 mrg continue;
1024 1.1 mrg // At least one of the 2 ops has a relation in this block.
1025 1.1 mrg relation_chain *ptr;
1026 1.1 mrg for (ptr = m_relations[bbi].m_head; ptr ; ptr = ptr->m_next)
1027 1.1 mrg {
1028 1.1 mrg // In the presence of an equivalence, 2 operands may do not
1029 1.1 mrg // naturally match. ie with equivalence a_2 == b_3
1030 1.1 mrg // given c_1 < a_2 && b_3 < d_4
1031 1.1 mrg // convert the second relation (b_3 < d_4) to match any
1032 1.1 mrg // equivalences to found in the first relation.
1033 1.1 mrg // ie convert b_3 < d_4 to a_2 < d_4, which then exposes the
1034 1.1 mrg // transitive operation: c_1 < a_2 && a_2 < d_4 -> c_1 < d_4
1035 1.1 mrg
1036 1.1 mrg tree r1, r2;
1037 1.1 mrg tree p1 = ptr->op1 ();
1038 1.1 mrg tree p2 = ptr->op2 ();
1039 1.1 mrg // Find which equivalence is in the first operand.
1040 1.1 mrg if (bitmap_bit_p (equiv1, SSA_NAME_VERSION (p1)))
1041 1.1 mrg r1 = p1;
1042 1.1 mrg else if (bitmap_bit_p (equiv1, SSA_NAME_VERSION (p2)))
1043 1.1 mrg r1 = p2;
1044 1.1 mrg else
1045 1.1 mrg r1 = NULL_TREE;
1046 1.1 mrg
1047 1.1 mrg // Find which equivalence is in the second operand.
1048 1.1 mrg if (bitmap_bit_p (equiv2, SSA_NAME_VERSION (p1)))
1049 1.1 mrg r2 = p1;
1050 1.1 mrg else if (bitmap_bit_p (equiv2, SSA_NAME_VERSION (p2)))
1051 1.1 mrg r2 = p2;
1052 1.1 mrg else
1053 1.1 mrg r2 = NULL_TREE;
1054 1.1 mrg
1055 1.1 mrg // Ignore if both NULL (not relevant relation) or the same,
1056 1.1 mrg if (r1 == r2)
1057 1.1 mrg continue;
1058 1.1 mrg
1059 1.1 mrg // Any operand not an equivalence, just take the real operand.
1060 1.1 mrg if (!r1)
1061 1.1 mrg r1 = relation.op1 ();
1062 1.1 mrg if (!r2)
1063 1.1 mrg r2 = relation.op2 ();
1064 1.1 mrg
1065 1.1 mrg value_relation nr (relation.kind (), r1, r2);
1066 1.1 mrg if (nr.apply_transitive (*ptr))
1067 1.1 mrg {
1068 1.1 mrg if (!set_one_relation (root_bb, nr.kind (), nr.op1 (), nr.op2 ()))
1069 1.1 mrg return;
1070 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
1071 1.1 mrg {
1072 1.1 mrg fprintf (dump_file, " Registering transitive relation ");
1073 1.1 mrg nr.dump (dump_file);
1074 1.1 mrg fputc ('\n', dump_file);
1075 1.1 mrg }
1076 1.1 mrg }
1077 1.1 mrg
1078 1.1 mrg }
1079 1.1 mrg }
1080 1.1 mrg }
1081 1.1 mrg
1082 1.1 mrg // Find the relation between any ssa_name in B1 and any name in B2 in block BB.
1083 1.1 mrg // This will allow equivalencies to be applied to any SSA_NAME in a relation.
1084 1.1 mrg
1085 1.1 mrg relation_kind
1086 1.1 mrg dom_oracle::find_relation_block (unsigned bb, const_bitmap b1,
1087 1.1 mrg const_bitmap b2) const
1088 1.1 mrg {
1089 1.1 mrg if (bb >= m_relations.length())
1090 1.1 mrg return VREL_NONE;
1091 1.1 mrg
1092 1.1 mrg return m_relations[bb].find_relation (b1, b2);
1093 1.1 mrg }
1094 1.1 mrg
1095 1.1 mrg // Search the DOM tree for a relation between an element of equivalency set B1
1096 1.1 mrg // and B2, starting with block BB.
1097 1.1 mrg
1098 1.1 mrg relation_kind
1099 1.1 mrg dom_oracle::query_relation (basic_block bb, const_bitmap b1,
1100 1.1 mrg const_bitmap b2)
1101 1.1 mrg {
1102 1.1 mrg relation_kind r;
1103 1.1 mrg if (bitmap_equal_p (b1, b2))
1104 1.1 mrg return EQ_EXPR;
1105 1.1 mrg
1106 1.1 mrg // If either name does not occur in a relation anywhere, there isnt one.
1107 1.1 mrg if (!bitmap_intersect_p (m_relation_set, b1)
1108 1.1 mrg || !bitmap_intersect_p (m_relation_set, b2))
1109 1.1 mrg return VREL_NONE;
1110 1.1 mrg
1111 1.1 mrg // Search each block in the DOM tree checking.
1112 1.1 mrg for ( ; bb; bb = get_immediate_dominator (CDI_DOMINATORS, bb))
1113 1.1 mrg {
1114 1.1 mrg r = find_relation_block (bb->index, b1, b2);
1115 1.1 mrg if (r != VREL_NONE)
1116 1.1 mrg return r;
1117 1.1 mrg }
1118 1.1 mrg return VREL_NONE;
1119 1.1 mrg
1120 1.1 mrg }
1121 1.1 mrg
1122 1.1 mrg // Find a relation in block BB between ssa version V1 and V2. If a relation
1123 1.1 mrg // is found, return a pointer to the chain object in OBJ.
1124 1.1 mrg
1125 1.1 mrg relation_kind
1126 1.1 mrg dom_oracle::find_relation_block (int bb, unsigned v1, unsigned v2,
1127 1.1 mrg relation_chain **obj) const
1128 1.1 mrg {
1129 1.1 mrg if (bb >= (int)m_relations.length())
1130 1.1 mrg return VREL_NONE;
1131 1.1 mrg
1132 1.1 mrg const_bitmap bm = m_relations[bb].m_names;
1133 1.1 mrg if (!bm)
1134 1.1 mrg return VREL_NONE;
1135 1.1 mrg
1136 1.1 mrg // If both b1 and b2 aren't referenced in thie block, cant be a relation
1137 1.1 mrg if (!bitmap_bit_p (bm, v1) || !bitmap_bit_p (bm, v2))
1138 1.1 mrg return VREL_NONE;
1139 1.1 mrg
1140 1.1 mrg relation_chain *ptr;
1141 1.1 mrg for (ptr = m_relations[bb].m_head; ptr ; ptr = ptr->m_next)
1142 1.1 mrg {
1143 1.1 mrg unsigned op1 = SSA_NAME_VERSION (ptr->op1 ());
1144 1.1 mrg unsigned op2 = SSA_NAME_VERSION (ptr->op2 ());
1145 1.1 mrg if (v1 == op1 && v2 == op2)
1146 1.1 mrg {
1147 1.1 mrg if (obj)
1148 1.1 mrg *obj = ptr;
1149 1.1 mrg return ptr->kind ();
1150 1.1 mrg }
1151 1.1 mrg if (v1 == op2 && v2 == op1)
1152 1.1 mrg {
1153 1.1 mrg if (obj)
1154 1.1 mrg *obj = ptr;
1155 1.1 mrg return relation_swap (ptr->kind ());
1156 1.1 mrg }
1157 1.1 mrg }
1158 1.1 mrg
1159 1.1 mrg return VREL_NONE;
1160 1.1 mrg }
1161 1.1 mrg
1162 1.1 mrg // Find a relation between SSA version V1 and V2 in the dominator tree
1163 1.1 mrg // starting with block BB
1164 1.1 mrg
1165 1.1 mrg relation_kind
1166 1.1 mrg dom_oracle::find_relation_dom (basic_block bb, unsigned v1, unsigned v2) const
1167 1.1 mrg {
1168 1.1 mrg relation_kind r;
1169 1.1 mrg // IF either name does not occur in a relation anywhere, there isnt one.
1170 1.1 mrg if (!bitmap_bit_p (m_relation_set, v1) || !bitmap_bit_p (m_relation_set, v2))
1171 1.1 mrg return VREL_NONE;
1172 1.1 mrg
1173 1.1 mrg for ( ; bb; bb = get_immediate_dominator (CDI_DOMINATORS, bb))
1174 1.1 mrg {
1175 1.1 mrg r = find_relation_block (bb->index, v1, v2);
1176 1.1 mrg if (r != VREL_NONE)
1177 1.1 mrg return r;
1178 1.1 mrg }
1179 1.1 mrg return VREL_NONE;
1180 1.1 mrg
1181 1.1 mrg }
1182 1.1 mrg
1183 1.1 mrg // Query if there is a relation between SSA1 and SS2 in block BB or a
1184 1.1 mrg // dominator of BB
1185 1.1 mrg
1186 1.1 mrg relation_kind
1187 1.1 mrg dom_oracle::query_relation (basic_block bb, tree ssa1, tree ssa2)
1188 1.1 mrg {
1189 1.1 mrg relation_kind kind;
1190 1.1 mrg unsigned v1 = SSA_NAME_VERSION (ssa1);
1191 1.1 mrg unsigned v2 = SSA_NAME_VERSION (ssa2);
1192 1.1 mrg if (v1 == v2)
1193 1.1 mrg return EQ_EXPR;
1194 1.1 mrg
1195 1.1 mrg // Check for equivalence first. They must be in each equivalency set.
1196 1.1 mrg const_bitmap equiv1 = equiv_set (ssa1, bb);
1197 1.1 mrg const_bitmap equiv2 = equiv_set (ssa2, bb);
1198 1.1 mrg if (bitmap_bit_p (equiv1, v2) && bitmap_bit_p (equiv2, v1))
1199 1.1 mrg return EQ_EXPR;
1200 1.1 mrg
1201 1.1 mrg // Initially look for a direct relationship and just return that.
1202 1.1 mrg kind = find_relation_dom (bb, v1, v2);
1203 1.1 mrg if (kind != VREL_NONE)
1204 1.1 mrg return kind;
1205 1.1 mrg
1206 1.1 mrg // Query using the equiovalence sets.
1207 1.1 mrg kind = query_relation (bb, equiv1, equiv2);
1208 1.1 mrg return kind;
1209 1.1 mrg }
1210 1.1 mrg
1211 1.1 mrg // Dump all the relations in block BB to file F.
1212 1.1 mrg
1213 1.1 mrg void
1214 1.1 mrg dom_oracle::dump (FILE *f, basic_block bb) const
1215 1.1 mrg {
1216 1.1 mrg equiv_oracle::dump (f,bb);
1217 1.1 mrg
1218 1.1 mrg if (bb->index >= (int)m_relations.length ())
1219 1.1 mrg return;
1220 1.1 mrg if (!m_relations[bb->index].m_names)
1221 1.1 mrg return;
1222 1.1 mrg
1223 1.1 mrg relation_chain *ptr = m_relations[bb->index].m_head;
1224 1.1 mrg for (; ptr; ptr = ptr->m_next)
1225 1.1 mrg {
1226 1.1 mrg fprintf (f, "Relational : ");
1227 1.1 mrg ptr->dump (f);
1228 1.1 mrg fprintf (f, "\n");
1229 1.1 mrg }
1230 1.1 mrg }
1231 1.1 mrg
1232 1.1 mrg // Dump all the relations known to file F.
1233 1.1 mrg
1234 1.1 mrg void
1235 1.1 mrg dom_oracle::dump (FILE *f) const
1236 1.1 mrg {
1237 1.1 mrg fprintf (f, "Relation dump\n");
1238 1.1 mrg for (unsigned i = 0; i < m_relations.length (); i++)
1239 1.1 mrg if (BASIC_BLOCK_FOR_FN (cfun, i))
1240 1.1 mrg {
1241 1.1 mrg fprintf (f, "BB%d\n", i);
1242 1.1 mrg dump (f, BASIC_BLOCK_FOR_FN (cfun, i));
1243 1.1 mrg }
1244 1.1 mrg }
1245 1.1 mrg
1246 1.1 mrg void
1247 1.1 mrg relation_oracle::debug () const
1248 1.1 mrg {
1249 1.1 mrg dump (stderr);
1250 1.1 mrg }
1251 1.1 mrg
1252 1.1 mrg path_oracle::path_oracle (relation_oracle *oracle)
1253 1.1 mrg {
1254 1.1 mrg set_root_oracle (oracle);
1255 1.1 mrg bitmap_obstack_initialize (&m_bitmaps);
1256 1.1 mrg obstack_init (&m_chain_obstack);
1257 1.1 mrg
1258 1.1 mrg // Initialize header records.
1259 1.1 mrg m_equiv.m_names = BITMAP_ALLOC (&m_bitmaps);
1260 1.1 mrg m_equiv.m_bb = NULL;
1261 1.1 mrg m_equiv.m_next = NULL;
1262 1.1 mrg m_relations.m_names = BITMAP_ALLOC (&m_bitmaps);
1263 1.1 mrg m_relations.m_head = NULL;
1264 1.1 mrg m_killed_defs = BITMAP_ALLOC (&m_bitmaps);
1265 1.1 mrg }
1266 1.1 mrg
1267 1.1 mrg path_oracle::~path_oracle ()
1268 1.1 mrg {
1269 1.1 mrg obstack_free (&m_chain_obstack, NULL);
1270 1.1 mrg bitmap_obstack_release (&m_bitmaps);
1271 1.1 mrg }
1272 1.1 mrg
1273 1.1 mrg // Return the equiv set for SSA, and if there isn't one, check for equivs
1274 1.1 mrg // starting in block BB.
1275 1.1 mrg
1276 1.1 mrg const_bitmap
1277 1.1 mrg path_oracle::equiv_set (tree ssa, basic_block bb)
1278 1.1 mrg {
1279 1.1 mrg // Check the list first.
1280 1.1 mrg equiv_chain *ptr = m_equiv.find (SSA_NAME_VERSION (ssa));
1281 1.1 mrg if (ptr)
1282 1.1 mrg return ptr->m_names;
1283 1.1 mrg
1284 1.1 mrg // Otherwise defer to the root oracle.
1285 1.1 mrg if (m_root)
1286 1.1 mrg return m_root->equiv_set (ssa, bb);
1287 1.1 mrg
1288 1.1 mrg // Allocate a throw away bitmap if there isn't a root oracle.
1289 1.1 mrg bitmap tmp = BITMAP_ALLOC (&m_bitmaps);
1290 1.1 mrg bitmap_set_bit (tmp, SSA_NAME_VERSION (ssa));
1291 1.1 mrg return tmp;
1292 1.1 mrg }
1293 1.1 mrg
1294 1.1 mrg // Register an equivalence between SSA1 and SSA2 resolving unkowns from
1295 1.1 mrg // block BB.
1296 1.1 mrg
1297 1.1 mrg void
1298 1.1 mrg path_oracle::register_equiv (basic_block bb, tree ssa1, tree ssa2)
1299 1.1 mrg {
1300 1.1 mrg const_bitmap equiv_1 = equiv_set (ssa1, bb);
1301 1.1 mrg const_bitmap equiv_2 = equiv_set (ssa2, bb);
1302 1.1 mrg
1303 1.1 mrg // Check if they are the same set, if so, we're done.
1304 1.1 mrg if (bitmap_equal_p (equiv_1, equiv_2))
1305 1.1 mrg return;
1306 1.1 mrg
1307 1.1 mrg // Don't mess around, simply create a new record and insert it first.
1308 1.1 mrg bitmap b = BITMAP_ALLOC (&m_bitmaps);
1309 1.1 mrg valid_equivs (b, equiv_1, bb);
1310 1.1 mrg valid_equivs (b, equiv_2, bb);
1311 1.1 mrg
1312 1.1 mrg equiv_chain *ptr = (equiv_chain *) obstack_alloc (&m_chain_obstack,
1313 1.1 mrg sizeof (equiv_chain));
1314 1.1 mrg ptr->m_names = b;
1315 1.1 mrg ptr->m_bb = NULL;
1316 1.1 mrg ptr->m_next = m_equiv.m_next;
1317 1.1 mrg m_equiv.m_next = ptr;
1318 1.1 mrg bitmap_ior_into (m_equiv.m_names, b);
1319 1.1 mrg }
1320 1.1 mrg
1321 1.1 mrg // Register killing definition of an SSA_NAME.
1322 1.1 mrg
1323 1.1 mrg void
1324 1.1 mrg path_oracle::killing_def (tree ssa)
1325 1.1 mrg {
1326 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
1327 1.1 mrg {
1328 1.1 mrg fprintf (dump_file, " Registering killing_def (path_oracle) ");
1329 1.1 mrg print_generic_expr (dump_file, ssa, TDF_SLIM);
1330 1.1 mrg fprintf (dump_file, "\n");
1331 1.1 mrg }
1332 1.1 mrg
1333 1.1 mrg unsigned v = SSA_NAME_VERSION (ssa);
1334 1.1 mrg
1335 1.1 mrg bitmap_set_bit (m_killed_defs, v);
1336 1.1 mrg
1337 1.1 mrg // Walk the equivalency list and remove SSA from any equivalencies.
1338 1.1 mrg if (bitmap_bit_p (m_equiv.m_names, v))
1339 1.1 mrg {
1340 1.1 mrg for (equiv_chain *ptr = m_equiv.m_next; ptr; ptr = ptr->m_next)
1341 1.1 mrg if (bitmap_bit_p (ptr->m_names, v))
1342 1.1 mrg bitmap_clear_bit (ptr->m_names, v);
1343 1.1 mrg }
1344 1.1 mrg else
1345 1.1 mrg bitmap_set_bit (m_equiv.m_names, v);
1346 1.1 mrg
1347 1.1 mrg // Now add an equivalency with itself so we don't look to the root oracle.
1348 1.1 mrg bitmap b = BITMAP_ALLOC (&m_bitmaps);
1349 1.1 mrg bitmap_set_bit (b, v);
1350 1.1 mrg equiv_chain *ptr = (equiv_chain *) obstack_alloc (&m_chain_obstack,
1351 1.1 mrg sizeof (equiv_chain));
1352 1.1 mrg ptr->m_names = b;
1353 1.1 mrg ptr->m_bb = NULL;
1354 1.1 mrg ptr->m_next = m_equiv.m_next;
1355 1.1 mrg m_equiv.m_next = ptr;
1356 1.1 mrg
1357 1.1 mrg // Walk the relation list and remove SSA from any relations.
1358 1.1 mrg if (!bitmap_bit_p (m_relations.m_names, v))
1359 1.1 mrg return;
1360 1.1 mrg
1361 1.1 mrg bitmap_clear_bit (m_relations.m_names, v);
1362 1.1 mrg relation_chain **prev = &(m_relations.m_head);
1363 1.1 mrg relation_chain *next = NULL;
1364 1.1 mrg for (relation_chain *ptr = m_relations.m_head; ptr; ptr = next)
1365 1.1 mrg {
1366 1.1 mrg gcc_checking_assert (*prev == ptr);
1367 1.1 mrg next = ptr->m_next;
1368 1.1 mrg if (SSA_NAME_VERSION (ptr->op1 ()) == v
1369 1.1 mrg || SSA_NAME_VERSION (ptr->op2 ()) == v)
1370 1.1 mrg *prev = ptr->m_next;
1371 1.1 mrg else
1372 1.1 mrg prev = &(ptr->m_next);
1373 1.1 mrg }
1374 1.1 mrg }
1375 1.1 mrg
1376 1.1 mrg // Register relation K between SSA1 and SSA2, resolving unknowns by
1377 1.1 mrg // querying from BB.
1378 1.1 mrg
1379 1.1 mrg void
1380 1.1 mrg path_oracle::register_relation (basic_block bb, relation_kind k, tree ssa1,
1381 1.1 mrg tree ssa2)
1382 1.1 mrg {
1383 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
1384 1.1 mrg {
1385 1.1 mrg value_relation vr (k, ssa1, ssa2);
1386 1.1 mrg fprintf (dump_file, " Registering value_relation (path_oracle) ");
1387 1.1 mrg vr.dump (dump_file);
1388 1.1 mrg fprintf (dump_file, " (root: bb%d)\n", bb->index);
1389 1.1 mrg }
1390 1.1 mrg
1391 1.1 mrg relation_kind curr = query_relation (bb, ssa1, ssa2);
1392 1.1 mrg if (curr != VREL_NONE)
1393 1.1 mrg k = relation_intersect (curr, k);
1394 1.1 mrg
1395 1.1 mrg if (k == EQ_EXPR)
1396 1.1 mrg {
1397 1.1 mrg register_equiv (bb, ssa1, ssa2);
1398 1.1 mrg return;
1399 1.1 mrg }
1400 1.1 mrg
1401 1.1 mrg bitmap_set_bit (m_relations.m_names, SSA_NAME_VERSION (ssa1));
1402 1.1 mrg bitmap_set_bit (m_relations.m_names, SSA_NAME_VERSION (ssa2));
1403 1.1 mrg relation_chain *ptr = (relation_chain *) obstack_alloc (&m_chain_obstack,
1404 1.1 mrg sizeof (relation_chain));
1405 1.1 mrg ptr->set_relation (k, ssa1, ssa2);
1406 1.1 mrg ptr->m_next = m_relations.m_head;
1407 1.1 mrg m_relations.m_head = ptr;
1408 1.1 mrg }
1409 1.1 mrg
1410 1.1 mrg // Query for a relationship between equiv set B1 and B2, resolving unknowns
1411 1.1 mrg // starting at block BB.
1412 1.1 mrg
1413 1.1 mrg relation_kind
1414 1.1 mrg path_oracle::query_relation (basic_block bb, const_bitmap b1, const_bitmap b2)
1415 1.1 mrg {
1416 1.1 mrg if (bitmap_equal_p (b1, b2))
1417 1.1 mrg return EQ_EXPR;
1418 1.1 mrg
1419 1.1 mrg relation_kind k = m_relations.find_relation (b1, b2);
1420 1.1 mrg
1421 1.1 mrg // Do not look at the root oracle for names that have been killed
1422 1.1 mrg // along the path.
1423 1.1 mrg if (bitmap_intersect_p (m_killed_defs, b1)
1424 1.1 mrg || bitmap_intersect_p (m_killed_defs, b2))
1425 1.1 mrg return k;
1426 1.1 mrg
1427 1.1 mrg if (k == VREL_NONE && m_root)
1428 1.1 mrg k = m_root->query_relation (bb, b1, b2);
1429 1.1 mrg
1430 1.1 mrg return k;
1431 1.1 mrg }
1432 1.1 mrg
1433 1.1 mrg // Query for a relationship between SSA1 and SSA2, resolving unknowns
1434 1.1 mrg // starting at block BB.
1435 1.1 mrg
1436 1.1 mrg relation_kind
1437 1.1 mrg path_oracle::query_relation (basic_block bb, tree ssa1, tree ssa2)
1438 1.1 mrg {
1439 1.1 mrg unsigned v1 = SSA_NAME_VERSION (ssa1);
1440 1.1 mrg unsigned v2 = SSA_NAME_VERSION (ssa2);
1441 1.1 mrg
1442 1.1 mrg if (v1 == v2)
1443 1.1 mrg return EQ_EXPR;
1444 1.1 mrg
1445 1.1 mrg const_bitmap equiv_1 = equiv_set (ssa1, bb);
1446 1.1 mrg const_bitmap equiv_2 = equiv_set (ssa2, bb);
1447 1.1 mrg if (bitmap_bit_p (equiv_1, v2) && bitmap_bit_p (equiv_2, v1))
1448 1.1 mrg return EQ_EXPR;
1449 1.1 mrg
1450 1.1 mrg return query_relation (bb, equiv_1, equiv_2);
1451 1.1 mrg }
1452 1.1 mrg
1453 1.1 mrg // Reset any relations registered on this path.
1454 1.1 mrg
1455 1.1 mrg void
1456 1.1 mrg path_oracle::reset_path ()
1457 1.1 mrg {
1458 1.1 mrg m_equiv.m_next = NULL;
1459 1.1 mrg bitmap_clear (m_equiv.m_names);
1460 1.1 mrg m_relations.m_head = NULL;
1461 1.1 mrg bitmap_clear (m_relations.m_names);
1462 1.1 mrg }
1463 1.1 mrg
1464 1.1 mrg // Dump relation in basic block... Do nothing here.
1465 1.1 mrg
1466 1.1 mrg void
1467 1.1 mrg path_oracle::dump (FILE *, basic_block) const
1468 1.1 mrg {
1469 1.1 mrg }
1470 1.1 mrg
1471 1.1 mrg // Dump the relations and equivalencies found in the path.
1472 1.1 mrg
1473 1.1 mrg void
1474 1.1 mrg path_oracle::dump (FILE *f) const
1475 1.1 mrg {
1476 1.1 mrg equiv_chain *ptr = m_equiv.m_next;
1477 1.1 mrg relation_chain *ptr2 = m_relations.m_head;
1478 1.1 mrg
1479 1.1 mrg if (ptr || ptr2)
1480 1.1 mrg fprintf (f, "\npath_oracle:\n");
1481 1.1 mrg
1482 1.1 mrg for (; ptr; ptr = ptr->m_next)
1483 1.1 mrg ptr->dump (f);
1484 1.1 mrg
1485 1.1 mrg for (; ptr2; ptr2 = ptr2->m_next)
1486 1.1 mrg {
1487 1.1 mrg fprintf (f, "Relational : ");
1488 1.1 mrg ptr2->dump (f);
1489 1.1 mrg fprintf (f, "\n");
1490 1.1 mrg }
1491 1.1 mrg }
1492