Branch data Line data Source code
1 : : /* Control flow graph analysis code for GNU compiler.
2 : : Copyright (C) 1987-2025 Free Software Foundation, Inc.
3 : :
4 : : This file is part of GCC.
5 : :
6 : : GCC is free software; you can redistribute it and/or modify it under
7 : : the terms of the GNU General Public License as published by the Free
8 : : Software Foundation; either version 3, or (at your option) any later
9 : : version.
10 : :
11 : : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 : : WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 : : FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 : : for more details.
15 : :
16 : : You should have received a copy of the GNU General Public License
17 : : along with GCC; see the file COPYING3. If not see
18 : : <http://www.gnu.org/licenses/>. */
19 : :
20 : : /* This file contains various simple utilities to analyze the CFG. */
21 : :
22 : : #include "config.h"
23 : : #include "system.h"
24 : : #include "coretypes.h"
25 : : #include "backend.h"
26 : : #include "cfghooks.h"
27 : : #include "timevar.h"
28 : : #include "cfganal.h"
29 : : #include "cfgloop.h"
30 : : #include "diagnostic.h"
31 : :
32 : : namespace {
33 : : /* Store the data structures necessary for depth-first search. */
34 : : class depth_first_search
35 : : {
36 : : public:
37 : : depth_first_search ();
38 : :
39 : : basic_block execute (basic_block);
40 : : void add_bb (basic_block);
41 : :
42 : : private:
43 : : /* stack for backtracking during the algorithm */
44 : : auto_vec<basic_block, 20> m_stack;
45 : :
46 : : /* record of basic blocks already seen by depth-first search */
47 : : auto_sbitmap m_visited_blocks;
48 : : };
49 : : }
50 : :
51 : : /* Mark the back edges in DFS traversal.
52 : : Return nonzero if a loop (natural or otherwise) is present.
53 : : Inspired by Depth_First_Search_PP described in:
54 : :
55 : : Advanced Compiler Design and Implementation
56 : : Steven Muchnick
57 : : Morgan Kaufmann, 1997
58 : :
59 : : and heavily borrowed from pre_and_rev_post_order_compute. */
60 : :
61 : : bool
62 : 32669958 : mark_dfs_back_edges (struct function *fun)
63 : : {
64 : 32669958 : int *pre;
65 : 32669958 : int *post;
66 : 32669958 : int prenum = 1;
67 : 32669958 : int postnum = 1;
68 : 32669958 : bool found = false;
69 : :
70 : : /* Allocate the preorder and postorder number arrays. */
71 : 32669958 : pre = XCNEWVEC (int, last_basic_block_for_fn (fun));
72 : 32669958 : post = XCNEWVEC (int, last_basic_block_for_fn (fun));
73 : :
74 : : /* Allocate stack for back-tracking up CFG. */
75 : 32669958 : auto_vec<edge_iterator, 20> stack (n_basic_blocks_for_fn (fun) + 1);
76 : :
77 : : /* Allocate bitmap to track nodes that have been visited. */
78 : 32669958 : auto_sbitmap visited (last_basic_block_for_fn (fun));
79 : :
80 : : /* None of the nodes in the CFG have been visited yet. */
81 : 32669958 : bitmap_clear (visited);
82 : :
83 : : /* Push the first edge on to the stack. */
84 : 32669958 : stack.quick_push (ei_start (ENTRY_BLOCK_PTR_FOR_FN (fun)->succs));
85 : :
86 : 896163723 : while (!stack.is_empty ())
87 : : {
88 : 863493765 : basic_block src;
89 : 863493765 : basic_block dest;
90 : :
91 : : /* Look at the edge on the top of the stack. */
92 : 863493765 : edge_iterator ei = stack.last ();
93 : 863493765 : src = ei_edge (ei)->src;
94 : 863493765 : dest = ei_edge (ei)->dest;
95 : 863493765 : ei_edge (ei)->flags &= ~EDGE_DFS_BACK;
96 : :
97 : : /* Check if the edge destination has been visited yet. */
98 : 828896769 : if (dest != EXIT_BLOCK_PTR_FOR_FN (fun) && ! bitmap_bit_p (visited,
99 : : dest->index))
100 : : {
101 : : /* Mark that we have visited the destination. */
102 : 347531587 : bitmap_set_bit (visited, dest->index);
103 : :
104 : 347531587 : pre[dest->index] = prenum++;
105 : 347531587 : if (EDGE_COUNT (dest->succs) > 0)
106 : : {
107 : : /* Since the DEST node has been visited for the first
108 : : time, check its successors. */
109 : 328914473 : stack.quick_push (ei_start (dest->succs));
110 : : }
111 : : else
112 : 18617114 : post[dest->index] = postnum++;
113 : : }
114 : : else
115 : : {
116 : 515962178 : if (dest != EXIT_BLOCK_PTR_FOR_FN (fun)
117 : 481365182 : && src != ENTRY_BLOCK_PTR_FOR_FN (fun)
118 : 448695224 : && pre[src->index] >= pre[dest->index]
119 : 110033775 : && post[dest->index] == 0)
120 : 18794495 : ei_edge (ei)->flags |= EDGE_DFS_BACK, found = true;
121 : :
122 : 515962178 : if (ei_one_before_end_p (ei)
123 : 515962178 : && src != ENTRY_BLOCK_PTR_FOR_FN (fun))
124 : 328914473 : post[src->index] = postnum++;
125 : :
126 : 515962178 : if (!ei_one_before_end_p (ei))
127 : 154377747 : ei_next (&stack.last ());
128 : : else
129 : 361584431 : stack.pop ();
130 : : }
131 : : }
132 : :
133 : 32669958 : free (pre);
134 : 32669958 : free (post);
135 : :
136 : 32669958 : return found;
137 : 32669958 : }
138 : :
139 : : bool
140 : 25337181 : mark_dfs_back_edges (void)
141 : : {
142 : 25337181 : return mark_dfs_back_edges (cfun);
143 : : }
144 : :
145 : : /* Return TRUE if EDGE_DFS_BACK is up to date for CFUN. */
146 : :
147 : : void
148 : 0 : verify_marked_backedges (struct function *fun)
149 : : {
150 : 0 : auto_edge_flag saved_dfs_back (fun);
151 : 0 : basic_block bb;
152 : 0 : edge e;
153 : 0 : edge_iterator ei;
154 : :
155 : : // Save all the back edges...
156 : 0 : FOR_EACH_BB_FN (bb, fun)
157 : 0 : FOR_EACH_EDGE (e, ei, bb->succs)
158 : : {
159 : 0 : if (e->flags & EDGE_DFS_BACK)
160 : : {
161 : 0 : e->flags |= saved_dfs_back;
162 : 0 : e->flags &= ~EDGE_DFS_BACK;
163 : : }
164 : : }
165 : :
166 : : // ...and verify that recalculating them agrees with the saved ones.
167 : 0 : mark_dfs_back_edges ();
168 : 0 : FOR_EACH_BB_FN (bb, fun)
169 : 0 : FOR_EACH_EDGE (e, ei, bb->succs)
170 : : {
171 : 0 : if (((e->flags & EDGE_DFS_BACK) != 0)
172 : 0 : != ((e->flags & saved_dfs_back) != 0))
173 : 0 : internal_error ("%<verify_marked_backedges%> failed");
174 : :
175 : 0 : e->flags &= ~saved_dfs_back;
176 : : }
177 : 0 : }
178 : :
179 : : /* Find unreachable blocks. An unreachable block will have 0 in
180 : : the reachable bit in block->flags. A nonzero value indicates the
181 : : block is reachable. */
182 : :
183 : : void
184 : 71466510 : find_unreachable_blocks (void)
185 : : {
186 : 71466510 : edge e;
187 : 71466510 : edge_iterator ei;
188 : 71466510 : basic_block *tos, *worklist, bb;
189 : :
190 : 71466510 : tos = worklist = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun));
191 : :
192 : : /* Clear all the reachability flags. */
193 : :
194 : 984973690 : FOR_EACH_BB_FN (bb, cfun)
195 : 913507180 : bb->flags &= ~BB_REACHABLE;
196 : :
197 : : /* Add our starting points to the worklist. Almost always there will
198 : : be only one. It isn't inconceivable that we might one day directly
199 : : support Fortran alternate entry points. */
200 : :
201 : 142933020 : FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs)
202 : : {
203 : 71466510 : *tos++ = e->dest;
204 : :
205 : : /* Mark the block reachable. */
206 : 71466510 : e->dest->flags |= BB_REACHABLE;
207 : : }
208 : :
209 : : /* Iterate: find everything reachable from what we've already seen. */
210 : :
211 : 989981413 : while (tos != worklist)
212 : : {
213 : 918514903 : basic_block b = *--tos;
214 : :
215 : 2243120344 : FOR_EACH_EDGE (e, ei, b->succs)
216 : : {
217 : 1324605441 : basic_block dest = e->dest;
218 : :
219 : 1324605441 : if (!(dest->flags & BB_REACHABLE))
220 : : {
221 : 847048393 : *tos++ = dest;
222 : 847048393 : dest->flags |= BB_REACHABLE;
223 : : }
224 : : }
225 : : }
226 : :
227 : 71466510 : free (worklist);
228 : 71466510 : }
229 : :
230 : : /* Verify that there are no unreachable blocks in the current function. */
231 : :
232 : : void
233 : 42764115 : verify_no_unreachable_blocks (void)
234 : : {
235 : 42764115 : find_unreachable_blocks ();
236 : :
237 : 42764115 : basic_block bb;
238 : 563370915 : FOR_EACH_BB_FN (bb, cfun)
239 : 520606800 : gcc_assert ((bb->flags & BB_REACHABLE) != 0);
240 : 42764115 : }
241 : :
242 : :
243 : : /* Functions to access an edge list with a vector representation.
244 : : Enough data is kept such that given an index number, the
245 : : pred and succ that edge represents can be determined, or
246 : : given a pred and a succ, its index number can be returned.
247 : : This allows algorithms which consume a lot of memory to
248 : : represent the normally full matrix of edge (pred,succ) with a
249 : : single indexed vector, edge (EDGE_INDEX (pred, succ)), with no
250 : : wasted space in the client code due to sparse flow graphs. */
251 : :
252 : : /* This functions initializes the edge list. Basically the entire
253 : : flowgraph is processed, and all edges are assigned a number,
254 : : and the data structure is filled in. */
255 : :
256 : : struct edge_list *
257 : 480695 : create_edge_list (void)
258 : : {
259 : 480695 : struct edge_list *elist;
260 : 480695 : edge e;
261 : 480695 : int num_edges;
262 : 480695 : basic_block bb;
263 : 480695 : edge_iterator ei;
264 : :
265 : : /* Determine the number of edges in the flow graph by counting successor
266 : : edges on each basic block. */
267 : 480695 : num_edges = 0;
268 : 10096393 : FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
269 : : EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
270 : : {
271 : 19230793 : num_edges += EDGE_COUNT (bb->succs);
272 : : }
273 : :
274 : 480695 : elist = XNEW (struct edge_list);
275 : 480695 : elist->num_edges = num_edges;
276 : 480695 : elist->index_to_edge = XNEWVEC (edge, num_edges);
277 : :
278 : 480695 : num_edges = 0;
279 : :
280 : : /* Follow successors of blocks, and register these edges. */
281 : 10096393 : FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
282 : : EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
283 : 23995294 : FOR_EACH_EDGE (e, ei, bb->succs)
284 : 14379596 : elist->index_to_edge[num_edges++] = e;
285 : :
286 : 480695 : return elist;
287 : : }
288 : :
289 : : /* This function free's memory associated with an edge list. */
290 : :
291 : : void
292 : 480695 : free_edge_list (struct edge_list *elist)
293 : : {
294 : 480695 : if (elist)
295 : : {
296 : 480695 : free (elist->index_to_edge);
297 : 480695 : free (elist);
298 : : }
299 : 480695 : }
300 : :
301 : : /* This function provides debug output showing an edge list. */
302 : :
303 : : DEBUG_FUNCTION void
304 : 0 : print_edge_list (FILE *f, struct edge_list *elist)
305 : : {
306 : 0 : int x;
307 : :
308 : 0 : fprintf (f, "Compressed edge list, %d BBs + entry & exit, and %d edges\n",
309 : 0 : n_basic_blocks_for_fn (cfun), elist->num_edges);
310 : :
311 : 0 : for (x = 0; x < elist->num_edges; x++)
312 : : {
313 : 0 : fprintf (f, " %-4d - edge(", x);
314 : 0 : if (INDEX_EDGE_PRED_BB (elist, x) == ENTRY_BLOCK_PTR_FOR_FN (cfun))
315 : 0 : fprintf (f, "entry,");
316 : : else
317 : 0 : fprintf (f, "%d,", INDEX_EDGE_PRED_BB (elist, x)->index);
318 : :
319 : 0 : if (INDEX_EDGE_SUCC_BB (elist, x) == EXIT_BLOCK_PTR_FOR_FN (cfun))
320 : 0 : fprintf (f, "exit)\n");
321 : : else
322 : 0 : fprintf (f, "%d)\n", INDEX_EDGE_SUCC_BB (elist, x)->index);
323 : : }
324 : 0 : }
325 : :
326 : : /* This function provides an internal consistency check of an edge list,
327 : : verifying that all edges are present, and that there are no
328 : : extra edges. */
329 : :
330 : : DEBUG_FUNCTION void
331 : 0 : verify_edge_list (FILE *f, struct edge_list *elist)
332 : : {
333 : 0 : int pred, succ, index;
334 : 0 : edge e;
335 : 0 : basic_block bb, p, s;
336 : 0 : edge_iterator ei;
337 : :
338 : 0 : FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
339 : : EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
340 : : {
341 : 0 : FOR_EACH_EDGE (e, ei, bb->succs)
342 : : {
343 : 0 : pred = e->src->index;
344 : 0 : succ = e->dest->index;
345 : 0 : index = EDGE_INDEX (elist, e->src, e->dest);
346 : 0 : if (index == EDGE_INDEX_NO_EDGE)
347 : : {
348 : 0 : fprintf (f, "*p* No index for edge from %d to %d\n", pred, succ);
349 : 0 : continue;
350 : : }
351 : :
352 : 0 : if (INDEX_EDGE_PRED_BB (elist, index)->index != pred)
353 : 0 : fprintf (f, "*p* Pred for index %d should be %d not %d\n",
354 : : index, pred, INDEX_EDGE_PRED_BB (elist, index)->index);
355 : 0 : if (INDEX_EDGE_SUCC_BB (elist, index)->index != succ)
356 : 0 : fprintf (f, "*p* Succ for index %d should be %d not %d\n",
357 : : index, succ, INDEX_EDGE_SUCC_BB (elist, index)->index);
358 : : }
359 : : }
360 : :
361 : : /* We've verified that all the edges are in the list, now lets make sure
362 : : there are no spurious edges in the list. This is an expensive check! */
363 : :
364 : 0 : FOR_BB_BETWEEN (p, ENTRY_BLOCK_PTR_FOR_FN (cfun),
365 : : EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
366 : 0 : FOR_BB_BETWEEN (s, ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb, NULL, next_bb)
367 : : {
368 : 0 : int found_edge = 0;
369 : :
370 : 0 : FOR_EACH_EDGE (e, ei, p->succs)
371 : 0 : if (e->dest == s)
372 : : {
373 : : found_edge = 1;
374 : : break;
375 : : }
376 : :
377 : 0 : FOR_EACH_EDGE (e, ei, s->preds)
378 : 0 : if (e->src == p)
379 : : {
380 : : found_edge = 1;
381 : : break;
382 : : }
383 : :
384 : 0 : if (EDGE_INDEX (elist, p, s)
385 : 0 : == EDGE_INDEX_NO_EDGE && found_edge != 0)
386 : 0 : fprintf (f, "*** Edge (%d, %d) appears to not have an index\n",
387 : : p->index, s->index);
388 : 0 : if (EDGE_INDEX (elist, p, s)
389 : 0 : != EDGE_INDEX_NO_EDGE && found_edge == 0)
390 : 0 : fprintf (f, "*** Edge (%d, %d) has index %d, but there is no edge\n",
391 : : p->index, s->index, EDGE_INDEX (elist, p, s));
392 : : }
393 : 0 : }
394 : :
395 : :
396 : : /* Functions to compute control dependences. */
397 : :
398 : : /* Indicate block BB is control dependent on an edge with index EDGE_INDEX. */
399 : : void
400 : 44900970 : control_dependences::set_control_dependence_map_bit (basic_block bb,
401 : : int edge_index)
402 : : {
403 : 44900970 : if (bb == ENTRY_BLOCK_PTR_FOR_FN (cfun))
404 : : return;
405 : 44900970 : gcc_assert (bb != EXIT_BLOCK_PTR_FOR_FN (cfun));
406 : 44900970 : bitmap_set_bit (&control_dependence_map[bb->index], edge_index);
407 : : }
408 : :
409 : : /* Clear all control dependences for block BB. */
410 : : void
411 : 0 : control_dependences::clear_control_dependence_bitmap (basic_block bb)
412 : : {
413 : 0 : bitmap_clear (&control_dependence_map[bb->index]);
414 : 0 : }
415 : :
416 : : /* Determine all blocks' control dependences on the given edge with edge_list
417 : : EL index EDGE_INDEX, ala Morgan, Section 3.6. */
418 : :
419 : : void
420 : 46184069 : control_dependences::find_control_dependence (int edge_index)
421 : : {
422 : 46184069 : basic_block current_block;
423 : 46184069 : basic_block ending_block;
424 : :
425 : 46184069 : gcc_assert (get_edge_src (edge_index) != EXIT_BLOCK_PTR_FOR_FN (cfun));
426 : :
427 : 46184069 : ending_block = get_immediate_dominator (CDI_POST_DOMINATORS,
428 : : get_edge_src (edge_index));
429 : :
430 : 46184069 : for (current_block = get_edge_dest (edge_index);
431 : : current_block != ending_block
432 : 91085039 : && current_block != EXIT_BLOCK_PTR_FOR_FN (cfun);
433 : 44900970 : current_block = get_immediate_dominator (CDI_POST_DOMINATORS,
434 : : current_block))
435 : 44900970 : set_control_dependence_map_bit (current_block, edge_index);
436 : 46184069 : }
437 : :
438 : : /* Record all blocks' control dependences on all edges in the edge
439 : : list EL, ala Morgan, Section 3.6. */
440 : :
441 : 3413976 : control_dependences::control_dependences ()
442 : : {
443 : 3413976 : timevar_push (TV_CONTROL_DEPENDENCES);
444 : :
445 : : /* Initialize the edge list. */
446 : 3413976 : int num_edges = 0;
447 : 3413976 : basic_block bb;
448 : 37482736 : FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
449 : : EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
450 : 67312942 : num_edges += EDGE_COUNT (bb->succs);
451 : 3413976 : m_el.create (num_edges);
452 : 3413976 : edge e;
453 : 3413976 : edge_iterator ei;
454 : 37482736 : FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
455 : : EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
456 : 80266041 : FOR_EACH_EDGE (e, ei, bb->succs)
457 : : {
458 : : /* For abnormal edges, we don't make current_block control
459 : : dependent because instructions that throw are always necessary
460 : : anyway. */
461 : 46197281 : if (e->flags & EDGE_ABNORMAL)
462 : : {
463 : 13212 : num_edges--;
464 : 13212 : continue;
465 : : }
466 : 46184069 : m_el.quick_push (std::make_pair (e->src->index, e->dest->index));
467 : : }
468 : :
469 : 3413976 : bitmap_obstack_initialize (&m_bitmaps);
470 : 3413976 : control_dependence_map.create (last_basic_block_for_fn (cfun));
471 : 3413976 : control_dependence_map.quick_grow_cleared (last_basic_block_for_fn (cfun));
472 : 41825229 : for (int i = 0; i < last_basic_block_for_fn (cfun); ++i)
473 : 38411253 : bitmap_initialize (&control_dependence_map[i], &m_bitmaps);
474 : 49598045 : for (int i = 0; i < num_edges; ++i)
475 : 46184069 : find_control_dependence (i);
476 : :
477 : 3413976 : timevar_pop (TV_CONTROL_DEPENDENCES);
478 : 3413976 : }
479 : :
480 : : /* Free control dependences and the associated edge list. */
481 : :
482 : 3413976 : control_dependences::~control_dependences ()
483 : : {
484 : 3413976 : control_dependence_map.release ();
485 : 3413976 : m_el.release ();
486 : 3413976 : bitmap_obstack_release (&m_bitmaps);
487 : 3413976 : }
488 : :
489 : : /* Returns the bitmap of edges the basic-block I is dependent on. */
490 : :
491 : : bitmap
492 : 28842215 : control_dependences::get_edges_dependent_on (int i)
493 : : {
494 : 28842215 : return &control_dependence_map[i];
495 : : }
496 : :
497 : : /* Returns the edge source with index I from the edge list. */
498 : :
499 : : basic_block
500 : 135750014 : control_dependences::get_edge_src (int i)
501 : : {
502 : 135750014 : return BASIC_BLOCK_FOR_FN (cfun, m_el[i].first);
503 : : }
504 : :
505 : : /* Returns the edge destination with index I from the edge list. */
506 : :
507 : : basic_block
508 : 46184069 : control_dependences::get_edge_dest (int i)
509 : : {
510 : 46184069 : return BASIC_BLOCK_FOR_FN (cfun, m_el[i].second);
511 : : }
512 : :
513 : :
514 : : /* Given PRED and SUCC blocks, return the edge which connects the blocks.
515 : : If no such edge exists, return NULL. */
516 : :
517 : : edge
518 : 736227685 : find_edge (basic_block pred, basic_block succ)
519 : : {
520 : 736227685 : edge e;
521 : 736227685 : edge_iterator ei;
522 : :
523 : 2035763088 : if (EDGE_COUNT (pred->succs) <= EDGE_COUNT (succ->preds))
524 : : {
525 : 770901775 : FOR_EACH_EDGE (e, ei, pred->succs)
526 : 594665085 : if (e->dest == succ)
527 : : return e;
528 : : }
529 : : else
530 : : {
531 : 198555316 : FOR_EACH_EDGE (e, ei, succ->preds)
532 : 121504605 : if (e->src == pred)
533 : : return e;
534 : : }
535 : :
536 : : return NULL;
537 : : }
538 : :
539 : : /* This routine will determine what, if any, edge there is between
540 : : a specified predecessor and successor. */
541 : :
542 : : int
543 : 50 : find_edge_index (struct edge_list *edge_list, basic_block pred, basic_block succ)
544 : : {
545 : 50 : int x;
546 : :
547 : 394 : for (x = 0; x < NUM_EDGES (edge_list); x++)
548 : 394 : if (INDEX_EDGE_PRED_BB (edge_list, x) == pred
549 : 80 : && INDEX_EDGE_SUCC_BB (edge_list, x) == succ)
550 : : return x;
551 : :
552 : : return (EDGE_INDEX_NO_EDGE);
553 : : }
554 : :
555 : : /* This routine will remove any fake predecessor edges for a basic block.
556 : : When the edge is removed, it is also removed from whatever successor
557 : : list it is in. */
558 : :
559 : : static void
560 : 6715999 : remove_fake_predecessors (basic_block bb)
561 : : {
562 : 6715999 : edge e;
563 : 6715999 : edge_iterator ei;
564 : :
565 : 17297162 : for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); )
566 : : {
567 : 10581163 : if ((e->flags & EDGE_FAKE) == EDGE_FAKE)
568 : 3851604 : remove_edge (e);
569 : : else
570 : 6729559 : ei_next (&ei);
571 : : }
572 : 6715999 : }
573 : :
574 : : /* This routine will remove all fake edges from the flow graph. If
575 : : we remove all fake successors, it will automatically remove all
576 : : fake predecessors. */
577 : :
578 : : void
579 : 2226 : remove_fake_edges (void)
580 : : {
581 : 2226 : basic_block bb;
582 : :
583 : 16236 : FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb, NULL, next_bb)
584 : 14010 : remove_fake_predecessors (bb);
585 : 2226 : }
586 : :
587 : : /* This routine will remove all fake edges to the EXIT_BLOCK. */
588 : :
589 : : void
590 : 6701989 : remove_fake_exit_edges (void)
591 : : {
592 : 6701989 : remove_fake_predecessors (EXIT_BLOCK_PTR_FOR_FN (cfun));
593 : 6701989 : }
594 : :
595 : :
596 : : /* This function will add a fake edge between any block which has no
597 : : successors, and the exit block. Some data flow equations require these
598 : : edges to exist. */
599 : :
600 : : void
601 : 6704215 : add_noreturn_fake_exit_edges (void)
602 : : {
603 : 6704215 : basic_block bb;
604 : :
605 : 78020197 : FOR_EACH_BB_FN (bb, cfun)
606 : 71315982 : if (EDGE_COUNT (bb->succs) == 0)
607 : 3870701 : make_single_succ_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), EDGE_FAKE);
608 : 6704215 : }
609 : :
610 : : /* This function adds a fake edge between any noreturn block and
611 : : infinite loops to the exit block. Some optimizations require a path
612 : : from each node to the exit node.
613 : :
614 : : See also Morgan, Figure 3.10, pp. 82-83.
615 : :
616 : : The current implementation is ugly, not attempting to minimize the
617 : : number of inserted fake edges. To reduce the number of fake edges
618 : : to insert, add fake edges from _innermost_ loops containing only
619 : : nodes not reachable from the exit block. */
620 : :
621 : : void
622 : 5306233 : connect_infinite_loops_to_exit (void)
623 : : {
624 : : /* First add fake exits to noreturn blocks, this is required to
625 : : discover only truly infinite loops below. */
626 : 5306233 : add_noreturn_fake_exit_edges ();
627 : :
628 : : /* Perform depth-first search in the reverse graph to find nodes
629 : : reachable from the exit block. */
630 : 5306233 : depth_first_search dfs;
631 : 5306233 : dfs.add_bb (EXIT_BLOCK_PTR_FOR_FN (cfun));
632 : :
633 : : /* Repeatedly add fake edges, updating the unreachable nodes. */
634 : 5306233 : basic_block unvisited_block = EXIT_BLOCK_PTR_FOR_FN (cfun);
635 : 5355097 : while (1)
636 : : {
637 : 5330665 : unvisited_block = dfs.execute (unvisited_block);
638 : 5330665 : if (!unvisited_block)
639 : : break;
640 : :
641 : 24432 : basic_block deadend_block = dfs_find_deadend (unvisited_block);
642 : 24432 : edge e = make_edge (deadend_block, EXIT_BLOCK_PTR_FOR_FN (cfun),
643 : : EDGE_FAKE);
644 : 24432 : e->probability = profile_probability::never ();
645 : 24432 : dfs.add_bb (deadend_block);
646 : 24432 : }
647 : 5306233 : }
648 : :
649 : : /* Compute reverse top sort order. This is computing a post order
650 : : numbering of the graph. If INCLUDE_ENTRY_EXIT is true, then
651 : : ENTRY_BLOCK and EXIT_BLOCK are included. If DELETE_UNREACHABLE is
652 : : true, unreachable blocks are deleted. */
653 : :
654 : : int
655 : 38945956 : post_order_compute (int *post_order, bool include_entry_exit,
656 : : bool delete_unreachable)
657 : : {
658 : 38945956 : int post_order_num = 0;
659 : 38945956 : int count;
660 : :
661 : 38945956 : if (include_entry_exit)
662 : 37805746 : post_order[post_order_num++] = EXIT_BLOCK;
663 : :
664 : : /* Allocate stack for back-tracking up CFG. */
665 : 38945956 : auto_vec<edge_iterator, 20> stack (n_basic_blocks_for_fn (cfun) + 1);
666 : :
667 : : /* Allocate bitmap to track nodes that have been visited. */
668 : 38945956 : auto_sbitmap visited (last_basic_block_for_fn (cfun));
669 : :
670 : : /* None of the nodes in the CFG have been visited yet. */
671 : 38945956 : bitmap_clear (visited);
672 : :
673 : : /* Push the first edge on to the stack. */
674 : 38945956 : stack.quick_push (ei_start (ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs));
675 : :
676 : 1209503919 : while (!stack.is_empty ())
677 : : {
678 : 1170557963 : basic_block src;
679 : 1170557963 : basic_block dest;
680 : :
681 : : /* Look at the edge on the top of the stack. */
682 : 1170557963 : edge_iterator ei = stack.last ();
683 : 1170557963 : src = ei_edge (ei)->src;
684 : 1170557963 : dest = ei_edge (ei)->dest;
685 : :
686 : : /* Check if the edge destination has been visited yet. */
687 : 1170557963 : if (dest != EXIT_BLOCK_PTR_FOR_FN (cfun)
688 : 1170557963 : && ! bitmap_bit_p (visited, dest->index))
689 : : {
690 : : /* Mark that we have visited the destination. */
691 : 459507002 : bitmap_set_bit (visited, dest->index);
692 : :
693 : 459507002 : if (EDGE_COUNT (dest->succs) > 0)
694 : : /* Since the DEST node has been visited for the first
695 : : time, check its successors. */
696 : 437670112 : stack.quick_push (ei_start (dest->succs));
697 : : else
698 : 21836890 : post_order[post_order_num++] = dest->index;
699 : : }
700 : : else
701 : : {
702 : 711050961 : if (ei_one_before_end_p (ei)
703 : 711050961 : && src != ENTRY_BLOCK_PTR_FOR_FN (cfun))
704 : 437670112 : post_order[post_order_num++] = src->index;
705 : :
706 : 711050961 : if (!ei_one_before_end_p (ei))
707 : 234434893 : ei_next (&stack.last ());
708 : : else
709 : 476616068 : stack.pop ();
710 : : }
711 : : }
712 : :
713 : 38945956 : if (include_entry_exit)
714 : : {
715 : 37805746 : post_order[post_order_num++] = ENTRY_BLOCK;
716 : 37805746 : count = post_order_num;
717 : : }
718 : : else
719 : 1140210 : count = post_order_num + 2;
720 : :
721 : : /* Delete the unreachable blocks if some were found and we are
722 : : supposed to do it. */
723 : 38945956 : if (delete_unreachable && (count != n_basic_blocks_for_fn (cfun)))
724 : : {
725 : 12554 : basic_block b;
726 : 12554 : basic_block next_bb;
727 : 12554 : for (b = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb; b
728 : 2190025 : != EXIT_BLOCK_PTR_FOR_FN (cfun); b = next_bb)
729 : : {
730 : 2177471 : next_bb = b->next_bb;
731 : :
732 : 2177471 : if (!(bitmap_bit_p (visited, b->index)))
733 : 26326 : delete_basic_block (b);
734 : : }
735 : :
736 : 12554 : tidy_fallthru_edges ();
737 : : }
738 : :
739 : 38945956 : return post_order_num;
740 : 38945956 : }
741 : :
742 : :
743 : : /* Helper routine for inverted_rev_post_order_compute
744 : : flow_dfs_compute_reverse_execute, and the reverse-CFG
745 : : deapth first search in dominance.cc.
746 : : BB has to belong to a region of CFG
747 : : unreachable by inverted traversal from the exit.
748 : : i.e. there's no control flow path from ENTRY to EXIT
749 : : that contains this BB.
750 : : This can happen in two cases - if there's an infinite loop
751 : : or if there's a block that has no successor
752 : : (call to a function with no return).
753 : : Some RTL passes deal with this condition by
754 : : calling connect_infinite_loops_to_exit () and/or
755 : : add_noreturn_fake_exit_edges ().
756 : : However, those methods involve modifying the CFG itself
757 : : which may not be desirable.
758 : : Hence, we deal with the infinite loop/no return cases
759 : : by identifying a unique basic block that can reach all blocks
760 : : in such a region by inverted traversal.
761 : : This function returns a basic block that guarantees
762 : : that all blocks in the region are reachable
763 : : by starting an inverted traversal from the returned block. */
764 : :
765 : : basic_block
766 : 416045 : dfs_find_deadend (basic_block bb)
767 : : {
768 : 416045 : auto_bitmap visited;
769 : 416045 : basic_block next = bb;
770 : :
771 : 1473486 : for (;;)
772 : : {
773 : 1889531 : if (EDGE_COUNT (next->succs) == 0)
774 : : return next;
775 : :
776 : 1473486 : if (! bitmap_set_bit (visited, next->index))
777 : : return bb;
778 : :
779 : 1057441 : bb = next;
780 : : /* If we are in an analyzed cycle make sure to try exiting it.
781 : : Note this is a heuristic only and expected to work when loop
782 : : fixup is needed as well. */
783 : 1057441 : if (! bb->loop_father
784 : 1057441 : || ! loop_outer (bb->loop_father))
785 : 708763 : next = EDGE_SUCC (bb, 0)->dest;
786 : : else
787 : : {
788 : 348678 : edge_iterator ei;
789 : 348678 : edge e;
790 : 724893 : FOR_EACH_EDGE (e, ei, bb->succs)
791 : 418181 : if (loop_exit_edge_p (bb->loop_father, e))
792 : : break;
793 : 348678 : next = e ? e->dest : EDGE_SUCC (bb, 0)->dest;
794 : : }
795 : : }
796 : 416045 : }
797 : :
798 : :
799 : : /* Compute the reverse top sort order of the inverted CFG
800 : : i.e. starting from the exit block and following the edges backward
801 : : (from successors to predecessors).
802 : : This ordering can be used for forward dataflow problems among others.
803 : :
804 : : Optionally if START_POINTS is specified, start from exit block and all
805 : : basic blocks in START_POINTS. This is used by CD-DCE.
806 : :
807 : : This function assumes that all blocks in the CFG are reachable
808 : : from the ENTRY (but not necessarily from EXIT).
809 : :
810 : : If there's an infinite loop,
811 : : a simple inverted traversal starting from the blocks
812 : : with no successors can't visit all blocks.
813 : : To solve this problem, we first do inverted traversal
814 : : starting from the blocks with no successor.
815 : : And if there's any block left that's not visited by the regular
816 : : inverted traversal from EXIT,
817 : : those blocks are in such problematic region.
818 : : Among those, we find one block that has
819 : : any visited predecessor (which is an entry into such a region),
820 : : and start looking for a "dead end" from that block
821 : : and do another inverted traversal from that block. */
822 : :
823 : : int
824 : 42764805 : inverted_rev_post_order_compute (struct function *fn,
825 : : int *rev_post_order,
826 : : sbitmap *start_points)
827 : : {
828 : 42764805 : basic_block bb;
829 : :
830 : 42764805 : int rev_post_order_num = n_basic_blocks_for_fn (fn) - 1;
831 : :
832 : 42764805 : if (flag_checking)
833 : 42764115 : verify_no_unreachable_blocks ();
834 : :
835 : : /* Allocate stack for back-tracking up CFG. */
836 : 42764805 : auto_vec<edge_iterator, 20> stack (n_basic_blocks_for_fn (cfun) + 1);
837 : :
838 : : /* Allocate bitmap to track nodes that have been visited. */
839 : 42764805 : auto_sbitmap visited (last_basic_block_for_fn (cfun));
840 : :
841 : : /* None of the nodes in the CFG have been visited yet. */
842 : 42764805 : bitmap_clear (visited);
843 : :
844 : 42764805 : if (start_points)
845 : : {
846 : 697133 : FOR_ALL_BB_FN (bb, cfun)
847 : 678477 : if (bitmap_bit_p (*start_points, bb->index)
848 : 1151825 : && EDGE_COUNT (bb->preds) > 0)
849 : : {
850 : 473348 : stack.quick_push (ei_start (bb->preds));
851 : 473348 : bitmap_set_bit (visited, bb->index);
852 : : }
853 : 18656 : if (EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds))
854 : : {
855 : 17369 : stack.quick_push (ei_start (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds));
856 : 17369 : bitmap_set_bit (visited, EXIT_BLOCK_PTR_FOR_FN (cfun)->index);
857 : : }
858 : : }
859 : : else
860 : : /* Put all blocks that have no successor into the initial work list. */
861 : 648207016 : FOR_ALL_BB_FN (bb, cfun)
862 : 605460867 : if (EDGE_COUNT (bb->succs) == 0)
863 : : {
864 : : /* Push the initial edge on to the stack. */
865 : 668933425 : if (EDGE_COUNT (bb->preds) > 0)
866 : : {
867 : 63472558 : stack.quick_push (ei_start (bb->preds));
868 : 63472558 : bitmap_set_bit (visited, bb->index);
869 : : }
870 : : }
871 : :
872 : 43071598 : do
873 : : {
874 : 43071598 : bool has_unvisited_bb = false;
875 : :
876 : : /* The inverted traversal loop. */
877 : 1385931138 : while (!stack.is_empty ())
878 : : {
879 : 1342859540 : edge_iterator ei;
880 : 1342859540 : basic_block pred;
881 : :
882 : : /* Look at the edge on the top of the stack. */
883 : 1342859540 : ei = stack.last ();
884 : 1342859540 : bb = ei_edge (ei)->dest;
885 : 1342859540 : pred = ei_edge (ei)->src;
886 : :
887 : : /* Check if the predecessor has been visited yet. */
888 : 1342859540 : if (! bitmap_bit_p (visited, pred->index))
889 : : {
890 : : /* Mark that we have visited the destination. */
891 : 540964143 : bitmap_set_bit (visited, pred->index);
892 : :
893 : 540964143 : if (EDGE_COUNT (pred->preds) > 0)
894 : : /* Since the predecessor node has been visited for the first
895 : : time, check its predecessors. */
896 : 498199338 : stack.quick_push (ei_start (pred->preds));
897 : : else
898 : 42764805 : rev_post_order[rev_post_order_num--] = pred->index;
899 : : }
900 : : else
901 : : {
902 : 801895397 : if (bb != EXIT_BLOCK_PTR_FOR_FN (cfun)
903 : 801895397 : && ei_one_before_end_p (ei))
904 : 520609734 : rev_post_order[rev_post_order_num--] = bb->index;
905 : :
906 : 801895397 : if (!ei_one_before_end_p (ei))
907 : 239425991 : ei_next (&stack.last ());
908 : : else
909 : 562469406 : stack.pop ();
910 : : }
911 : : }
912 : :
913 : : /* Detect any infinite loop and activate the kludge.
914 : : Note that this doesn't check EXIT_BLOCK itself
915 : : since EXIT_BLOCK is always added after the outer do-while loop. */
916 : 610544485 : FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
917 : : EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
918 : 567698029 : if (!bitmap_bit_p (visited, bb->index))
919 : : {
920 : 808520 : has_unvisited_bb = true;
921 : :
922 : 568281407 : if (EDGE_COUNT (bb->preds) > 0)
923 : : {
924 : 726869 : edge_iterator ei;
925 : 726869 : edge e;
926 : 726869 : basic_block visited_pred = NULL;
927 : :
928 : : /* Find an already visited predecessor. */
929 : 1805306 : FOR_EACH_EDGE (e, ei, bb->preds)
930 : : {
931 : 1078437 : if (bitmap_bit_p (visited, e->src->index))
932 : 244423 : visited_pred = e->src;
933 : : }
934 : :
935 : 726869 : if (visited_pred)
936 : : {
937 : 225142 : basic_block be = dfs_find_deadend (bb);
938 : 225142 : gcc_assert (be != NULL);
939 : 225142 : bitmap_set_bit (visited, be->index);
940 : 225142 : stack.quick_push (ei_start (be->preds));
941 : 225142 : break;
942 : : }
943 : : }
944 : : }
945 : :
946 : 43071598 : if (has_unvisited_bb && stack.is_empty ())
947 : : {
948 : : /* No blocks are reachable from EXIT at all.
949 : : Find a dead-end from the ENTRY, and restart the iteration. */
950 : 81651 : basic_block be = dfs_find_deadend (ENTRY_BLOCK_PTR_FOR_FN (cfun));
951 : 81651 : gcc_assert (be != NULL);
952 : 81651 : bitmap_set_bit (visited, be->index);
953 : 81651 : stack.quick_push (ei_start (be->preds));
954 : : }
955 : :
956 : : /* The only case the below while fires is
957 : : when there's an infinite loop. */
958 : : }
959 : 86143196 : while (!stack.is_empty ());
960 : :
961 : : /* EXIT_BLOCK is always included. */
962 : 42764805 : rev_post_order[rev_post_order_num--] = EXIT_BLOCK;
963 : 42764805 : return n_basic_blocks_for_fn (fn);
964 : 42764805 : }
965 : :
966 : : /* Compute the depth first search order of FN and store in the array
967 : : PRE_ORDER if nonzero. If REV_POST_ORDER is nonzero, return the
968 : : reverse completion number for each node. Returns the number of nodes
969 : : visited. A depth first search tries to get as far away from the starting
970 : : point as quickly as possible.
971 : :
972 : : In case the function has unreachable blocks the number of nodes
973 : : visited does not include them.
974 : :
975 : : pre_order is a really a preorder numbering of the graph.
976 : : rev_post_order is really a reverse postorder numbering of the graph. */
977 : :
978 : : int
979 : 93778793 : pre_and_rev_post_order_compute_fn (struct function *fn,
980 : : int *pre_order, int *rev_post_order,
981 : : bool include_entry_exit)
982 : : {
983 : 93778793 : int pre_order_num = 0;
984 : 93778793 : int rev_post_order_num = n_basic_blocks_for_fn (fn) - 1;
985 : :
986 : : /* Allocate stack for back-tracking up CFG. */
987 : 93778793 : auto_vec<edge_iterator, 20> stack (n_basic_blocks_for_fn (fn) + 1);
988 : :
989 : 93778793 : if (include_entry_exit)
990 : : {
991 : 34561742 : if (pre_order)
992 : 0 : pre_order[pre_order_num] = ENTRY_BLOCK;
993 : 34561742 : pre_order_num++;
994 : 34561742 : if (rev_post_order)
995 : 34561742 : rev_post_order[rev_post_order_num--] = EXIT_BLOCK;
996 : : }
997 : : else
998 : 59217051 : rev_post_order_num -= NUM_FIXED_BLOCKS;
999 : :
1000 : : /* BB flag to track nodes that have been visited. */
1001 : 93778793 : auto_bb_flag visited (fn);
1002 : :
1003 : : /* Push the first edge on to the stack. */
1004 : 93778793 : stack.quick_push (ei_start (ENTRY_BLOCK_PTR_FOR_FN (fn)->succs));
1005 : :
1006 : 2735412869 : while (!stack.is_empty ())
1007 : : {
1008 : 2641634076 : basic_block src;
1009 : 2641634076 : basic_block dest;
1010 : :
1011 : : /* Look at the edge on the top of the stack. */
1012 : 2641634076 : edge_iterator ei = stack.last ();
1013 : 2641634076 : src = ei_edge (ei)->src;
1014 : 2641634076 : dest = ei_edge (ei)->dest;
1015 : :
1016 : : /* Check if the edge destination has been visited yet. */
1017 : 2641634076 : if (dest != EXIT_BLOCK_PTR_FOR_FN (fn)
1018 : 2641634076 : && ! (dest->flags & visited))
1019 : : {
1020 : : /* Mark that we have visited the destination. */
1021 : 1046188409 : dest->flags |= visited;
1022 : :
1023 : 1046188409 : if (pre_order)
1024 : 0 : pre_order[pre_order_num] = dest->index;
1025 : :
1026 : 1046188409 : pre_order_num++;
1027 : :
1028 : 1046188409 : if (EDGE_COUNT (dest->succs) > 0)
1029 : : /* Since the DEST node has been visited for the first
1030 : : time, check its successors. */
1031 : 981114369 : stack.quick_push (ei_start (dest->succs));
1032 : 65074040 : else if (rev_post_order)
1033 : : /* There are no successors for the DEST node so assign
1034 : : its reverse completion number. */
1035 : 65074040 : rev_post_order[rev_post_order_num--] = dest->index;
1036 : : }
1037 : : else
1038 : : {
1039 : 1595445667 : if (ei_one_before_end_p (ei)
1040 : 1074893162 : && src != ENTRY_BLOCK_PTR_FOR_FN (fn)
1041 : 2576560036 : && rev_post_order)
1042 : : /* There are no more successors for the SRC node
1043 : : so assign its reverse completion number. */
1044 : 981114369 : rev_post_order[rev_post_order_num--] = src->index;
1045 : :
1046 : 1595445667 : if (!ei_one_before_end_p (ei))
1047 : 520552505 : ei_next (&stack.last ());
1048 : : else
1049 : 1074893162 : stack.pop ();
1050 : : }
1051 : : }
1052 : :
1053 : 93778793 : if (include_entry_exit)
1054 : : {
1055 : 34561742 : if (pre_order)
1056 : 0 : pre_order[pre_order_num] = EXIT_BLOCK;
1057 : 34561742 : pre_order_num++;
1058 : 34561742 : if (rev_post_order)
1059 : 34561742 : rev_post_order[rev_post_order_num--] = ENTRY_BLOCK;
1060 : : }
1061 : :
1062 : : /* Clear the temporarily allocated flag. */
1063 : 93778793 : if (!rev_post_order)
1064 : : rev_post_order = pre_order;
1065 : 1209090686 : for (int i = 0; i < pre_order_num; ++i)
1066 : 1115311893 : BASIC_BLOCK_FOR_FN (fn, rev_post_order[i])->flags &= ~visited;
1067 : :
1068 : 93778793 : return pre_order_num;
1069 : 93778793 : }
1070 : :
1071 : : /* Like pre_and_rev_post_order_compute_fn but operating on the
1072 : : current function and asserting that all nodes were visited. */
1073 : :
1074 : : int
1075 : 76825882 : pre_and_rev_post_order_compute (int *pre_order, int *rev_post_order,
1076 : : bool include_entry_exit)
1077 : : {
1078 : 76825882 : int pre_order_num
1079 : 76825882 : = pre_and_rev_post_order_compute_fn (cfun, pre_order, rev_post_order,
1080 : : include_entry_exit);
1081 : 76825882 : if (include_entry_exit)
1082 : : /* The number of nodes visited should be the number of blocks. */
1083 : 34561643 : gcc_assert (pre_order_num == n_basic_blocks_for_fn (cfun));
1084 : : else
1085 : : /* The number of nodes visited should be the number of blocks minus
1086 : : the entry and exit blocks which are not visited here. */
1087 : 42264239 : gcc_assert (pre_order_num
1088 : : == (n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS));
1089 : :
1090 : 76825882 : return pre_order_num;
1091 : : }
1092 : :
1093 : :
1094 : : /* Per basic-block data for rev_post_order_and_mark_dfs_back_seme,
1095 : : element of a sparsely populated array indexed by basic-block number. */
1096 : : typedef auto_vec<int, 2> scc_exit_vec_t;
1097 : : struct rpoamdbs_bb_data {
1098 : : int depth;
1099 : : int bb_to_pre;
1100 : : /* The basic-block index of the SCC entry of the block visited first
1101 : : (the SCC leader). */
1102 : : int scc;
1103 : : /* The index into the RPO array where the blocks SCC entries end
1104 : : (only valid for the SCC leader). */
1105 : : int scc_end;
1106 : : /* The indexes of the exits destinations of this SCC (only valid
1107 : : for the SCC leader). Initialized upon discovery of SCC leaders. */
1108 : : scc_exit_vec_t scc_exits;
1109 : : };
1110 : :
1111 : : /* Tag H as a header of B, weaving H and its loop header list into the
1112 : : current loop header list of B. */
1113 : :
1114 : : static void
1115 : 116386881 : tag_header (int b, int h, rpoamdbs_bb_data *bb_data)
1116 : : {
1117 : 116386881 : if (h == -1 || b == h)
1118 : : return;
1119 : : int cur1 = b;
1120 : : int cur2 = h;
1121 : 30873446 : while (bb_data[cur1].scc != -1)
1122 : : {
1123 : 5702862 : int ih = bb_data[cur1].scc;
1124 : 5702862 : if (ih == cur2)
1125 : : return;
1126 : 826886 : if (bb_data[ih].depth < bb_data[cur2].depth)
1127 : : {
1128 : 316341 : bb_data[cur1].scc = cur2;
1129 : 316341 : cur1 = cur2;
1130 : 316341 : cur2 = ih;
1131 : : }
1132 : : else
1133 : : cur1 = ih;
1134 : : }
1135 : 25170584 : bb_data[cur1].scc = cur2;
1136 : : }
1137 : :
1138 : : /* Comparator for a sort of two edges destinations E1 and E2 after their index
1139 : : in the PRE array as specified by BB_TO_PRE. */
1140 : :
1141 : : static int
1142 : 58238500 : cmp_edge_dest_pre (const void *e1_, const void *e2_, void *data_)
1143 : : {
1144 : 58238500 : const int *e1 = (const int *)e1_;
1145 : 58238500 : const int *e2 = (const int *)e2_;
1146 : 58238500 : rpoamdbs_bb_data *bb_data = (rpoamdbs_bb_data *)data_;
1147 : 58238500 : return (bb_data[*e1].bb_to_pre - bb_data[*e2].bb_to_pre);
1148 : : }
1149 : :
1150 : : /* Compute the reverse completion number of a depth first search
1151 : : on the SEME region denoted by the ENTRY edge and the EXIT_BBS set of
1152 : : exit block indexes and store it in the array REV_POST_ORDER.
1153 : : Also sets the EDGE_DFS_BACK edge flags according to this visitation
1154 : : order.
1155 : : Returns the number of nodes visited.
1156 : :
1157 : : In case the function has unreachable blocks the number of nodes
1158 : : visited does not include them.
1159 : :
1160 : : If FOR_ITERATION is true then compute an RPO where SCCs form a
1161 : : contiguous region in the RPO array.
1162 : : *TOPLEVEL_SCC_EXTENTS if not NULL is filled with pairs of
1163 : : *REV_POST_ORDER indexes denoting extents of the toplevel SCCs in
1164 : : this region. */
1165 : :
1166 : : int
1167 : 12740901 : rev_post_order_and_mark_dfs_back_seme (struct function *fn, edge entry,
1168 : : bitmap exit_bbs, bool for_iteration,
1169 : : int *rev_post_order,
1170 : : vec<std::pair<int, int> >
1171 : : *toplevel_scc_extents)
1172 : : {
1173 : 12740901 : int rev_post_order_num = 0;
1174 : :
1175 : : /* BB flag to track nodes that have been visited. */
1176 : 12740901 : auto_bb_flag visited (fn);
1177 : :
1178 : : /* Lazily initialized per-BB data for the two DFS walks below. */
1179 : 12740901 : rpoamdbs_bb_data *bb_data
1180 : 12740901 : = XNEWVEC (rpoamdbs_bb_data, last_basic_block_for_fn (fn));
1181 : :
1182 : : /* First DFS walk, loop discovery according to
1183 : : A New Algorithm for Identifying Loops in Decompilation
1184 : : by Tao Wei, Jian Mao, Wei Zou and You Chen of the Institute of
1185 : : Computer Science and Technology of the Peking University. */
1186 : 12740901 : auto_vec<edge_iterator, 20> ei_stack (n_basic_blocks_for_fn (fn) + 1);
1187 : 12740901 : auto_bb_flag is_header (fn);
1188 : 12740901 : int depth = 1;
1189 : 12740901 : unsigned n_sccs = 0;
1190 : :
1191 : 12740901 : basic_block dest = entry->dest;
1192 : 12740901 : edge_iterator ei;
1193 : 12740901 : int pre_num = 0;
1194 : :
1195 : : /* DFS process DEST. */
1196 : 116689157 : find_loops:
1197 : 116689157 : bb_data[dest->index].bb_to_pre = pre_num++;
1198 : 116689157 : bb_data[dest->index].depth = depth;
1199 : 116689157 : bb_data[dest->index].scc = -1;
1200 : 116689157 : depth++;
1201 : 116689157 : gcc_assert ((dest->flags & (is_header|visited)) == 0);
1202 : 116689157 : dest->flags |= visited;
1203 : 116689157 : ei = ei_start (dest->succs);
1204 : 278844550 : while (!ei_end_p (ei))
1205 : : {
1206 : 162155393 : ei_edge (ei)->flags &= ~EDGE_DFS_BACK;
1207 : 162155393 : if (bitmap_bit_p (exit_bbs, ei_edge (ei)->dest->index))
1208 : : ;
1209 : 148923474 : else if (!(ei_edge (ei)->dest->flags & visited))
1210 : : {
1211 : 103948256 : ei_stack.quick_push (ei);
1212 : 103948256 : dest = ei_edge (ei)->dest;
1213 : : /* DFS recurse on DEST. */
1214 : 103948256 : goto find_loops;
1215 : :
1216 : 103948256 : ret_from_find_loops:
1217 : : /* Return point of DFS recursion. */
1218 : 207896512 : ei = ei_stack.pop ();
1219 : 103948256 : dest = ei_edge (ei)->src;
1220 : 103948256 : int header = bb_data[ei_edge (ei)->dest->index].scc;
1221 : 103948256 : tag_header (dest->index, header, bb_data);
1222 : 103948256 : depth = bb_data[dest->index].depth + 1;
1223 : : }
1224 : : else
1225 : : {
1226 : 44975218 : if (bb_data[ei_edge (ei)->dest->index].depth > 0) /* on the stack */
1227 : : {
1228 : 6566351 : ei_edge (ei)->flags |= EDGE_DFS_BACK;
1229 : 6566351 : n_sccs++;
1230 : 6566351 : ei_edge (ei)->dest->flags |= is_header;
1231 : 6566351 : ::new (&bb_data[ei_edge (ei)->dest->index].scc_exits)
1232 : 6566351 : auto_vec<int, 2> ();
1233 : 6566351 : tag_header (dest->index, ei_edge (ei)->dest->index, bb_data);
1234 : : }
1235 : 38408867 : else if (bb_data[ei_edge (ei)->dest->index].scc == -1)
1236 : : ;
1237 : : else
1238 : : {
1239 : 5888232 : int header = bb_data[ei_edge (ei)->dest->index].scc;
1240 : 5888232 : if (bb_data[header].depth > 0)
1241 : 5860874 : tag_header (dest->index, header, bb_data);
1242 : : else
1243 : : {
1244 : : /* A re-entry into an existing loop. */
1245 : : /* ??? Need to mark is_header? */
1246 : 37428 : while (bb_data[header].scc != -1)
1247 : : {
1248 : 21470 : header = bb_data[header].scc;
1249 : 21470 : if (bb_data[header].depth > 0)
1250 : : {
1251 : 11400 : tag_header (dest->index, header, bb_data);
1252 : 11400 : break;
1253 : : }
1254 : : }
1255 : : }
1256 : : }
1257 : : }
1258 : 162155393 : ei_next (&ei);
1259 : : }
1260 : 116689157 : rev_post_order[rev_post_order_num++] = dest->index;
1261 : : /* not on the stack anymore */
1262 : 116689157 : bb_data[dest->index].depth = -bb_data[dest->index].depth;
1263 : 116689157 : if (!ei_stack.is_empty ())
1264 : : /* Return from DFS recursion. */
1265 : 103948256 : goto ret_from_find_loops;
1266 : :
1267 : : /* Optimize for no SCCs found or !for_iteration. */
1268 : 12740901 : if (n_sccs == 0 || !for_iteration)
1269 : : {
1270 : : /* Clear the temporarily allocated flags. */
1271 : 82612830 : for (int i = 0; i < rev_post_order_num; ++i)
1272 : 142574530 : BASIC_BLOCK_FOR_FN (fn, rev_post_order[i])->flags
1273 : 71287265 : &= ~(is_header|visited);
1274 : : /* And swap elements. */
1275 : 42193623 : for (int i = 0; i < rev_post_order_num/2; ++i)
1276 : 30868058 : std::swap (rev_post_order[i], rev_post_order[rev_post_order_num-i-1]);
1277 : 11325565 : XDELETEVEC (bb_data);
1278 : :
1279 : 11325565 : return rev_post_order_num;
1280 : : }
1281 : :
1282 : : /* Next find SCC exits, clear the visited flag and compute an upper bound
1283 : : for the edge stack below. */
1284 : : unsigned edge_count = 0;
1285 : 46817228 : for (int i = 0; i < rev_post_order_num; ++i)
1286 : : {
1287 : 45401892 : int bb = rev_post_order[i];
1288 : 45401892 : BASIC_BLOCK_FOR_FN (fn, bb)->flags &= ~visited;
1289 : 45401892 : edge e;
1290 : 110420749 : FOR_EACH_EDGE (e, ei, BASIC_BLOCK_FOR_FN (fn, bb)->succs)
1291 : : {
1292 : 65018857 : if (bitmap_bit_p (exit_bbs, e->dest->index))
1293 : 1505835 : continue;
1294 : 63513022 : edge_count++;
1295 : : /* if e is an exit from e->src, record it for
1296 : : bb_data[e->src].scc. */
1297 : 63513022 : int src_scc = e->src->index;
1298 : 63513022 : if (!(e->src->flags & is_header))
1299 : 56003773 : src_scc = bb_data[src_scc].scc;
1300 : 63513022 : if (src_scc == -1)
1301 : 33504874 : continue;
1302 : 30008148 : int dest_scc = e->dest->index;
1303 : 30008148 : if (!(e->dest->flags & is_header))
1304 : 25093842 : dest_scc = bb_data[dest_scc].scc;
1305 : 30008148 : if (src_scc == dest_scc)
1306 : 21754329 : continue;
1307 : : /* When dest_scc is nested insde src_scc it's not an
1308 : : exit. */
1309 : : int tem_dest_scc = dest_scc;
1310 : : unsigned dest_scc_depth = 0;
1311 : 9992305 : while (tem_dest_scc != -1)
1312 : : {
1313 : 2647210 : dest_scc_depth++;
1314 : 2647210 : if ((tem_dest_scc = bb_data[tem_dest_scc].scc) == src_scc)
1315 : : break;
1316 : : }
1317 : 8253819 : if (tem_dest_scc != -1)
1318 : 908724 : continue;
1319 : : /* When src_scc is nested inside dest_scc record an
1320 : : exit from the outermost SCC this edge exits. */
1321 : : int tem_src_scc = src_scc;
1322 : : unsigned src_scc_depth = 0;
1323 : 8088866 : while (tem_src_scc != -1)
1324 : : {
1325 : 8006360 : if (bb_data[tem_src_scc].scc == dest_scc)
1326 : : {
1327 : 7262589 : edge_count++;
1328 : 7262589 : bb_data[tem_src_scc].scc_exits.safe_push (e->dest->index);
1329 : 7262589 : break;
1330 : : }
1331 : 743771 : tem_src_scc = bb_data[tem_src_scc].scc;
1332 : 743771 : src_scc_depth++;
1333 : : }
1334 : : /* Else find the outermost SCC this edge exits (exits
1335 : : from the inner SCCs are not important for the DFS
1336 : : walk adjustment). Do so by computing the common
1337 : : ancestor SCC where the immediate child it to the source
1338 : : SCC is the exited SCC. */
1339 : 7345095 : if (tem_src_scc == -1)
1340 : : {
1341 : 82506 : edge_count++;
1342 : 83346 : while (src_scc_depth > dest_scc_depth)
1343 : : {
1344 : 840 : src_scc = bb_data[src_scc].scc;
1345 : 840 : src_scc_depth--;
1346 : : }
1347 : 82581 : while (dest_scc_depth > src_scc_depth)
1348 : : {
1349 : 75 : dest_scc = bb_data[dest_scc].scc;
1350 : 75 : dest_scc_depth--;
1351 : : }
1352 : 82508 : while (bb_data[src_scc].scc != bb_data[dest_scc].scc)
1353 : : {
1354 : : src_scc = bb_data[src_scc].scc;
1355 : : dest_scc = bb_data[dest_scc].scc;
1356 : : }
1357 : 82506 : bb_data[src_scc].scc_exits.safe_push (e->dest->index);
1358 : : }
1359 : : }
1360 : : }
1361 : :
1362 : : /* Now the second DFS walk to compute a RPO where the extent of SCCs
1363 : : is minimized thus SCC members are adjacent in the RPO array.
1364 : : This is done by performing a DFS walk computing RPO with first visiting
1365 : : extra direct edges from SCC entry to its exits.
1366 : : That simulates a DFS walk over the graph with SCCs collapsed and
1367 : : walking the SCCs themselves only when all outgoing edges from the
1368 : : SCCs have been visited.
1369 : : SCC_END[scc-header-index] is the position in the RPO array of the
1370 : : last member of the SCC. */
1371 : 2830672 : auto_vec<std::pair<basic_block, basic_block>, 20> estack (edge_count + 1);
1372 : 1415336 : int idx = rev_post_order_num;
1373 : 1415336 : basic_block edest;
1374 : 1415336 : dest = entry->dest;
1375 : :
1376 : : /* DFS process DEST. */
1377 : 45401892 : dfs_rpo:
1378 : 45401892 : gcc_checking_assert ((dest->flags & visited) == 0);
1379 : : /* Verify we enter SCCs through the same header and SCC nesting appears
1380 : : the same. */
1381 : 45401892 : gcc_assert (bb_data[dest->index].scc == -1
1382 : : || (BASIC_BLOCK_FOR_FN (fn, bb_data[dest->index].scc)->flags
1383 : : & visited));
1384 : 45401892 : dest->flags |= visited;
1385 : 45401892 : bb_data[dest->index].scc_end = -1;
1386 : 45401892 : if ((dest->flags & is_header)
1387 : 45401892 : && !bb_data[dest->index].scc_exits.is_empty ())
1388 : : {
1389 : : /* Push the all SCC exits as outgoing edges from its header to
1390 : : be visited first.
1391 : : To process exits in the same relative order as in the first
1392 : : DFS walk sort them after their destination PRE order index. */
1393 : 3739680 : gcc_sort_r (&bb_data[dest->index].scc_exits[0],
1394 : 3739680 : bb_data[dest->index].scc_exits.length (),
1395 : : sizeof (int), cmp_edge_dest_pre, bb_data);
1396 : : /* Process edges in reverse to match previous DFS walk order. */
1397 : 14824455 : for (int i = bb_data[dest->index].scc_exits.length () - 1; i >= 0; --i)
1398 : 14690190 : estack.quick_push (std::make_pair
1399 : 7345095 : (dest, BASIC_BLOCK_FOR_FN (fn, bb_data[dest->index].scc_exits[i])));
1400 : : }
1401 : : else
1402 : : {
1403 : 41662212 : if (dest->flags & is_header)
1404 : 136036 : bb_data[dest->index].scc_end = idx - 1;
1405 : : /* Push the edge vector in reverse to match the iteration order
1406 : : from the DFS walk above. */
1407 : 140380115 : for (int i = EDGE_COUNT (dest->succs) - 1; i >= 0; --i)
1408 : 57653956 : if (!bitmap_bit_p (exit_bbs, EDGE_SUCC (dest, i)->dest->index))
1409 : 56148424 : estack.quick_push (std::make_pair (dest,
1410 : 56148424 : EDGE_SUCC (dest, i)->dest));
1411 : : }
1412 : 114844673 : while (!estack.is_empty ()
1413 : 231104682 : && estack.last ().first == dest)
1414 : : {
1415 : 70858117 : edest = estack.last ().second;
1416 : 70858117 : if (!(edest->flags & visited))
1417 : : {
1418 : 43986556 : dest = edest;
1419 : : /* DFS recurse on DEST. */
1420 : 43986556 : goto dfs_rpo;
1421 : :
1422 : 43986556 : ret_from_dfs_rpo:
1423 : : /* Return point of DFS recursion. */
1424 : 43986556 : dest = estack.last ().first;
1425 : : }
1426 : 70858117 : estack.pop ();
1427 : : /* If we processed all SCC exits from DEST mark the SCC end
1428 : : since all RPO entries up to DEST itself will now belong
1429 : : to its SCC. The special-case of no SCC exits is already
1430 : : dealt with above. */
1431 : 70858117 : if (dest->flags & is_header
1432 : : /* When the last exit edge was processed mark the SCC end
1433 : : and push the regular edges. */
1434 : 14854344 : && bb_data[dest->index].scc_end == -1
1435 : 78200785 : && (estack.is_empty ()
1436 : 7342668 : || estack.last ().first != dest))
1437 : : {
1438 : 3739680 : bb_data[dest->index].scc_end = idx - 1;
1439 : : /* Push the edge vector in reverse to match the iteration order
1440 : : from the DFS walk above. */
1441 : 14844261 : for (int i = EDGE_COUNT (dest->succs) - 1; i >= 0; --i)
1442 : 7364901 : if (!bitmap_bit_p (exit_bbs, EDGE_SUCC (dest, i)->dest->index))
1443 : 7364598 : estack.quick_push (std::make_pair (dest,
1444 : 7364598 : EDGE_SUCC (dest, i)->dest));
1445 : : }
1446 : : }
1447 : 45401892 : rev_post_order[--idx] = dest->index;
1448 : 45401892 : if (!estack.is_empty ())
1449 : : /* Return from DFS recursion. */
1450 : 43986556 : goto ret_from_dfs_rpo;
1451 : :
1452 : : /* Each SCC extends are from the position of the header inside
1453 : : the RPO array up to RPO array index scc_end[header-index]. */
1454 : 1415336 : if (toplevel_scc_extents)
1455 : 8594823 : for (int i = 0; i < rev_post_order_num; i++)
1456 : : {
1457 : 8148410 : basic_block bb = BASIC_BLOCK_FOR_FN (fn, rev_post_order[i]);
1458 : 8148410 : if (bb->flags & is_header)
1459 : : {
1460 : 900879 : toplevel_scc_extents->safe_push
1461 : 900879 : (std::make_pair (i, bb_data[bb->index].scc_end));
1462 : 900879 : i = bb_data[bb->index].scc_end;
1463 : : }
1464 : : }
1465 : :
1466 : : /* Clear the temporarily allocated flags and free memory. */
1467 : 46817228 : for (int i = 0; i < rev_post_order_num; ++i)
1468 : : {
1469 : 45401892 : basic_block bb = BASIC_BLOCK_FOR_FN (fn, rev_post_order[i]);
1470 : 45401892 : if (bb->flags & is_header)
1471 : 3875716 : bb_data[bb->index].scc_exits.~scc_exit_vec_t ();
1472 : 45401892 : bb->flags &= ~(visited|is_header);
1473 : : }
1474 : :
1475 : 1415336 : XDELETEVEC (bb_data);
1476 : :
1477 : 1415336 : return rev_post_order_num;
1478 : 12740901 : }
1479 : :
1480 : :
1481 : :
1482 : : /* Compute the depth first search order on the _reverse_ graph and
1483 : : store it in the array DFS_ORDER, marking the nodes visited in VISITED.
1484 : : Returns the number of nodes visited.
1485 : :
1486 : : The computation is split into three pieces:
1487 : :
1488 : : flow_dfs_compute_reverse_init () creates the necessary data
1489 : : structures.
1490 : :
1491 : : flow_dfs_compute_reverse_add_bb () adds a basic block to the data
1492 : : structures. The block will start the search.
1493 : :
1494 : : flow_dfs_compute_reverse_execute () continues (or starts) the
1495 : : search using the block on the top of the stack, stopping when the
1496 : : stack is empty.
1497 : :
1498 : : flow_dfs_compute_reverse_finish () destroys the necessary data
1499 : : structures.
1500 : :
1501 : : Thus, the user will probably call ..._init(), call ..._add_bb() to
1502 : : add a beginning basic block to the stack, call ..._execute(),
1503 : : possibly add another bb to the stack and again call ..._execute(),
1504 : : ..., and finally call _finish(). */
1505 : :
1506 : : /* Initialize the data structures used for depth-first search on the
1507 : : reverse graph. If INITIALIZE_STACK is nonzero, the exit block is
1508 : : added to the basic block stack. DATA is the current depth-first
1509 : : search context. If INITIALIZE_STACK is nonzero, there is an
1510 : : element on the stack. */
1511 : :
1512 : 5306233 : depth_first_search::depth_first_search () :
1513 : 5306233 : m_stack (n_basic_blocks_for_fn (cfun)),
1514 : 5306233 : m_visited_blocks (last_basic_block_for_fn (cfun))
1515 : : {
1516 : 5306233 : bitmap_clear (m_visited_blocks);
1517 : 5306233 : }
1518 : :
1519 : : /* Add the specified basic block to the top of the dfs data
1520 : : structures. When the search continues, it will start at the
1521 : : block. */
1522 : :
1523 : : void
1524 : 62739980 : depth_first_search::add_bb (basic_block bb)
1525 : : {
1526 : 62739980 : m_stack.quick_push (bb);
1527 : 62739980 : bitmap_set_bit (m_visited_blocks, bb->index);
1528 : 62739980 : }
1529 : :
1530 : : /* Continue the depth-first search through the reverse graph starting with the
1531 : : block at the stack's top and ending when the stack is empty. Visited nodes
1532 : : are marked. Returns an unvisited basic block, or NULL if there is none
1533 : : available. */
1534 : :
1535 : : basic_block
1536 : 5330665 : depth_first_search::execute (basic_block last_unvisited)
1537 : : {
1538 : 5330665 : basic_block bb;
1539 : 5330665 : edge e;
1540 : 5330665 : edge_iterator ei;
1541 : :
1542 : 68070645 : while (!m_stack.is_empty ())
1543 : : {
1544 : 62739980 : bb = m_stack.pop ();
1545 : :
1546 : : /* Perform depth-first search on adjacent vertices. */
1547 : 139806579 : FOR_EACH_EDGE (e, ei, bb->preds)
1548 : 77066599 : if (!bitmap_bit_p (m_visited_blocks, e->src->index))
1549 : 57409315 : add_bb (e->src);
1550 : : }
1551 : :
1552 : : /* Determine if there are unvisited basic blocks. */
1553 : 68070645 : FOR_BB_BETWEEN (bb, last_unvisited, NULL, prev_bb)
1554 : 62764412 : if (!bitmap_bit_p (m_visited_blocks, bb->index))
1555 : : return bb;
1556 : :
1557 : : return NULL;
1558 : : }
1559 : :
1560 : : /* Performs dfs search from BB over vertices satisfying PREDICATE;
1561 : : if REVERSE, go against direction of edges. Returns number of blocks
1562 : : found and their list in RSLT. RSLT can contain at most RSLT_MAX items. */
1563 : : int
1564 : 208441194 : dfs_enumerate_from (basic_block bb, int reverse,
1565 : : bool (*predicate) (const_basic_block, const void *),
1566 : : basic_block *rslt, int rslt_max, const void *data)
1567 : : {
1568 : 208441194 : basic_block *st, lbb;
1569 : 208441194 : int sp = 0, tv = 0;
1570 : :
1571 : 208441194 : auto_bb_flag visited (cfun);
1572 : :
1573 : : #define MARK_VISITED(BB) ((BB)->flags |= visited)
1574 : : #define UNMARK_VISITED(BB) ((BB)->flags &= ~visited)
1575 : : #define VISITED_P(BB) (((BB)->flags & visited) != 0)
1576 : :
1577 : 208441194 : st = XNEWVEC (basic_block, rslt_max);
1578 : 208441194 : rslt[tv++] = st[sp++] = bb;
1579 : 208441194 : MARK_VISITED (bb);
1580 : 1387688490 : while (sp)
1581 : : {
1582 : 1179247296 : edge e;
1583 : 1179247296 : edge_iterator ei;
1584 : 1179247296 : lbb = st[--sp];
1585 : 1179247296 : if (reverse)
1586 : : {
1587 : 2877225233 : FOR_EACH_EDGE (e, ei, lbb->preds)
1588 : 1699402859 : if (!VISITED_P (e->src) && predicate (e->src, data))
1589 : : {
1590 : 970177052 : gcc_assert (tv != rslt_max);
1591 : 970177052 : rslt[tv++] = st[sp++] = e->src;
1592 : 970177052 : MARK_VISITED (e->src);
1593 : : }
1594 : : }
1595 : : else
1596 : : {
1597 : 3462362 : FOR_EACH_EDGE (e, ei, lbb->succs)
1598 : 2037440 : if (!VISITED_P (e->dest) && predicate (e->dest, data))
1599 : : {
1600 : 629050 : gcc_assert (tv != rslt_max);
1601 : 629050 : rslt[tv++] = st[sp++] = e->dest;
1602 : 629050 : MARK_VISITED (e->dest);
1603 : : }
1604 : : }
1605 : : }
1606 : 208441194 : free (st);
1607 : 1387688490 : for (sp = 0; sp < tv; sp++)
1608 : 1179247296 : UNMARK_VISITED (rslt[sp]);
1609 : 208441194 : return tv;
1610 : : #undef MARK_VISITED
1611 : : #undef UNMARK_VISITED
1612 : : #undef VISITED_P
1613 : 208441194 : }
1614 : :
1615 : :
1616 : : /* Compute dominance frontiers, ala Harvey, Ferrante, et al.
1617 : :
1618 : : This algorithm can be found in Timothy Harvey's PhD thesis, at
1619 : : http://www.cs.rice.edu/~harv/dissertation.pdf in the section on iterative
1620 : : dominance algorithms.
1621 : :
1622 : : First, we identify each join point, j (any node with more than one
1623 : : incoming edge is a join point).
1624 : :
1625 : : We then examine each predecessor, p, of j and walk up the dominator tree
1626 : : starting at p.
1627 : :
1628 : : We stop the walk when we reach j's immediate dominator - j is in the
1629 : : dominance frontier of each of the nodes in the walk, except for j's
1630 : : immediate dominator. Intuitively, all of the rest of j's dominators are
1631 : : shared by j's predecessors as well.
1632 : : Since they dominate j, they will not have j in their dominance frontiers.
1633 : :
1634 : : The number of nodes touched by this algorithm is equal to the size
1635 : : of the dominance frontiers, no more, no less.
1636 : : */
1637 : :
1638 : : void
1639 : 9603441 : compute_dominance_frontiers (bitmap_head *frontiers)
1640 : : {
1641 : 9603441 : timevar_push (TV_DOM_FRONTIERS);
1642 : :
1643 : 9603441 : edge p;
1644 : 9603441 : edge_iterator ei;
1645 : 9603441 : basic_block b;
1646 : 157094851 : FOR_EACH_BB_FN (b, cfun)
1647 : : {
1648 : 181487605 : if (EDGE_COUNT (b->preds) >= 2)
1649 : : {
1650 : 33996195 : basic_block domsb = get_immediate_dominator (CDI_DOMINATORS, b);
1651 : 128236004 : FOR_EACH_EDGE (p, ei, b->preds)
1652 : : {
1653 : 94239809 : basic_block runner = p->src;
1654 : 94239809 : if (runner == ENTRY_BLOCK_PTR_FOR_FN (cfun))
1655 : 7818 : continue;
1656 : :
1657 : 261470661 : while (runner != domsb)
1658 : : {
1659 : 191746917 : if (!bitmap_set_bit (&frontiers[runner->index], b->index))
1660 : : break;
1661 : 167238670 : runner = get_immediate_dominator (CDI_DOMINATORS, runner);
1662 : : }
1663 : : }
1664 : : }
1665 : : }
1666 : :
1667 : 9603441 : timevar_pop (TV_DOM_FRONTIERS);
1668 : 9603441 : }
1669 : :
1670 : : /* Given a set of blocks with variable definitions (DEF_BLOCKS),
1671 : : return a bitmap with all the blocks in the iterated dominance
1672 : : frontier of the blocks in DEF_BLOCKS. DFS contains dominance
1673 : : frontier information as returned by compute_dominance_frontiers.
1674 : :
1675 : : The resulting set of blocks are the potential sites where PHI nodes
1676 : : are needed. The caller is responsible for freeing the memory
1677 : : allocated for the return value. */
1678 : :
1679 : : bitmap
1680 : 22967518 : compute_idf (bitmap def_blocks, bitmap_head *dfs)
1681 : : {
1682 : 22967518 : bitmap_iterator bi;
1683 : 22967518 : unsigned bb_index, i;
1684 : 22967518 : bitmap phi_insertion_points;
1685 : :
1686 : 22967518 : phi_insertion_points = BITMAP_ALLOC (NULL);
1687 : :
1688 : : /* Seed the work set with all the blocks in DEF_BLOCKS. */
1689 : 22967518 : auto_bitmap work_set;
1690 : 22967518 : bitmap_copy (work_set, def_blocks);
1691 : 22967518 : bitmap_tree_view (work_set);
1692 : :
1693 : : /* Pop a block off the workset, add every block that appears in
1694 : : the original block's DF that we have not already processed to
1695 : : the workset. Iterate until the workset is empty. Blocks
1696 : : which are added to the workset are potential sites for
1697 : : PHI nodes. */
1698 : 149839923 : while (!bitmap_empty_p (work_set))
1699 : : {
1700 : : /* The dominance frontier of a block is blocks after it so iterating
1701 : : on earlier blocks first is better.
1702 : : ??? Basic blocks are by no means guaranteed to be ordered in
1703 : : optimal order for this iteration. */
1704 : 103904887 : bb_index = bitmap_clear_first_set_bit (work_set);
1705 : :
1706 : : /* Since the registration of NEW -> OLD name mappings is done
1707 : : separately from the call to update_ssa, when updating the SSA
1708 : : form, the basic blocks where new and/or old names are defined
1709 : : may have disappeared by CFG cleanup calls. In this case,
1710 : : we may pull a non-existing block from the work stack. */
1711 : 103904887 : gcc_checking_assert (bb_index
1712 : : < (unsigned) last_basic_block_for_fn (cfun));
1713 : :
1714 : : /* The population counts of the dominance frontiers is low
1715 : : compared to that of phi_insertion_points which approaches
1716 : : the IDF and of work_set which is at most that of the IDF
1717 : : as well. That makes iterating over the DFS bitmap preferential
1718 : : to whole bitmap operations involving also phi_insertion_points. */
1719 : 215864469 : EXECUTE_IF_SET_IN_BITMAP (&dfs[bb_index], 0, i, bi)
1720 : 111959582 : if (bitmap_set_bit (phi_insertion_points, i))
1721 : 48402629 : bitmap_set_bit (work_set, i);
1722 : : }
1723 : :
1724 : 22967518 : return phi_insertion_points;
1725 : 22967518 : }
1726 : :
1727 : : /* Intersection and union of preds/succs for sbitmap based data flow
1728 : : solvers. All four functions defined below take the same arguments:
1729 : : B is the basic block to perform the operation for. DST is the
1730 : : target sbitmap, i.e. the result. SRC is an sbitmap vector of size
1731 : : last_basic_block so that it can be indexed with basic block indices.
1732 : : DST may be (but does not have to be) SRC[B->index]. */
1733 : :
1734 : : /* Set the bitmap DST to the intersection of SRC of successors of
1735 : : basic block B. */
1736 : :
1737 : : void
1738 : 9904412 : bitmap_intersection_of_succs (sbitmap dst, sbitmap *src, basic_block b)
1739 : : {
1740 : 9904412 : unsigned int set_size = dst->size;
1741 : 9904412 : edge e;
1742 : 9904412 : unsigned ix;
1743 : :
1744 : 9907232 : for (e = NULL, ix = 0; ix < EDGE_COUNT (b->succs); ix++)
1745 : : {
1746 : 9831907 : e = EDGE_SUCC (b, ix);
1747 : 9831907 : if (e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
1748 : 2820 : continue;
1749 : :
1750 : 9829087 : bitmap_copy (dst, src[e->dest->index]);
1751 : 9829087 : break;
1752 : : }
1753 : :
1754 : 9904412 : if (e == 0)
1755 : 72505 : bitmap_ones (dst);
1756 : : else
1757 : 15849888 : for (++ix; ix < EDGE_COUNT (b->succs); ix++)
1758 : : {
1759 : 6017981 : unsigned int i;
1760 : 6017981 : SBITMAP_ELT_TYPE *p, *r;
1761 : :
1762 : 6017981 : e = EDGE_SUCC (b, ix);
1763 : 6017981 : if (e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
1764 : 0 : continue;
1765 : :
1766 : 6017981 : p = src[e->dest->index]->elms;
1767 : 6017981 : r = dst->elms;
1768 : 23035789 : for (i = 0; i < set_size; i++)
1769 : 17017808 : *r++ &= *p++;
1770 : : }
1771 : 9904412 : }
1772 : :
1773 : : /* Set the bitmap DST to the intersection of SRC of predecessors of
1774 : : basic block B. */
1775 : :
1776 : : void
1777 : 53110109 : bitmap_intersection_of_preds (sbitmap dst, sbitmap *src, basic_block b)
1778 : : {
1779 : 53110109 : unsigned int set_size = dst->size;
1780 : 53110109 : edge e;
1781 : 53110109 : unsigned ix;
1782 : :
1783 : 53110109 : for (e = NULL, ix = 0; ix < EDGE_COUNT (b->preds); ix++)
1784 : : {
1785 : 53110109 : e = EDGE_PRED (b, ix);
1786 : 53110109 : if (e->src == ENTRY_BLOCK_PTR_FOR_FN (cfun))
1787 : 0 : continue;
1788 : :
1789 : 53110109 : bitmap_copy (dst, src[e->src->index]);
1790 : 53110109 : break;
1791 : : }
1792 : :
1793 : 53110109 : if (e == 0)
1794 : 0 : bitmap_ones (dst);
1795 : : else
1796 : 134847058 : for (++ix; ix < EDGE_COUNT (b->preds); ix++)
1797 : : {
1798 : 81736949 : unsigned int i;
1799 : 81736949 : SBITMAP_ELT_TYPE *p, *r;
1800 : :
1801 : 81736949 : e = EDGE_PRED (b, ix);
1802 : 81736949 : if (e->src == ENTRY_BLOCK_PTR_FOR_FN (cfun))
1803 : 0 : continue;
1804 : :
1805 : 81736949 : p = src[e->src->index]->elms;
1806 : 81736949 : r = dst->elms;
1807 : 723799008 : for (i = 0; i < set_size; i++)
1808 : 642062059 : *r++ &= *p++;
1809 : : }
1810 : 53110109 : }
1811 : :
1812 : : /* Set the bitmap DST to the union of SRC of successors of
1813 : : basic block B. */
1814 : :
1815 : : void
1816 : 0 : bitmap_union_of_succs (sbitmap dst, sbitmap *src, basic_block b)
1817 : : {
1818 : 0 : unsigned int set_size = dst->size;
1819 : 0 : edge e;
1820 : 0 : unsigned ix;
1821 : :
1822 : 0 : for (ix = 0; ix < EDGE_COUNT (b->succs); ix++)
1823 : : {
1824 : 0 : e = EDGE_SUCC (b, ix);
1825 : 0 : if (e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
1826 : 0 : continue;
1827 : :
1828 : 0 : bitmap_copy (dst, src[e->dest->index]);
1829 : 0 : break;
1830 : : }
1831 : :
1832 : 0 : if (ix == EDGE_COUNT (b->succs))
1833 : 0 : bitmap_clear (dst);
1834 : : else
1835 : 0 : for (ix++; ix < EDGE_COUNT (b->succs); ix++)
1836 : : {
1837 : 0 : unsigned int i;
1838 : 0 : SBITMAP_ELT_TYPE *p, *r;
1839 : :
1840 : 0 : e = EDGE_SUCC (b, ix);
1841 : 0 : if (e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
1842 : 0 : continue;
1843 : :
1844 : 0 : p = src[e->dest->index]->elms;
1845 : 0 : r = dst->elms;
1846 : 0 : for (i = 0; i < set_size; i++)
1847 : 0 : *r++ |= *p++;
1848 : : }
1849 : 0 : }
1850 : :
1851 : : /* Set the bitmap DST to the union of SRC of predecessors of
1852 : : basic block B. */
1853 : :
1854 : : void
1855 : 0 : bitmap_union_of_preds (sbitmap dst, sbitmap *src, basic_block b)
1856 : : {
1857 : 0 : unsigned int set_size = dst->size;
1858 : 0 : edge e;
1859 : 0 : unsigned ix;
1860 : :
1861 : 0 : for (ix = 0; ix < EDGE_COUNT (b->preds); ix++)
1862 : : {
1863 : 0 : e = EDGE_PRED (b, ix);
1864 : 0 : if (e->src== ENTRY_BLOCK_PTR_FOR_FN (cfun))
1865 : 0 : continue;
1866 : :
1867 : 0 : bitmap_copy (dst, src[e->src->index]);
1868 : 0 : break;
1869 : : }
1870 : :
1871 : 0 : if (ix == EDGE_COUNT (b->preds))
1872 : 0 : bitmap_clear (dst);
1873 : : else
1874 : 0 : for (ix++; ix < EDGE_COUNT (b->preds); ix++)
1875 : : {
1876 : 0 : unsigned int i;
1877 : 0 : SBITMAP_ELT_TYPE *p, *r;
1878 : :
1879 : 0 : e = EDGE_PRED (b, ix);
1880 : 0 : if (e->src == ENTRY_BLOCK_PTR_FOR_FN (cfun))
1881 : 0 : continue;
1882 : :
1883 : 0 : p = src[e->src->index]->elms;
1884 : 0 : r = dst->elms;
1885 : 0 : for (i = 0; i < set_size; i++)
1886 : 0 : *r++ |= *p++;
1887 : : }
1888 : 0 : }
1889 : :
1890 : : /* Returns the list of basic blocks in the function in an order that guarantees
1891 : : that if a block X has just a single predecessor Y, then Y is after X in the
1892 : : ordering. */
1893 : :
1894 : : basic_block *
1895 : 7337973 : single_pred_before_succ_order (void)
1896 : : {
1897 : 7337973 : basic_block x, y;
1898 : 7337973 : basic_block *order = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun));
1899 : 7337973 : unsigned n = n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS;
1900 : 7337973 : unsigned np, i;
1901 : 7337973 : auto_sbitmap visited (last_basic_block_for_fn (cfun));
1902 : :
1903 : : #define MARK_VISITED(BB) (bitmap_set_bit (visited, (BB)->index))
1904 : : #define VISITED_P(BB) (bitmap_bit_p (visited, (BB)->index))
1905 : :
1906 : 7337973 : bitmap_clear (visited);
1907 : :
1908 : 7337973 : MARK_VISITED (ENTRY_BLOCK_PTR_FOR_FN (cfun));
1909 : 67165907 : FOR_EACH_BB_FN (x, cfun)
1910 : : {
1911 : 59827934 : if (VISITED_P (x))
1912 : 1809082 : continue;
1913 : :
1914 : : /* Walk the predecessors of x as long as they have precisely one
1915 : : predecessor and add them to the list, so that they get stored
1916 : : after x. */
1917 : 1809082 : for (y = x, np = 1;
1918 : 105114655 : single_pred_p (y) && !VISITED_P (single_pred (y));
1919 : 1809082 : y = single_pred (y))
1920 : 1809082 : np++;
1921 : 58018852 : for (y = x, i = n - np;
1922 : 105114655 : single_pred_p (y) && !VISITED_P (single_pred (y));
1923 : 1809082 : y = single_pred (y), i++)
1924 : : {
1925 : 1809082 : order[i] = y;
1926 : 1809082 : MARK_VISITED (y);
1927 : : }
1928 : 58018852 : order[i] = y;
1929 : 58018852 : MARK_VISITED (y);
1930 : :
1931 : 58018852 : gcc_assert (i == n - 1);
1932 : : n -= np;
1933 : : }
1934 : :
1935 : 7337973 : gcc_assert (n == 0);
1936 : 7337973 : return order;
1937 : :
1938 : : #undef MARK_VISITED
1939 : : #undef VISITED_P
1940 : 7337973 : }
1941 : :
1942 : : /* Ignoring loop backedges, if BB has precisely one incoming edge then
1943 : : return that edge. Otherwise return NULL.
1944 : :
1945 : : When IGNORE_NOT_EXECUTABLE is true, also ignore edges that are not marked
1946 : : as executable. */
1947 : :
1948 : : edge
1949 : 93501335 : single_pred_edge_ignoring_loop_edges (basic_block bb,
1950 : : bool ignore_not_executable)
1951 : : {
1952 : 93501335 : edge retval = NULL;
1953 : 93501335 : edge e;
1954 : 93501335 : edge_iterator ei;
1955 : :
1956 : 183759109 : FOR_EACH_EDGE (e, ei, bb->preds)
1957 : : {
1958 : : /* A loop back edge can be identified by the destination of
1959 : : the edge dominating the source of the edge. */
1960 : 105140678 : if (dominated_by_p (CDI_DOMINATORS, e->src, e->dest))
1961 : 4775915 : continue;
1962 : :
1963 : : /* We can safely ignore edges that are not executable. */
1964 : 100364763 : if (ignore_not_executable
1965 : 24401761 : && (e->flags & EDGE_EXECUTABLE) == 0)
1966 : 80755 : continue;
1967 : :
1968 : : /* If we have already seen a non-loop edge, then we must have
1969 : : multiple incoming non-loop edges and thus we return NULL. */
1970 : 100284008 : if (retval)
1971 : : return NULL;
1972 : :
1973 : : /* This is the first non-loop incoming edge we have found. Record
1974 : : it. */
1975 : : retval = e;
1976 : : }
1977 : :
1978 : : return retval;
1979 : : }
|