RISC-V: Make stack_save_restore tests more robust
[official-gcc.git] / gcc / tree-ssa-threadupdate.cc
bloba5b9a002a8ab6cf2d1657f1359ede6980acbce42
1 /* Thread edges through blocks and update the control flow and SSA graphs.
2 Copyright (C) 2004-2023 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
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/>. */
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "tree.h"
25 #include "gimple.h"
26 #include "cfghooks.h"
27 #include "tree-pass.h"
28 #include "ssa.h"
29 #include "fold-const.h"
30 #include "cfganal.h"
31 #include "gimple-iterator.h"
32 #include "tree-ssa.h"
33 #include "tree-ssa-threadupdate.h"
34 #include "cfgloop.h"
35 #include "dbgcnt.h"
36 #include "tree-cfg.h"
37 #include "tree-vectorizer.h"
38 #include "tree-pass.h"
40 /* Given a block B, update the CFG and SSA graph to reflect redirecting
41 one or more in-edges to B to instead reach the destination of an
42 out-edge from B while preserving any side effects in B.
44 i.e., given A->B and B->C, change A->B to be A->C yet still preserve the
45 side effects of executing B.
47 1. Make a copy of B (including its outgoing edges and statements). Call
48 the copy B'. Note B' has no incoming edges or PHIs at this time.
50 2. Remove the control statement at the end of B' and all outgoing edges
51 except B'->C.
53 3. Add a new argument to each PHI in C with the same value as the existing
54 argument associated with edge B->C. Associate the new PHI arguments
55 with the edge B'->C.
57 4. For each PHI in B, find or create a PHI in B' with an identical
58 PHI_RESULT. Add an argument to the PHI in B' which has the same
59 value as the PHI in B associated with the edge A->B. Associate
60 the new argument in the PHI in B' with the edge A->B.
62 5. Change the edge A->B to A->B'.
64 5a. This automatically deletes any PHI arguments associated with the
65 edge A->B in B.
67 5b. This automatically associates each new argument added in step 4
68 with the edge A->B'.
70 6. Repeat for other incoming edges into B.
72 7. Put the duplicated resources in B and all the B' blocks into SSA form.
74 Note that block duplication can be minimized by first collecting the
75 set of unique destination blocks that the incoming edges should
76 be threaded to.
78 We reduce the number of edges and statements we create by not copying all
79 the outgoing edges and the control statement in step #1. We instead create
80 a template block without the outgoing edges and duplicate the template.
82 Another case this code handles is threading through a "joiner" block. In
83 this case, we do not know the destination of the joiner block, but one
84 of the outgoing edges from the joiner block leads to a threadable path. This
85 case largely works as outlined above, except the duplicate of the joiner
86 block still contains a full set of outgoing edges and its control statement.
87 We just redirect one of its outgoing edges to our jump threading path. */
90 /* Steps #5 and #6 of the above algorithm are best implemented by walking
91 all the incoming edges which thread to the same destination edge at
92 the same time. That avoids lots of table lookups to get information
93 for the destination edge.
95 To realize that implementation we create a list of incoming edges
96 which thread to the same outgoing edge. Thus to implement steps
97 #5 and #6 we traverse our hash table of outgoing edge information.
98 For each entry we walk the list of incoming edges which thread to
99 the current outgoing edge. */
101 struct el
103 edge e;
104 struct el *next;
107 /* Main data structure recording information regarding B's duplicate
108 blocks. */
110 /* We need to efficiently record the unique thread destinations of this
111 block and specific information associated with those destinations. We
112 may have many incoming edges threaded to the same outgoing edge. This
113 can be naturally implemented with a hash table. */
115 struct redirection_data : free_ptr_hash<redirection_data>
117 /* We support wiring up two block duplicates in a jump threading path.
119 One is a normal block copy where we remove the control statement
120 and wire up its single remaining outgoing edge to the thread path.
122 The other is a joiner block where we leave the control statement
123 in place, but wire one of the outgoing edges to a thread path.
125 In theory we could have multiple block duplicates in a jump
126 threading path, but I haven't tried that.
128 The duplicate blocks appear in this array in the same order in
129 which they appear in the jump thread path. */
130 basic_block dup_blocks[2];
132 vec<jump_thread_edge *> *path;
134 /* A list of incoming edges which we want to thread to the
135 same path. */
136 struct el *incoming_edges;
138 /* hash_table support. */
139 static inline hashval_t hash (const redirection_data *);
140 static inline int equal (const redirection_data *, const redirection_data *);
143 jump_thread_path_allocator::jump_thread_path_allocator ()
145 obstack_init (&m_obstack);
148 jump_thread_path_allocator::~jump_thread_path_allocator ()
150 obstack_free (&m_obstack, NULL);
153 jump_thread_edge *
154 jump_thread_path_allocator::allocate_thread_edge (edge e,
155 jump_thread_edge_type type)
157 void *r = obstack_alloc (&m_obstack, sizeof (jump_thread_edge));
158 return new (r) jump_thread_edge (e, type);
161 vec<jump_thread_edge *> *
162 jump_thread_path_allocator::allocate_thread_path ()
164 // ?? Since the paths live in an obstack, we should be able to remove all
165 // references to path->release() throughout the code.
166 void *r = obstack_alloc (&m_obstack, sizeof (vec <jump_thread_edge *>));
167 return new (r) vec<jump_thread_edge *> ();
170 jt_path_registry::jt_path_registry (bool backedge_threads)
172 m_paths.create (5);
173 m_num_threaded_edges = 0;
174 m_backedge_threads = backedge_threads;
177 jt_path_registry::~jt_path_registry ()
179 m_paths.release ();
182 fwd_jt_path_registry::fwd_jt_path_registry ()
183 : jt_path_registry (/*backedge_threads=*/false)
185 m_removed_edges = new hash_table<struct removed_edges> (17);
186 m_redirection_data = NULL;
189 fwd_jt_path_registry::~fwd_jt_path_registry ()
191 delete m_removed_edges;
194 back_jt_path_registry::back_jt_path_registry ()
195 : jt_path_registry (/*backedge_threads=*/true)
199 void
200 jt_path_registry::push_edge (vec<jump_thread_edge *> *path,
201 edge e, jump_thread_edge_type type)
203 jump_thread_edge *x = m_allocator.allocate_thread_edge (e, type);
204 path->safe_push (x);
207 vec<jump_thread_edge *> *
208 jt_path_registry::allocate_thread_path ()
210 return m_allocator.allocate_thread_path ();
213 /* Dump a jump threading path, including annotations about each
214 edge in the path. */
216 static void
217 dump_jump_thread_path (FILE *dump_file,
218 const vec<jump_thread_edge *> &path,
219 bool registering)
221 if (registering)
222 fprintf (dump_file,
223 " [%u] Registering jump thread: (%d, %d) incoming edge; ",
224 dbg_cnt_counter (registered_jump_thread),
225 path[0]->e->src->index, path[0]->e->dest->index);
226 else
227 fprintf (dump_file,
228 " Cancelling jump thread: (%d, %d) incoming edge; ",
229 path[0]->e->src->index, path[0]->e->dest->index);
231 for (unsigned int i = 1; i < path.length (); i++)
233 /* We can get paths with a NULL edge when the final destination
234 of a jump thread turns out to be a constant address. We dump
235 those paths when debugging, so we have to be prepared for that
236 possibility here. */
237 if (path[i]->e == NULL)
238 continue;
240 fprintf (dump_file, " (%d, %d) ",
241 path[i]->e->src->index, path[i]->e->dest->index);
242 switch (path[i]->type)
244 case EDGE_COPY_SRC_JOINER_BLOCK:
245 fprintf (dump_file, "joiner");
246 break;
247 case EDGE_COPY_SRC_BLOCK:
248 fprintf (dump_file, "normal");
249 break;
250 case EDGE_NO_COPY_SRC_BLOCK:
251 fprintf (dump_file, "nocopy");
252 break;
253 default:
254 gcc_unreachable ();
257 if ((path[i]->e->flags & EDGE_DFS_BACK) != 0)
258 fprintf (dump_file, " (back)");
260 fprintf (dump_file, "; \n");
263 DEBUG_FUNCTION void
264 debug (const vec<jump_thread_edge *> &path)
266 dump_jump_thread_path (stderr, path, true);
269 DEBUG_FUNCTION void
270 debug (const vec<jump_thread_edge *> *path)
272 debug (*path);
275 /* Release the memory associated with PATH, and if dumping is enabled,
276 dump out the reason why the thread was canceled. */
278 static void
279 cancel_thread (vec<jump_thread_edge *> *path, const char *reason = NULL)
281 if (dump_file && (dump_flags & TDF_DETAILS))
283 if (reason)
284 fprintf (dump_file, "%s: ", reason);
286 dump_jump_thread_path (dump_file, *path, false);
287 fprintf (dump_file, "\n");
289 path->release ();
292 /* Simple hashing function. For any given incoming edge E, we're going
293 to be most concerned with the final destination of its jump thread
294 path. So hash on the block index of the final edge in the path. */
296 inline hashval_t
297 redirection_data::hash (const redirection_data *p)
299 vec<jump_thread_edge *> *path = p->path;
300 return path->last ()->e->dest->index;
303 /* Given two hash table entries, return true if they have the same
304 jump threading path. */
305 inline int
306 redirection_data::equal (const redirection_data *p1, const redirection_data *p2)
308 vec<jump_thread_edge *> *path1 = p1->path;
309 vec<jump_thread_edge *> *path2 = p2->path;
311 if (path1->length () != path2->length ())
312 return false;
314 for (unsigned int i = 1; i < path1->length (); i++)
316 if ((*path1)[i]->type != (*path2)[i]->type
317 || (*path1)[i]->e != (*path2)[i]->e)
318 return false;
321 return true;
324 /* Data structure of information to pass to hash table traversal routines. */
325 struct ssa_local_info_t
327 /* The current block we are working on. */
328 basic_block bb;
330 /* We only create a template block for the first duplicated block in a
331 jump threading path as we may need many duplicates of that block.
333 The second duplicate block in a path is specific to that path. Creating
334 and sharing a template for that block is considerably more difficult. */
335 basic_block template_block;
337 /* If we append debug stmts to the template block after creating it,
338 this iterator won't be the last one in the block, and further
339 copies of the template block shouldn't get debug stmts after
340 it. */
341 gimple_stmt_iterator template_last_to_copy;
343 /* Blocks duplicated for the thread. */
344 bitmap duplicate_blocks;
346 /* TRUE if we thread one or more jumps, FALSE otherwise. */
347 bool jumps_threaded;
349 /* When we have multiple paths through a joiner which reach different
350 final destinations, then we may need to correct for potential
351 profile insanities. */
352 bool need_profile_correction;
354 // Jump threading statistics.
355 unsigned long num_threaded_edges;
358 /* When we start updating the CFG for threading, data necessary for jump
359 threading is attached to the AUX field for the incoming edge. Use these
360 macros to access the underlying structure attached to the AUX field. */
361 #define THREAD_PATH(E) ((vec<jump_thread_edge *> *)(E)->aux)
363 /* Remove the last statement in block BB if it is a control statement
364 Also remove all outgoing edges except the edge which reaches DEST_BB.
365 If DEST_BB is NULL, then remove all outgoing edges. */
367 static void
368 remove_ctrl_stmt_and_useless_edges (basic_block bb, basic_block dest_bb)
370 gimple_stmt_iterator gsi;
371 edge e;
372 edge_iterator ei;
374 gsi = gsi_last_bb (bb);
376 /* If the duplicate ends with a control statement, then remove it.
378 Note that if we are duplicating the template block rather than the
379 original basic block, then the duplicate might not have any real
380 statements in it. */
381 if (!gsi_end_p (gsi)
382 && gsi_stmt (gsi)
383 && (gimple_code (gsi_stmt (gsi)) == GIMPLE_COND
384 || gimple_code (gsi_stmt (gsi)) == GIMPLE_GOTO
385 || gimple_code (gsi_stmt (gsi)) == GIMPLE_SWITCH))
386 gsi_remove (&gsi, true);
388 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
390 if (e->dest != dest_bb)
392 free_dom_edge_info (e);
393 remove_edge (e);
395 else
397 e->probability = profile_probability::always ();
398 ei_next (&ei);
402 /* If the remaining edge is a loop exit, there must have
403 a removed edge that was not a loop exit.
405 In that case BB and possibly other blocks were previously
406 in the loop, but are now outside the loop. Thus, we need
407 to update the loop structures. */
408 if (single_succ_p (bb)
409 && loop_outer (bb->loop_father)
410 && loop_exit_edge_p (bb->loop_father, single_succ_edge (bb)))
411 loops_state_set (LOOPS_NEED_FIXUP);
414 /* Create a duplicate of BB. Record the duplicate block in an array
415 indexed by COUNT stored in RD. */
417 static void
418 create_block_for_threading (basic_block bb,
419 struct redirection_data *rd,
420 unsigned int count,
421 bitmap *duplicate_blocks)
423 edge_iterator ei;
424 edge e;
426 /* We can use the generic block duplication code and simply remove
427 the stuff we do not need. */
428 rd->dup_blocks[count] = duplicate_block (bb, NULL, NULL);
430 FOR_EACH_EDGE (e, ei, rd->dup_blocks[count]->succs)
432 e->aux = NULL;
434 /* If we duplicate a block with an outgoing edge marked as
435 EDGE_IGNORE, we must clear EDGE_IGNORE so that it doesn't
436 leak out of the current pass.
438 It would be better to simplify switch statements and remove
439 the edges before we get here, but the sequencing is nontrivial. */
440 e->flags &= ~EDGE_IGNORE;
443 /* Zero out the profile, since the block is unreachable for now. */
444 rd->dup_blocks[count]->count = profile_count::uninitialized ();
445 if (duplicate_blocks)
446 bitmap_set_bit (*duplicate_blocks, rd->dup_blocks[count]->index);
449 /* Given an outgoing edge E lookup and return its entry in our hash table.
451 If INSERT is true, then we insert the entry into the hash table if
452 it is not already present. INCOMING_EDGE is added to the list of incoming
453 edges associated with E in the hash table. */
455 redirection_data *
456 fwd_jt_path_registry::lookup_redirection_data (edge e, insert_option insert)
458 struct redirection_data **slot;
459 struct redirection_data *elt;
460 vec<jump_thread_edge *> *path = THREAD_PATH (e);
462 /* Build a hash table element so we can see if E is already
463 in the table. */
464 elt = XNEW (struct redirection_data);
465 elt->path = path;
466 elt->dup_blocks[0] = NULL;
467 elt->dup_blocks[1] = NULL;
468 elt->incoming_edges = NULL;
470 slot = m_redirection_data->find_slot (elt, insert);
472 /* This will only happen if INSERT is false and the entry is not
473 in the hash table. */
474 if (slot == NULL)
476 free (elt);
477 return NULL;
480 /* This will only happen if E was not in the hash table and
481 INSERT is true. */
482 if (*slot == NULL)
484 *slot = elt;
485 elt->incoming_edges = XNEW (struct el);
486 elt->incoming_edges->e = e;
487 elt->incoming_edges->next = NULL;
488 return elt;
490 /* E was in the hash table. */
491 else
493 /* Free ELT as we do not need it anymore, we will extract the
494 relevant entry from the hash table itself. */
495 free (elt);
497 /* Get the entry stored in the hash table. */
498 elt = *slot;
500 /* If insertion was requested, then we need to add INCOMING_EDGE
501 to the list of incoming edges associated with E. */
502 if (insert)
504 struct el *el = XNEW (struct el);
505 el->next = elt->incoming_edges;
506 el->e = e;
507 elt->incoming_edges = el;
510 return elt;
514 /* Given ssa_name DEF, backtrack jump threading PATH from node IDX
515 to see if it has constant value in a flow sensitive manner. Set
516 LOCUS to location of the constant phi arg and return the value.
517 Return DEF directly if either PATH or idx is ZERO. */
519 static tree
520 get_value_locus_in_path (tree def, vec<jump_thread_edge *> *path,
521 basic_block bb, int idx, location_t *locus)
523 tree arg;
524 gphi *def_phi;
525 basic_block def_bb;
527 if (path == NULL || idx == 0)
528 return def;
530 def_phi = dyn_cast <gphi *> (SSA_NAME_DEF_STMT (def));
531 if (!def_phi)
532 return def;
534 def_bb = gimple_bb (def_phi);
535 /* Don't propagate loop invariants into deeper loops. */
536 if (!def_bb || bb_loop_depth (def_bb) < bb_loop_depth (bb))
537 return def;
539 /* Backtrack jump threading path from IDX to see if def has constant
540 value. */
541 for (int j = idx - 1; j >= 0; j--)
543 edge e = (*path)[j]->e;
544 if (e->dest == def_bb)
546 arg = gimple_phi_arg_def (def_phi, e->dest_idx);
547 if (is_gimple_min_invariant (arg))
549 *locus = gimple_phi_arg_location (def_phi, e->dest_idx);
550 return arg;
552 break;
556 return def;
559 /* For each PHI in BB, copy the argument associated with SRC_E to TGT_E.
560 Try to backtrack jump threading PATH from node IDX to see if the arg
561 has constant value, copy constant value instead of argument itself
562 if yes. */
564 static void
565 copy_phi_args (basic_block bb, edge src_e, edge tgt_e,
566 vec<jump_thread_edge *> *path, int idx)
568 gphi_iterator gsi;
569 int src_indx = src_e->dest_idx;
571 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
573 gphi *phi = gsi.phi ();
574 tree def = gimple_phi_arg_def (phi, src_indx);
575 location_t locus = gimple_phi_arg_location (phi, src_indx);
577 if (TREE_CODE (def) == SSA_NAME
578 && !virtual_operand_p (gimple_phi_result (phi)))
579 def = get_value_locus_in_path (def, path, bb, idx, &locus);
581 add_phi_arg (phi, def, tgt_e, locus);
585 /* We have recently made a copy of ORIG_BB, including its outgoing
586 edges. The copy is NEW_BB. Every PHI node in every direct successor of
587 ORIG_BB has a new argument associated with edge from NEW_BB to the
588 successor. Initialize the PHI argument so that it is equal to the PHI
589 argument associated with the edge from ORIG_BB to the successor.
590 PATH and IDX are used to check if the new PHI argument has constant
591 value in a flow sensitive manner. */
593 static void
594 update_destination_phis (basic_block orig_bb, basic_block new_bb,
595 vec<jump_thread_edge *> *path, int idx)
597 edge_iterator ei;
598 edge e;
600 FOR_EACH_EDGE (e, ei, orig_bb->succs)
602 edge e2 = find_edge (new_bb, e->dest);
603 copy_phi_args (e->dest, e, e2, path, idx);
607 /* Given a duplicate block and its single destination (both stored
608 in RD). Create an edge between the duplicate and its single
609 destination.
611 Add an additional argument to any PHI nodes at the single
612 destination. IDX is the start node in jump threading path
613 we start to check to see if the new PHI argument has constant
614 value along the jump threading path. */
616 static void
617 create_edge_and_update_destination_phis (struct redirection_data *rd,
618 basic_block bb, int idx)
620 edge e = make_single_succ_edge (bb, rd->path->last ()->e->dest, EDGE_FALLTHRU);
622 rescan_loop_exit (e, true, false);
624 /* We used to copy the thread path here. That was added in 2007
625 and dutifully updated through the representation changes in 2013.
627 In 2013 we added code to thread from an interior node through
628 the backedge to another interior node. That runs after the code
629 to thread through loop headers from outside the loop.
631 The latter may delete edges in the CFG, including those
632 which appeared in the jump threading path we copied here. Thus
633 we'd end up using a dangling pointer.
635 After reviewing the 2007/2011 code, I can't see how anything
636 depended on copying the AUX field and clearly copying the jump
637 threading path is problematical due to embedded edge pointers.
638 It has been removed. */
639 e->aux = NULL;
641 /* If there are any PHI nodes at the destination of the outgoing edge
642 from the duplicate block, then we will need to add a new argument
643 to them. The argument should have the same value as the argument
644 associated with the outgoing edge stored in RD. */
645 copy_phi_args (e->dest, rd->path->last ()->e, e, rd->path, idx);
648 /* Look through PATH beginning at START and return TRUE if there are
649 any additional blocks that need to be duplicated. Otherwise,
650 return FALSE. */
651 static bool
652 any_remaining_duplicated_blocks (vec<jump_thread_edge *> *path,
653 unsigned int start)
655 for (unsigned int i = start + 1; i < path->length (); i++)
657 if ((*path)[i]->type == EDGE_COPY_SRC_JOINER_BLOCK
658 || (*path)[i]->type == EDGE_COPY_SRC_BLOCK)
659 return true;
661 return false;
665 /* Compute the amount of profile count coming into the jump threading
666 path stored in RD that we are duplicating, returned in PATH_IN_COUNT_PTR and
667 PATH_IN_FREQ_PTR, as well as the amount of counts flowing out of the
668 duplicated path, returned in PATH_OUT_COUNT_PTR. LOCAL_INFO is used to
669 identify blocks duplicated for jump threading, which have duplicated
670 edges that need to be ignored in the analysis. Return true if path contains
671 a joiner, false otherwise.
673 In the non-joiner case, this is straightforward - all the counts
674 flowing into the jump threading path should flow through the duplicated
675 block and out of the duplicated path.
677 In the joiner case, it is very tricky. Some of the counts flowing into
678 the original path go offpath at the joiner. The problem is that while
679 we know how much total count goes off-path in the original control flow,
680 we don't know how many of the counts corresponding to just the jump
681 threading path go offpath at the joiner.
683 For example, assume we have the following control flow and identified
684 jump threading paths:
686 A B C
687 \ | /
688 Ea \ |Eb / Ec
689 \ | /
690 v v v
691 J <-- Joiner
693 Eoff/ \Eon
696 Soff Son <--- Normal
698 Ed/ \ Ee
703 Jump threading paths: A -> J -> Son -> D (path 1)
704 C -> J -> Son -> E (path 2)
706 Note that the control flow could be more complicated:
707 - Each jump threading path may have more than one incoming edge. I.e. A and
708 Ea could represent multiple incoming blocks/edges that are included in
709 path 1.
710 - There could be EDGE_NO_COPY_SRC_BLOCK edges after the joiner (either
711 before or after the "normal" copy block). These are not duplicated onto
712 the jump threading path, as they are single-successor.
713 - Any of the blocks along the path may have other incoming edges that
714 are not part of any jump threading path, but add profile counts along
715 the path.
717 In the above example, after all jump threading is complete, we will
718 end up with the following control flow:
720 A B C
721 | | |
722 Ea| |Eb |Ec
723 | | |
724 v v v
725 Ja J Jc
726 / \ / \Eon' / \
727 Eona/ \ ---/---\-------- \Eonc
728 / \ / / \ \
729 v v v v v
730 Sona Soff Son Sonc
731 \ /\ /
732 \___________ / \ _____/
733 \ / \/
734 vv v
737 The main issue to notice here is that when we are processing path 1
738 (A->J->Son->D) we need to figure out the outgoing edge weights to
739 the duplicated edges Ja->Sona and Ja->Soff, while ensuring that the
740 sum of the incoming weights to D remain Ed. The problem with simply
741 assuming that Ja (and Jc when processing path 2) has the same outgoing
742 probabilities to its successors as the original block J, is that after
743 all paths are processed and other edges/counts removed (e.g. none
744 of Ec will reach D after processing path 2), we may end up with not
745 enough count flowing along duplicated edge Sona->D.
747 Therefore, in the case of a joiner, we keep track of all counts
748 coming in along the current path, as well as from predecessors not
749 on any jump threading path (Eb in the above example). While we
750 first assume that the duplicated Eona for Ja->Sona has the same
751 probability as the original, we later compensate for other jump
752 threading paths that may eliminate edges. We do that by keep track
753 of all counts coming into the original path that are not in a jump
754 thread (Eb in the above example, but as noted earlier, there could
755 be other predecessors incoming to the path at various points, such
756 as at Son). Call this cumulative non-path count coming into the path
757 before D as Enonpath. We then ensure that the count from Sona->D is as at
758 least as big as (Ed - Enonpath), but no bigger than the minimum
759 weight along the jump threading path. The probabilities of both the
760 original and duplicated joiner block J and Ja will be adjusted
761 accordingly after the updates. */
763 static bool
764 compute_path_counts (struct redirection_data *rd,
765 ssa_local_info_t *local_info,
766 profile_count *path_in_count_ptr,
767 profile_count *path_out_count_ptr)
769 edge e = rd->incoming_edges->e;
770 vec<jump_thread_edge *> *path = THREAD_PATH (e);
771 edge elast = path->last ()->e;
772 profile_count nonpath_count = profile_count::zero ();
773 bool has_joiner = false;
774 profile_count path_in_count = profile_count::zero ();
776 /* Start by accumulating incoming edge counts to the path's first bb
777 into a couple buckets:
778 path_in_count: total count of incoming edges that flow into the
779 current path.
780 nonpath_count: total count of incoming edges that are not
781 flowing along *any* path. These are the counts
782 that will still flow along the original path after
783 all path duplication is done by potentially multiple
784 calls to this routine.
785 (any other incoming edge counts are for a different jump threading
786 path that will be handled by a later call to this routine.)
787 To make this easier, start by recording all incoming edges that flow into
788 the current path in a bitmap. We could add up the path's incoming edge
789 counts here, but we still need to walk all the first bb's incoming edges
790 below to add up the counts of the other edges not included in this jump
791 threading path. */
792 struct el *next, *el;
793 auto_bitmap in_edge_srcs;
794 for (el = rd->incoming_edges; el; el = next)
796 next = el->next;
797 bitmap_set_bit (in_edge_srcs, el->e->src->index);
799 edge ein;
800 edge_iterator ei;
801 FOR_EACH_EDGE (ein, ei, e->dest->preds)
803 vec<jump_thread_edge *> *ein_path = THREAD_PATH (ein);
804 /* Simply check the incoming edge src against the set captured above. */
805 if (ein_path
806 && bitmap_bit_p (in_edge_srcs, (*ein_path)[0]->e->src->index))
808 /* It is necessary but not sufficient that the last path edges
809 are identical. There may be different paths that share the
810 same last path edge in the case where the last edge has a nocopy
811 source block. */
812 gcc_assert (ein_path->last ()->e == elast);
813 path_in_count += ein->count ();
815 else if (!ein_path)
817 /* Keep track of the incoming edges that are not on any jump-threading
818 path. These counts will still flow out of original path after all
819 jump threading is complete. */
820 nonpath_count += ein->count ();
824 /* Now compute the fraction of the total count coming into the first
825 path bb that is from the current threading path. */
826 profile_count total_count = e->dest->count;
827 /* Handle incoming profile insanities. */
828 if (total_count < path_in_count)
829 path_in_count = total_count;
830 profile_probability onpath_scale = path_in_count.probability_in (total_count);
832 /* Walk the entire path to do some more computation in order to estimate
833 how much of the path_in_count will flow out of the duplicated threading
834 path. In the non-joiner case this is straightforward (it should be
835 the same as path_in_count, although we will handle incoming profile
836 insanities by setting it equal to the minimum count along the path).
838 In the joiner case, we need to estimate how much of the path_in_count
839 will stay on the threading path after the joiner's conditional branch.
840 We don't really know for sure how much of the counts
841 associated with this path go to each successor of the joiner, but we'll
842 estimate based on the fraction of the total count coming into the path
843 bb was from the threading paths (computed above in onpath_scale).
844 Afterwards, we will need to do some fixup to account for other threading
845 paths and possible profile insanities.
847 In order to estimate the joiner case's counts we also need to update
848 nonpath_count with any additional counts coming into the path. Other
849 blocks along the path may have additional predecessors from outside
850 the path. */
851 profile_count path_out_count = path_in_count;
852 profile_count min_path_count = path_in_count;
853 for (unsigned int i = 1; i < path->length (); i++)
855 edge epath = (*path)[i]->e;
856 profile_count cur_count = epath->count ();
857 if ((*path)[i]->type == EDGE_COPY_SRC_JOINER_BLOCK)
859 has_joiner = true;
860 cur_count = cur_count.apply_probability (onpath_scale);
862 /* In the joiner case we need to update nonpath_count for any edges
863 coming into the path that will contribute to the count flowing
864 into the path successor. */
865 if (has_joiner && epath != elast)
867 /* Look for other incoming edges after joiner. */
868 FOR_EACH_EDGE (ein, ei, epath->dest->preds)
870 if (ein != epath
871 /* Ignore in edges from blocks we have duplicated for a
872 threading path, which have duplicated edge counts until
873 they are redirected by an invocation of this routine. */
874 && !bitmap_bit_p (local_info->duplicate_blocks,
875 ein->src->index))
876 nonpath_count += ein->count ();
879 if (cur_count < path_out_count)
880 path_out_count = cur_count;
881 if (epath->count () < min_path_count)
882 min_path_count = epath->count ();
885 /* We computed path_out_count above assuming that this path targeted
886 the joiner's on-path successor with the same likelihood as it
887 reached the joiner. However, other thread paths through the joiner
888 may take a different path through the normal copy source block
889 (i.e. they have a different elast), meaning that they do not
890 contribute any counts to this path's elast. As a result, it may
891 turn out that this path must have more count flowing to the on-path
892 successor of the joiner. Essentially, all of this path's elast
893 count must be contributed by this path and any nonpath counts
894 (since any path through the joiner with a different elast will not
895 include a copy of this elast in its duplicated path).
896 So ensure that this path's path_out_count is at least the
897 difference between elast->count () and nonpath_count. Otherwise the edge
898 counts after threading will not be sane. */
899 if (local_info->need_profile_correction
900 && has_joiner && path_out_count < elast->count () - nonpath_count)
902 path_out_count = elast->count () - nonpath_count;
903 /* But neither can we go above the minimum count along the path
904 we are duplicating. This can be an issue due to profile
905 insanities coming in to this pass. */
906 if (path_out_count > min_path_count)
907 path_out_count = min_path_count;
910 *path_in_count_ptr = path_in_count;
911 *path_out_count_ptr = path_out_count;
912 return has_joiner;
916 /* Update the counts and frequencies for both an original path
917 edge EPATH and its duplicate EDUP. The duplicate source block
918 will get a count of PATH_IN_COUNT and PATH_IN_FREQ,
919 and the duplicate edge EDUP will have a count of PATH_OUT_COUNT. */
920 static void
921 update_profile (edge epath, edge edup, profile_count path_in_count,
922 profile_count path_out_count)
925 /* First update the duplicated block's count. */
926 if (edup)
928 basic_block dup_block = edup->src;
930 /* Edup's count is reduced by path_out_count. We need to redistribute
931 probabilities to the remaining edges. */
933 edge esucc;
934 edge_iterator ei;
935 profile_probability edup_prob
936 = path_out_count.probability_in (path_in_count);
938 /* Either scale up or down the remaining edges.
939 probabilities are always in range <0,1> and thus we can't do
940 both by same loop. */
941 if (edup->probability > edup_prob)
943 profile_probability rev_scale
944 = (profile_probability::always () - edup->probability)
945 / (profile_probability::always () - edup_prob);
946 FOR_EACH_EDGE (esucc, ei, dup_block->succs)
947 if (esucc != edup)
948 esucc->probability /= rev_scale;
950 else if (edup->probability < edup_prob)
952 profile_probability scale
953 = (profile_probability::always () - edup_prob)
954 / (profile_probability::always () - edup->probability);
955 FOR_EACH_EDGE (esucc, ei, dup_block->succs)
956 if (esucc != edup)
957 esucc->probability *= scale;
959 if (edup_prob.initialized_p ())
960 edup->probability = edup_prob;
962 gcc_assert (!dup_block->count.initialized_p ());
963 dup_block->count = path_in_count;
966 if (path_in_count == profile_count::zero ())
967 return;
969 profile_count final_count = epath->count () - path_out_count;
971 /* Now update the original block's count in the
972 opposite manner - remove the counts/freq that will flow
973 into the duplicated block. Handle underflow due to precision/
974 rounding issues. */
975 epath->src->count -= path_in_count;
977 /* Next update this path edge's original and duplicated counts. We know
978 that the duplicated path will have path_out_count flowing
979 out of it (in the joiner case this is the count along the duplicated path
980 out of the duplicated joiner). This count can then be removed from the
981 original path edge. */
983 edge esucc;
984 edge_iterator ei;
985 profile_probability epath_prob = final_count.probability_in (epath->src->count);
987 if (epath->probability > epath_prob)
989 profile_probability rev_scale
990 = (profile_probability::always () - epath->probability)
991 / (profile_probability::always () - epath_prob);
992 FOR_EACH_EDGE (esucc, ei, epath->src->succs)
993 if (esucc != epath)
994 esucc->probability /= rev_scale;
996 else if (epath->probability < epath_prob)
998 profile_probability scale
999 = (profile_probability::always () - epath_prob)
1000 / (profile_probability::always () - epath->probability);
1001 FOR_EACH_EDGE (esucc, ei, epath->src->succs)
1002 if (esucc != epath)
1003 esucc->probability *= scale;
1005 if (epath_prob.initialized_p ())
1006 epath->probability = epath_prob;
1009 /* Wire up the outgoing edges from the duplicate blocks and
1010 update any PHIs as needed. Also update the profile counts
1011 on the original and duplicate blocks and edges. */
1012 void
1013 ssa_fix_duplicate_block_edges (struct redirection_data *rd,
1014 ssa_local_info_t *local_info)
1016 bool multi_incomings = (rd->incoming_edges->next != NULL);
1017 edge e = rd->incoming_edges->e;
1018 vec<jump_thread_edge *> *path = THREAD_PATH (e);
1019 edge elast = path->last ()->e;
1020 profile_count path_in_count = profile_count::zero ();
1021 profile_count path_out_count = profile_count::zero ();
1023 /* First determine how much profile count to move from original
1024 path to the duplicate path. This is tricky in the presence of
1025 a joiner (see comments for compute_path_counts), where some portion
1026 of the path's counts will flow off-path from the joiner. In the
1027 non-joiner case the path_in_count and path_out_count should be the
1028 same. */
1029 bool has_joiner = compute_path_counts (rd, local_info,
1030 &path_in_count, &path_out_count);
1032 for (unsigned int count = 0, i = 1; i < path->length (); i++)
1034 edge epath = (*path)[i]->e;
1036 /* If we were threading through an joiner block, then we want
1037 to keep its control statement and redirect an outgoing edge.
1038 Else we want to remove the control statement & edges, then create
1039 a new outgoing edge. In both cases we may need to update PHIs. */
1040 if ((*path)[i]->type == EDGE_COPY_SRC_JOINER_BLOCK)
1042 edge victim;
1043 edge e2;
1045 gcc_assert (has_joiner);
1047 /* This updates the PHIs at the destination of the duplicate
1048 block. Pass 0 instead of i if we are threading a path which
1049 has multiple incoming edges. */
1050 update_destination_phis (local_info->bb, rd->dup_blocks[count],
1051 path, multi_incomings ? 0 : i);
1053 /* Find the edge from the duplicate block to the block we're
1054 threading through. That's the edge we want to redirect. */
1055 victim = find_edge (rd->dup_blocks[count], (*path)[i]->e->dest);
1057 /* If there are no remaining blocks on the path to duplicate,
1058 then redirect VICTIM to the final destination of the jump
1059 threading path. */
1060 if (!any_remaining_duplicated_blocks (path, i))
1062 if (victim->dest != elast->dest)
1064 e2 = redirect_edge_and_branch (victim, elast->dest);
1065 /* If we redirected the edge, then we need to copy PHI arguments
1066 at the target. If the edge already existed (e2 != victim
1067 case), then the PHIs in the target already have the correct
1068 arguments. */
1069 if (e2 == victim)
1070 copy_phi_args (e2->dest, elast, e2,
1071 path, multi_incomings ? 0 : i);
1073 else
1074 e2 = victim;
1076 else
1078 /* Redirect VICTIM to the next duplicated block in the path. */
1079 e2 = redirect_edge_and_branch (victim, rd->dup_blocks[count + 1]);
1081 /* We need to update the PHIs in the next duplicated block. We
1082 want the new PHI args to have the same value as they had
1083 in the source of the next duplicate block.
1085 Thus, we need to know which edge we traversed into the
1086 source of the duplicate. Furthermore, we may have
1087 traversed many edges to reach the source of the duplicate.
1089 Walk through the path starting at element I until we
1090 hit an edge marked with EDGE_COPY_SRC_BLOCK. We want
1091 the edge from the prior element. */
1092 for (unsigned int j = i + 1; j < path->length (); j++)
1094 if ((*path)[j]->type == EDGE_COPY_SRC_BLOCK)
1096 copy_phi_arg_into_existing_phi ((*path)[j - 1]->e, e2);
1097 break;
1102 /* Update the counts of both the original block
1103 and path edge, and the duplicates. The path duplicate's
1104 incoming count are the totals for all edges
1105 incoming to this jump threading path computed earlier.
1106 And we know that the duplicated path will have path_out_count
1107 flowing out of it (i.e. along the duplicated path out of the
1108 duplicated joiner). */
1109 update_profile (epath, e2, path_in_count, path_out_count);
1111 else if ((*path)[i]->type == EDGE_COPY_SRC_BLOCK)
1113 remove_ctrl_stmt_and_useless_edges (rd->dup_blocks[count], NULL);
1114 create_edge_and_update_destination_phis (rd, rd->dup_blocks[count],
1115 multi_incomings ? 0 : i);
1116 if (count == 1)
1117 single_succ_edge (rd->dup_blocks[1])->aux = NULL;
1119 /* Update the counts of both the original block
1120 and path edge, and the duplicates. Since we are now after
1121 any joiner that may have existed on the path, the count
1122 flowing along the duplicated threaded path is path_out_count.
1123 If we didn't have a joiner, then cur_path_freq was the sum
1124 of the total frequencies along all incoming edges to the
1125 thread path (path_in_freq). If we had a joiner, it would have
1126 been updated at the end of that handling to the edge frequency
1127 along the duplicated joiner path edge. */
1128 update_profile (epath, EDGE_SUCC (rd->dup_blocks[count], 0),
1129 path_out_count, path_out_count);
1131 else
1133 /* No copy case. In this case we don't have an equivalent block
1134 on the duplicated thread path to update, but we do need
1135 to remove the portion of the counts/freqs that were moved
1136 to the duplicated path from the counts/freqs flowing through
1137 this block on the original path. Since all the no-copy edges
1138 are after any joiner, the removed count is the same as
1139 path_out_count.
1141 If we didn't have a joiner, then cur_path_freq was the sum
1142 of the total frequencies along all incoming edges to the
1143 thread path (path_in_freq). If we had a joiner, it would have
1144 been updated at the end of that handling to the edge frequency
1145 along the duplicated joiner path edge. */
1146 update_profile (epath, NULL, path_out_count, path_out_count);
1149 /* Increment the index into the duplicated path when we processed
1150 a duplicated block. */
1151 if ((*path)[i]->type == EDGE_COPY_SRC_JOINER_BLOCK
1152 || (*path)[i]->type == EDGE_COPY_SRC_BLOCK)
1154 count++;
1159 /* Hash table traversal callback routine to create duplicate blocks. */
1162 ssa_create_duplicates (struct redirection_data **slot,
1163 ssa_local_info_t *local_info)
1165 struct redirection_data *rd = *slot;
1167 /* The second duplicated block in a jump threading path is specific
1168 to the path. So it gets stored in RD rather than in LOCAL_DATA.
1170 Each time we're called, we have to look through the path and see
1171 if a second block needs to be duplicated.
1173 Note the search starts with the third edge on the path. The first
1174 edge is the incoming edge, the second edge always has its source
1175 duplicated. Thus we start our search with the third edge. */
1176 vec<jump_thread_edge *> *path = rd->path;
1177 for (unsigned int i = 2; i < path->length (); i++)
1179 if ((*path)[i]->type == EDGE_COPY_SRC_BLOCK
1180 || (*path)[i]->type == EDGE_COPY_SRC_JOINER_BLOCK)
1182 create_block_for_threading ((*path)[i]->e->src, rd, 1,
1183 &local_info->duplicate_blocks);
1184 break;
1188 /* Create a template block if we have not done so already. Otherwise
1189 use the template to create a new block. */
1190 if (local_info->template_block == NULL)
1192 create_block_for_threading ((*path)[1]->e->src, rd, 0,
1193 &local_info->duplicate_blocks);
1194 local_info->template_block = rd->dup_blocks[0];
1195 local_info->template_last_to_copy
1196 = gsi_last_bb (local_info->template_block);
1198 /* We do not create any outgoing edges for the template. We will
1199 take care of that in a later traversal. That way we do not
1200 create edges that are going to just be deleted. */
1202 else
1204 gimple_seq seq = NULL;
1205 if (gsi_stmt (local_info->template_last_to_copy)
1206 != gsi_stmt (gsi_last_bb (local_info->template_block)))
1208 if (gsi_end_p (local_info->template_last_to_copy))
1210 seq = bb_seq (local_info->template_block);
1211 set_bb_seq (local_info->template_block, NULL);
1213 else
1214 seq = gsi_split_seq_after (local_info->template_last_to_copy);
1216 create_block_for_threading (local_info->template_block, rd, 0,
1217 &local_info->duplicate_blocks);
1218 if (seq)
1220 if (gsi_end_p (local_info->template_last_to_copy))
1221 set_bb_seq (local_info->template_block, seq);
1222 else
1223 gsi_insert_seq_after (&local_info->template_last_to_copy,
1224 seq, GSI_SAME_STMT);
1227 /* Go ahead and wire up outgoing edges and update PHIs for the duplicate
1228 block. */
1229 ssa_fix_duplicate_block_edges (rd, local_info);
1232 if (MAY_HAVE_DEBUG_STMTS)
1234 /* Copy debug stmts from each NO_COPY src block to the block
1235 that would have been its predecessor, if we can append to it
1236 (we can't add stmts after a block-ending stmt), or prepending
1237 to the duplicate of the successor, if there is one. If
1238 there's no duplicate successor, we'll mostly drop the blocks
1239 on the floor; propagate_threaded_block_debug_into, called
1240 elsewhere, will consolidate and preserve the effects of the
1241 binds, but none of the markers. */
1242 gimple_stmt_iterator copy_to = gsi_last_bb (rd->dup_blocks[0]);
1243 if (!gsi_end_p (copy_to))
1245 if (stmt_ends_bb_p (gsi_stmt (copy_to)))
1247 if (rd->dup_blocks[1])
1248 copy_to = gsi_after_labels (rd->dup_blocks[1]);
1249 else
1250 copy_to = gsi_none ();
1252 else
1253 gsi_next (&copy_to);
1255 for (unsigned int i = 2, j = 0; i < path->length (); i++)
1256 if ((*path)[i]->type == EDGE_NO_COPY_SRC_BLOCK
1257 && gsi_bb (copy_to))
1259 for (gimple_stmt_iterator gsi = gsi_start_bb ((*path)[i]->e->src);
1260 !gsi_end_p (gsi); gsi_next (&gsi))
1262 if (!is_gimple_debug (gsi_stmt (gsi)))
1263 continue;
1264 gimple *stmt = gsi_stmt (gsi);
1265 gimple *copy = gimple_copy (stmt);
1266 gsi_insert_before (&copy_to, copy, GSI_SAME_STMT);
1269 else if ((*path)[i]->type == EDGE_COPY_SRC_BLOCK
1270 || (*path)[i]->type == EDGE_COPY_SRC_JOINER_BLOCK)
1272 j++;
1273 gcc_assert (j < 2);
1274 copy_to = gsi_last_bb (rd->dup_blocks[j]);
1275 if (!gsi_end_p (copy_to))
1277 if (stmt_ends_bb_p (gsi_stmt (copy_to)))
1278 copy_to = gsi_none ();
1279 else
1280 gsi_next (&copy_to);
1285 /* Keep walking the hash table. */
1286 return 1;
1289 /* We did not create any outgoing edges for the template block during
1290 block creation. This hash table traversal callback creates the
1291 outgoing edge for the template block. */
1293 inline int
1294 ssa_fixup_template_block (struct redirection_data **slot,
1295 ssa_local_info_t *local_info)
1297 struct redirection_data *rd = *slot;
1299 /* If this is the template block halt the traversal after updating
1300 it appropriately.
1302 If we were threading through an joiner block, then we want
1303 to keep its control statement and redirect an outgoing edge.
1304 Else we want to remove the control statement & edges, then create
1305 a new outgoing edge. In both cases we may need to update PHIs. */
1306 if (rd->dup_blocks[0] && rd->dup_blocks[0] == local_info->template_block)
1308 ssa_fix_duplicate_block_edges (rd, local_info);
1309 return 0;
1312 return 1;
1315 /* Hash table traversal callback to redirect each incoming edge
1316 associated with this hash table element to its new destination. */
1318 static int
1319 ssa_redirect_edges (struct redirection_data **slot,
1320 ssa_local_info_t *local_info)
1322 struct redirection_data *rd = *slot;
1323 struct el *next, *el;
1325 /* Walk over all the incoming edges associated with this hash table
1326 entry. */
1327 for (el = rd->incoming_edges; el; el = next)
1329 edge e = el->e;
1330 vec<jump_thread_edge *> *path = THREAD_PATH (e);
1332 /* Go ahead and free this element from the list. Doing this now
1333 avoids the need for another list walk when we destroy the hash
1334 table. */
1335 next = el->next;
1336 free (el);
1338 local_info->num_threaded_edges++;
1340 if (rd->dup_blocks[0])
1342 edge e2;
1344 if (dump_file && (dump_flags & TDF_DETAILS))
1345 fprintf (dump_file, " Threaded jump %d --> %d to %d\n",
1346 e->src->index, e->dest->index, rd->dup_blocks[0]->index);
1348 /* Redirect the incoming edge (possibly to the joiner block) to the
1349 appropriate duplicate block. */
1350 e2 = redirect_edge_and_branch (e, rd->dup_blocks[0]);
1351 gcc_assert (e == e2);
1352 flush_pending_stmts (e2);
1355 /* Go ahead and clear E->aux. It's not needed anymore and failure
1356 to clear it will cause all kinds of unpleasant problems later. */
1357 path->release ();
1358 e->aux = NULL;
1362 /* Indicate that we actually threaded one or more jumps. */
1363 if (rd->incoming_edges)
1364 local_info->jumps_threaded = true;
1366 return 1;
1369 /* Return true if this block has no executable statements other than
1370 a simple ctrl flow instruction. When the number of outgoing edges
1371 is one, this is equivalent to a "forwarder" block. */
1373 static bool
1374 redirection_block_p (basic_block bb)
1376 gimple_stmt_iterator gsi;
1378 /* Advance to the first executable statement. */
1379 gsi = gsi_start_bb (bb);
1380 while (!gsi_end_p (gsi)
1381 && (gimple_code (gsi_stmt (gsi)) == GIMPLE_LABEL
1382 || is_gimple_debug (gsi_stmt (gsi))
1383 || gimple_nop_p (gsi_stmt (gsi))
1384 || gimple_clobber_p (gsi_stmt (gsi))))
1385 gsi_next (&gsi);
1387 /* Check if this is an empty block. */
1388 if (gsi_end_p (gsi))
1389 return true;
1391 /* Test that we've reached the terminating control statement. */
1392 return gsi_stmt (gsi)
1393 && (gimple_code (gsi_stmt (gsi)) == GIMPLE_COND
1394 || gimple_code (gsi_stmt (gsi)) == GIMPLE_GOTO
1395 || gimple_code (gsi_stmt (gsi)) == GIMPLE_SWITCH);
1398 /* BB is a block which ends with a COND_EXPR or SWITCH_EXPR and when BB
1399 is reached via one or more specific incoming edges, we know which
1400 outgoing edge from BB will be traversed.
1402 We want to redirect those incoming edges to the target of the
1403 appropriate outgoing edge. Doing so avoids a conditional branch
1404 and may expose new optimization opportunities. Note that we have
1405 to update dominator tree and SSA graph after such changes.
1407 The key to keeping the SSA graph update manageable is to duplicate
1408 the side effects occurring in BB so that those side effects still
1409 occur on the paths which bypass BB after redirecting edges.
1411 We accomplish this by creating duplicates of BB and arranging for
1412 the duplicates to unconditionally pass control to one specific
1413 successor of BB. We then revector the incoming edges into BB to
1414 the appropriate duplicate of BB.
1416 If NOLOOP_ONLY is true, we only perform the threading as long as it
1417 does not affect the structure of the loops in a nontrivial way.
1419 If JOINERS is true, then thread through joiner blocks as well. */
1421 bool
1422 fwd_jt_path_registry::thread_block_1 (basic_block bb,
1423 bool noloop_only,
1424 bool joiners)
1426 /* E is an incoming edge into BB that we may or may not want to
1427 redirect to a duplicate of BB. */
1428 edge e, e2;
1429 edge_iterator ei;
1430 ssa_local_info_t local_info;
1432 local_info.duplicate_blocks = BITMAP_ALLOC (NULL);
1433 local_info.need_profile_correction = false;
1434 local_info.num_threaded_edges = 0;
1436 /* To avoid scanning a linear array for the element we need we instead
1437 use a hash table. For normal code there should be no noticeable
1438 difference. However, if we have a block with a large number of
1439 incoming and outgoing edges such linear searches can get expensive. */
1440 m_redirection_data
1441 = new hash_table<struct redirection_data> (EDGE_COUNT (bb->succs));
1443 /* Record each unique threaded destination into a hash table for
1444 efficient lookups. */
1445 edge last = NULL;
1446 FOR_EACH_EDGE (e, ei, bb->preds)
1448 if (e->aux == NULL)
1449 continue;
1451 vec<jump_thread_edge *> *path = THREAD_PATH (e);
1453 if (((*path)[1]->type == EDGE_COPY_SRC_JOINER_BLOCK && !joiners)
1454 || ((*path)[1]->type == EDGE_COPY_SRC_BLOCK && joiners))
1455 continue;
1457 e2 = path->last ()->e;
1458 if (!e2 || noloop_only)
1460 /* If NOLOOP_ONLY is true, we only allow threading through the
1461 header of a loop to exit edges. */
1463 /* One case occurs when there was loop header buried in a jump
1464 threading path that crosses loop boundaries. We do not try
1465 and thread this elsewhere, so just cancel the jump threading
1466 request by clearing the AUX field now. */
1467 if (bb->loop_father != e2->src->loop_father
1468 && (!loop_exit_edge_p (e2->src->loop_father, e2)
1469 || flow_loop_nested_p (bb->loop_father,
1470 e2->dest->loop_father)))
1472 /* Since this case is not handled by our special code
1473 to thread through a loop header, we must explicitly
1474 cancel the threading request here. */
1475 cancel_thread (path, "Threading through unhandled loop header");
1476 e->aux = NULL;
1477 continue;
1480 /* Another case occurs when trying to thread through our
1481 own loop header, possibly from inside the loop. We will
1482 thread these later. */
1483 unsigned int i;
1484 for (i = 1; i < path->length (); i++)
1486 if ((*path)[i]->e->src == bb->loop_father->header
1487 && (!loop_exit_edge_p (bb->loop_father, e2)
1488 || (*path)[1]->type == EDGE_COPY_SRC_JOINER_BLOCK))
1489 break;
1492 if (i != path->length ())
1493 continue;
1495 /* Loop parallelization can be confused by the result of
1496 threading through the loop exit test back into the loop.
1497 However, theading those jumps seems to help other codes.
1499 I have been unable to find anything related to the shape of
1500 the CFG, the contents of the affected blocks, etc which would
1501 allow a more sensible test than what we're using below which
1502 merely avoids the optimization when parallelizing loops. */
1503 if (flag_tree_parallelize_loops > 1)
1505 for (i = 1; i < path->length (); i++)
1506 if (bb->loop_father == e2->src->loop_father
1507 && loop_exits_from_bb_p (bb->loop_father,
1508 (*path)[i]->e->src)
1509 && !loop_exit_edge_p (bb->loop_father, e2))
1510 break;
1512 if (i != path->length ())
1514 cancel_thread (path, "Threading through loop exit");
1515 e->aux = NULL;
1516 continue;
1521 /* Insert the outgoing edge into the hash table if it is not
1522 already in the hash table. */
1523 lookup_redirection_data (e, INSERT);
1525 /* When we have thread paths through a common joiner with different
1526 final destinations, then we may need corrections to deal with
1527 profile insanities. See the big comment before compute_path_counts. */
1528 if ((*path)[1]->type == EDGE_COPY_SRC_JOINER_BLOCK)
1530 if (!last)
1531 last = e2;
1532 else if (e2 != last)
1533 local_info.need_profile_correction = true;
1537 /* We do not update dominance info. */
1538 free_dominance_info (CDI_DOMINATORS);
1540 /* We know we only thread through the loop header to loop exits.
1541 Let the basic block duplication hook know we are not creating
1542 a multiple entry loop. */
1543 if (noloop_only
1544 && bb == bb->loop_father->header)
1545 set_loop_copy (bb->loop_father, loop_outer (bb->loop_father));
1547 /* Now create duplicates of BB.
1549 Note that for a block with a high outgoing degree we can waste
1550 a lot of time and memory creating and destroying useless edges.
1552 So we first duplicate BB and remove the control structure at the
1553 tail of the duplicate as well as all outgoing edges from the
1554 duplicate. We then use that duplicate block as a template for
1555 the rest of the duplicates. */
1556 local_info.template_block = NULL;
1557 local_info.bb = bb;
1558 local_info.jumps_threaded = false;
1559 m_redirection_data->traverse <ssa_local_info_t *, ssa_create_duplicates>
1560 (&local_info);
1562 /* The template does not have an outgoing edge. Create that outgoing
1563 edge and update PHI nodes as the edge's target as necessary.
1565 We do this after creating all the duplicates to avoid creating
1566 unnecessary edges. */
1567 m_redirection_data->traverse <ssa_local_info_t *, ssa_fixup_template_block>
1568 (&local_info);
1570 /* The hash table traversals above created the duplicate blocks (and the
1571 statements within the duplicate blocks). This loop creates PHI nodes for
1572 the duplicated blocks and redirects the incoming edges into BB to reach
1573 the duplicates of BB. */
1574 m_redirection_data->traverse <ssa_local_info_t *, ssa_redirect_edges>
1575 (&local_info);
1577 /* Done with this block. Clear REDIRECTION_DATA. */
1578 delete m_redirection_data;
1579 m_redirection_data = NULL;
1581 if (noloop_only
1582 && bb == bb->loop_father->header)
1583 set_loop_copy (bb->loop_father, NULL);
1585 BITMAP_FREE (local_info.duplicate_blocks);
1586 local_info.duplicate_blocks = NULL;
1588 m_num_threaded_edges += local_info.num_threaded_edges;
1590 /* Indicate to our caller whether or not any jumps were threaded. */
1591 return local_info.jumps_threaded;
1594 /* Wrapper for thread_block_1 so that we can first handle jump
1595 thread paths which do not involve copying joiner blocks, then
1596 handle jump thread paths which have joiner blocks.
1598 By doing things this way we can be as aggressive as possible and
1599 not worry that copying a joiner block will create a jump threading
1600 opportunity. */
1602 bool
1603 fwd_jt_path_registry::thread_block (basic_block bb, bool noloop_only)
1605 bool retval;
1606 retval = thread_block_1 (bb, noloop_only, false);
1607 retval |= thread_block_1 (bb, noloop_only, true);
1608 return retval;
1611 /* Callback for dfs_enumerate_from. Returns true if BB is different
1612 from STOP and DBDS_CE_STOP. */
1614 static basic_block dbds_ce_stop;
1615 static bool
1616 dbds_continue_enumeration_p (const_basic_block bb, const void *stop)
1618 return (bb != (const_basic_block) stop
1619 && bb != dbds_ce_stop);
1622 /* Evaluates the dominance relationship of latch of the LOOP and BB, and
1623 returns the state. */
1625 enum bb_dom_status
1626 determine_bb_domination_status (class loop *loop, basic_block bb)
1628 basic_block *bblocks;
1629 unsigned nblocks, i;
1630 bool bb_reachable = false;
1631 edge_iterator ei;
1632 edge e;
1634 /* This function assumes BB is a successor of LOOP->header.
1635 If that is not the case return DOMST_NONDOMINATING which
1636 is always safe. */
1638 bool ok = false;
1640 FOR_EACH_EDGE (e, ei, bb->preds)
1642 if (e->src == loop->header)
1644 ok = true;
1645 break;
1649 if (!ok)
1650 return DOMST_NONDOMINATING;
1653 if (bb == loop->latch)
1654 return DOMST_DOMINATING;
1656 /* Check that BB dominates LOOP->latch, and that it is back-reachable
1657 from it. */
1659 bblocks = XCNEWVEC (basic_block, loop->num_nodes);
1660 dbds_ce_stop = loop->header;
1661 nblocks = dfs_enumerate_from (loop->latch, 1, dbds_continue_enumeration_p,
1662 bblocks, loop->num_nodes, bb);
1663 for (i = 0; i < nblocks; i++)
1664 FOR_EACH_EDGE (e, ei, bblocks[i]->preds)
1666 if (e->src == loop->header)
1668 free (bblocks);
1669 return DOMST_NONDOMINATING;
1671 if (e->src == bb)
1672 bb_reachable = true;
1675 free (bblocks);
1676 return (bb_reachable ? DOMST_DOMINATING : DOMST_LOOP_BROKEN);
1679 /* Thread jumps through the header of LOOP. Returns true if cfg changes.
1680 If MAY_PEEL_LOOP_HEADERS is false, we avoid threading from entry edges
1681 to the inside of the loop. */
1683 bool
1684 fwd_jt_path_registry::thread_through_loop_header (class loop *loop,
1685 bool may_peel_loop_headers)
1687 basic_block header = loop->header;
1688 edge e, tgt_edge, latch = loop_latch_edge (loop);
1689 edge_iterator ei;
1690 basic_block tgt_bb, atgt_bb;
1691 enum bb_dom_status domst;
1693 /* We have already threaded through headers to exits, so all the threading
1694 requests now are to the inside of the loop. We need to avoid creating
1695 irreducible regions (i.e., loops with more than one entry block), and
1696 also loop with several latch edges, or new subloops of the loop (although
1697 there are cases where it might be appropriate, it is difficult to decide,
1698 and doing it wrongly may confuse other optimizers).
1700 We could handle more general cases here. However, the intention is to
1701 preserve some information about the loop, which is impossible if its
1702 structure changes significantly, in a way that is not well understood.
1703 Thus we only handle few important special cases, in which also updating
1704 of the loop-carried information should be feasible:
1706 1) Propagation of latch edge to a block that dominates the latch block
1707 of a loop. This aims to handle the following idiom:
1709 first = 1;
1710 while (1)
1712 if (first)
1713 initialize;
1714 first = 0;
1715 body;
1718 After threading the latch edge, this becomes
1720 first = 1;
1721 if (first)
1722 initialize;
1723 while (1)
1725 first = 0;
1726 body;
1729 The original header of the loop is moved out of it, and we may thread
1730 the remaining edges through it without further constraints.
1732 2) All entry edges are propagated to a single basic block that dominates
1733 the latch block of the loop. This aims to handle the following idiom
1734 (normally created for "for" loops):
1736 i = 0;
1737 while (1)
1739 if (i >= 100)
1740 break;
1741 body;
1742 i++;
1745 This becomes
1747 i = 0;
1748 while (1)
1750 body;
1751 i++;
1752 if (i >= 100)
1753 break;
1757 /* Threading through the header won't improve the code if the header has just
1758 one successor. */
1759 if (single_succ_p (header))
1760 goto fail;
1762 if (!may_peel_loop_headers && !redirection_block_p (loop->header))
1763 goto fail;
1764 else
1766 tgt_bb = NULL;
1767 tgt_edge = NULL;
1768 FOR_EACH_EDGE (e, ei, header->preds)
1770 if (!e->aux)
1772 if (e == latch)
1773 continue;
1775 /* If latch is not threaded, and there is a header
1776 edge that is not threaded, we would create loop
1777 with multiple entries. */
1778 goto fail;
1781 vec<jump_thread_edge *> *path = THREAD_PATH (e);
1783 if ((*path)[1]->type == EDGE_COPY_SRC_JOINER_BLOCK)
1784 goto fail;
1785 tgt_edge = (*path)[1]->e;
1786 atgt_bb = tgt_edge->dest;
1787 if (!tgt_bb)
1788 tgt_bb = atgt_bb;
1789 /* Two targets of threading would make us create loop
1790 with multiple entries. */
1791 else if (tgt_bb != atgt_bb)
1792 goto fail;
1795 if (!tgt_bb)
1797 /* There are no threading requests. */
1798 return false;
1801 /* Redirecting to empty loop latch is useless. */
1802 if (tgt_bb == loop->latch
1803 && empty_block_p (loop->latch))
1804 goto fail;
1807 /* The target block must dominate the loop latch, otherwise we would be
1808 creating a subloop. */
1809 domst = determine_bb_domination_status (loop, tgt_bb);
1810 if (domst == DOMST_NONDOMINATING)
1811 goto fail;
1812 if (domst == DOMST_LOOP_BROKEN)
1814 /* If the loop ceased to exist, mark it as such, and thread through its
1815 original header. */
1816 mark_loop_for_removal (loop);
1817 return thread_block (header, false);
1820 if (tgt_bb->loop_father->header == tgt_bb)
1822 /* If the target of the threading is a header of a subloop, we need
1823 to create a preheader for it, so that the headers of the two loops
1824 do not merge. */
1825 if (EDGE_COUNT (tgt_bb->preds) > 2)
1827 tgt_bb = create_preheader (tgt_bb->loop_father, 0);
1828 gcc_assert (tgt_bb != NULL);
1830 else
1831 tgt_bb = split_edge (tgt_edge);
1834 basic_block new_preheader;
1836 /* Now consider the case entry edges are redirected to the new entry
1837 block. Remember one entry edge, so that we can find the new
1838 preheader (its destination after threading). */
1839 FOR_EACH_EDGE (e, ei, header->preds)
1841 if (e->aux)
1842 break;
1845 /* The duplicate of the header is the new preheader of the loop. Ensure
1846 that it is placed correctly in the loop hierarchy. */
1847 set_loop_copy (loop, loop_outer (loop));
1849 thread_block (header, false);
1850 set_loop_copy (loop, NULL);
1851 new_preheader = e->dest;
1853 /* Create the new latch block. This is always necessary, as the latch
1854 must have only a single successor, but the original header had at
1855 least two successors. */
1856 loop->latch = NULL;
1857 mfb_kj_edge = single_succ_edge (new_preheader);
1858 loop->header = mfb_kj_edge->dest;
1859 latch = make_forwarder_block (tgt_bb, mfb_keep_just, NULL);
1860 loop->header = latch->dest;
1861 loop->latch = latch->src;
1862 return true;
1864 fail:
1865 /* We failed to thread anything. Cancel the requests. */
1866 FOR_EACH_EDGE (e, ei, header->preds)
1868 vec<jump_thread_edge *> *path = THREAD_PATH (e);
1870 if (path)
1872 cancel_thread (path, "Failure in thread_through_loop_header");
1873 e->aux = NULL;
1876 return false;
1879 /* E1 and E2 are edges into the same basic block. Return TRUE if the
1880 PHI arguments associated with those edges are equal or there are no
1881 PHI arguments, otherwise return FALSE. */
1883 static bool
1884 phi_args_equal_on_edges (edge e1, edge e2)
1886 gphi_iterator gsi;
1887 int indx1 = e1->dest_idx;
1888 int indx2 = e2->dest_idx;
1890 for (gsi = gsi_start_phis (e1->dest); !gsi_end_p (gsi); gsi_next (&gsi))
1892 gphi *phi = gsi.phi ();
1894 if (!operand_equal_p (gimple_phi_arg_def (phi, indx1),
1895 gimple_phi_arg_def (phi, indx2), 0))
1896 return false;
1898 return true;
1901 /* Return the number of non-debug statements and non-virtual PHIs in a
1902 block. */
1904 static unsigned int
1905 count_stmts_and_phis_in_block (basic_block bb)
1907 unsigned int num_stmts = 0;
1909 gphi_iterator gpi;
1910 for (gpi = gsi_start_phis (bb); !gsi_end_p (gpi); gsi_next (&gpi))
1911 if (!virtual_operand_p (PHI_RESULT (gpi.phi ())))
1912 num_stmts++;
1914 gimple_stmt_iterator gsi;
1915 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1917 gimple *stmt = gsi_stmt (gsi);
1918 if (!is_gimple_debug (stmt))
1919 num_stmts++;
1922 return num_stmts;
1926 /* Walk through the registered jump threads and convert them into a
1927 form convenient for this pass.
1929 Any block which has incoming edges threaded to outgoing edges
1930 will have its entry in THREADED_BLOCK set.
1932 Any threaded edge will have its new outgoing edge stored in the
1933 original edge's AUX field.
1935 This form avoids the need to walk all the edges in the CFG to
1936 discover blocks which need processing and avoids unnecessary
1937 hash table lookups to map from threaded edge to new target. */
1939 void
1940 fwd_jt_path_registry::mark_threaded_blocks (bitmap threaded_blocks)
1942 unsigned int i;
1943 bitmap_iterator bi;
1944 auto_bitmap tmp;
1945 basic_block bb;
1946 edge e;
1947 edge_iterator ei;
1949 /* It is possible to have jump threads in which one is a subpath
1950 of the other. ie, (A, B), (B, C), (C, D) where B is a joiner
1951 block and (B, C), (C, D) where no joiner block exists.
1953 When this occurs ignore the jump thread request with the joiner
1954 block. It's totally subsumed by the simpler jump thread request.
1956 This results in less block copying, simpler CFGs. More importantly,
1957 when we duplicate the joiner block, B, in this case we will create
1958 a new threading opportunity that we wouldn't be able to optimize
1959 until the next jump threading iteration.
1961 So first convert the jump thread requests which do not require a
1962 joiner block. */
1963 for (i = 0; i < m_paths.length (); i++)
1965 vec<jump_thread_edge *> *path = m_paths[i];
1967 if (path->length () > 1
1968 && (*path)[1]->type != EDGE_COPY_SRC_JOINER_BLOCK)
1970 edge e = (*path)[0]->e;
1971 e->aux = (void *)path;
1972 bitmap_set_bit (tmp, e->dest->index);
1976 /* Now iterate again, converting cases where we want to thread
1977 through a joiner block, but only if no other edge on the path
1978 already has a jump thread attached to it. We do this in two passes,
1979 to avoid situations where the order in the paths vec can hide overlapping
1980 threads (the path is recorded on the incoming edge, so we would miss
1981 cases where the second path starts at a downstream edge on the same
1982 path). First record all joiner paths, deleting any in the unexpected
1983 case where there is already a path for that incoming edge. */
1984 for (i = 0; i < m_paths.length ();)
1986 vec<jump_thread_edge *> *path = m_paths[i];
1988 if (path->length () > 1
1989 && (*path)[1]->type == EDGE_COPY_SRC_JOINER_BLOCK)
1991 /* Attach the path to the starting edge if none is yet recorded. */
1992 if ((*path)[0]->e->aux == NULL)
1994 (*path)[0]->e->aux = path;
1995 i++;
1997 else
1999 m_paths.unordered_remove (i);
2000 cancel_thread (path);
2003 else
2005 i++;
2009 /* Second, look for paths that have any other jump thread attached to
2010 them, and either finish converting them or cancel them. */
2011 for (i = 0; i < m_paths.length ();)
2013 vec<jump_thread_edge *> *path = m_paths[i];
2014 edge e = (*path)[0]->e;
2016 if (path->length () > 1
2017 && (*path)[1]->type == EDGE_COPY_SRC_JOINER_BLOCK && e->aux == path)
2019 unsigned int j;
2020 for (j = 1; j < path->length (); j++)
2021 if ((*path)[j]->e->aux != NULL)
2022 break;
2024 /* If we iterated through the entire path without exiting the loop,
2025 then we are good to go, record it. */
2026 if (j == path->length ())
2028 bitmap_set_bit (tmp, e->dest->index);
2029 i++;
2031 else
2033 e->aux = NULL;
2034 m_paths.unordered_remove (i);
2035 cancel_thread (path);
2038 else
2040 i++;
2044 /* When optimizing for size, prune all thread paths where statement
2045 duplication is necessary.
2047 We walk the jump thread path looking for copied blocks. There's
2048 two types of copied blocks.
2050 EDGE_COPY_SRC_JOINER_BLOCK is always copied and thus we will
2051 cancel the jump threading request when optimizing for size.
2053 EDGE_COPY_SRC_BLOCK which is copied, but some of its statements
2054 will be killed by threading. If threading does not kill all of
2055 its statements, then we should cancel the jump threading request
2056 when optimizing for size. */
2057 if (optimize_function_for_size_p (cfun))
2059 EXECUTE_IF_SET_IN_BITMAP (tmp, 0, i, bi)
2061 FOR_EACH_EDGE (e, ei, BASIC_BLOCK_FOR_FN (cfun, i)->preds)
2062 if (e->aux)
2064 vec<jump_thread_edge *> *path = THREAD_PATH (e);
2066 unsigned int j;
2067 for (j = 1; j < path->length (); j++)
2069 bb = (*path)[j]->e->src;
2070 if (redirection_block_p (bb))
2072 else if ((*path)[j]->type == EDGE_COPY_SRC_JOINER_BLOCK
2073 || ((*path)[j]->type == EDGE_COPY_SRC_BLOCK
2074 && (count_stmts_and_phis_in_block (bb)
2075 != estimate_threading_killed_stmts (bb))))
2076 break;
2079 if (j != path->length ())
2081 cancel_thread (path);
2082 e->aux = NULL;
2084 else
2085 bitmap_set_bit (threaded_blocks, i);
2089 else
2090 bitmap_copy (threaded_blocks, tmp);
2092 /* If we have a joiner block (J) which has two successors S1 and S2 and
2093 we are threading though S1 and the final destination of the thread
2094 is S2, then we must verify that any PHI nodes in S2 have the same
2095 PHI arguments for the edge J->S2 and J->S1->...->S2.
2097 We used to detect this prior to registering the jump thread, but
2098 that prohibits propagation of edge equivalences into non-dominated
2099 PHI nodes as the equivalency test might occur before propagation.
2101 This must also occur after we truncate any jump threading paths
2102 as this scenario may only show up after truncation.
2104 This works for now, but will need improvement as part of the FSA
2105 optimization.
2107 Note since we've moved the thread request data to the edges,
2108 we have to iterate on those rather than the threaded_edges vector. */
2109 EXECUTE_IF_SET_IN_BITMAP (tmp, 0, i, bi)
2111 bb = BASIC_BLOCK_FOR_FN (cfun, i);
2112 FOR_EACH_EDGE (e, ei, bb->preds)
2114 if (e->aux)
2116 vec<jump_thread_edge *> *path = THREAD_PATH (e);
2117 bool have_joiner = ((*path)[1]->type == EDGE_COPY_SRC_JOINER_BLOCK);
2119 if (have_joiner)
2121 basic_block joiner = e->dest;
2122 edge final_edge = path->last ()->e;
2123 basic_block final_dest = final_edge->dest;
2124 edge e2 = find_edge (joiner, final_dest);
2126 if (e2 && !phi_args_equal_on_edges (e2, final_edge))
2128 cancel_thread (path);
2129 e->aux = NULL;
2136 /* Look for jump threading paths which cross multiple loop headers.
2138 The code to thread through loop headers will change the CFG in ways
2139 that invalidate the cached loop iteration information. So we must
2140 detect that case and wipe the cached information. */
2141 EXECUTE_IF_SET_IN_BITMAP (tmp, 0, i, bi)
2143 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i);
2144 FOR_EACH_EDGE (e, ei, bb->preds)
2146 if (e->aux)
2148 gcc_assert (loops_state_satisfies_p
2149 (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS));
2150 vec<jump_thread_edge *> *path = THREAD_PATH (e);
2152 for (unsigned int i = 0, crossed_headers = 0;
2153 i < path->length ();
2154 i++)
2156 basic_block dest = (*path)[i]->e->dest;
2157 basic_block src = (*path)[i]->e->src;
2158 /* If we enter a loop. */
2159 if (flow_loop_nested_p (src->loop_father, dest->loop_father))
2160 ++crossed_headers;
2161 /* If we step from a block outside an irreducible region
2162 to a block inside an irreducible region, then we have
2163 crossed into a loop. */
2164 else if (! (src->flags & BB_IRREDUCIBLE_LOOP)
2165 && (dest->flags & BB_IRREDUCIBLE_LOOP))
2166 ++crossed_headers;
2167 if (crossed_headers > 1)
2169 vect_free_loop_info_assumptions
2170 ((*path)[path->length () - 1]->e->dest->loop_father);
2171 break;
2180 /* Verify that the REGION is a valid jump thread. A jump thread is a special
2181 case of SEME Single Entry Multiple Exits region in which all nodes in the
2182 REGION have exactly one incoming edge. The only exception is the first block
2183 that may not have been connected to the rest of the cfg yet. */
2185 DEBUG_FUNCTION void
2186 verify_jump_thread (basic_block *region, unsigned n_region)
2188 for (unsigned i = 0; i < n_region; i++)
2189 gcc_assert (EDGE_COUNT (region[i]->preds) <= 1);
2192 /* Return true when BB is one of the first N items in BBS. */
2194 static inline bool
2195 bb_in_bbs (basic_block bb, basic_block *bbs, int n)
2197 for (int i = 0; i < n; i++)
2198 if (bb == bbs[i])
2199 return true;
2201 return false;
2204 void
2205 jt_path_registry::debug_path (FILE *dump_file, int pathno)
2207 vec<jump_thread_edge *> *p = m_paths[pathno];
2208 fprintf (dump_file, "path: ");
2209 for (unsigned i = 0; i < p->length (); ++i)
2210 fprintf (dump_file, "%d -> %d, ",
2211 (*p)[i]->e->src->index, (*p)[i]->e->dest->index);
2212 fprintf (dump_file, "\n");
2215 void
2216 jt_path_registry::debug ()
2218 for (unsigned i = 0; i < m_paths.length (); ++i)
2219 debug_path (stderr, i);
2222 /* Rewire a jump_thread_edge so that the source block is now a
2223 threaded source block.
2225 PATH_NUM is an index into the global path table PATHS.
2226 EDGE_NUM is the jump thread edge number into said path.
2228 Returns TRUE if we were able to successfully rewire the edge. */
2230 bool
2231 back_jt_path_registry::rewire_first_differing_edge (unsigned path_num,
2232 unsigned edge_num)
2234 vec<jump_thread_edge *> *path = m_paths[path_num];
2235 edge &e = (*path)[edge_num]->e;
2236 if (dump_file && (dump_flags & TDF_DETAILS))
2237 fprintf (dump_file, "rewiring edge candidate: %d -> %d\n",
2238 e->src->index, e->dest->index);
2239 basic_block src_copy = get_bb_copy (e->src);
2240 if (src_copy == NULL)
2242 if (dump_file && (dump_flags & TDF_DETAILS))
2243 fprintf (dump_file, "ignoring candidate: there is no src COPY\n");
2244 return false;
2246 edge new_edge = find_edge (src_copy, e->dest);
2247 /* If the previously threaded paths created a flow graph where we
2248 can no longer figure out where to go, give up. */
2249 if (new_edge == NULL)
2251 if (dump_file && (dump_flags & TDF_DETAILS))
2252 fprintf (dump_file, "ignoring candidate: we lost our way\n");
2253 return false;
2255 e = new_edge;
2256 return true;
2259 /* After a path has been jump threaded, adjust the remaining paths
2260 that are subsets of this path, so these paths can be safely
2261 threaded within the context of the new threaded path.
2263 For example, suppose we have just threaded:
2265 5 -> 6 -> 7 -> 8 -> 12 => 5 -> 6' -> 7' -> 8' -> 12'
2267 And we have an upcoming threading candidate:
2268 5 -> 6 -> 7 -> 8 -> 15 -> 20
2270 This function adjusts the upcoming path into:
2271 8' -> 15 -> 20
2273 CURR_PATH_NUM is an index into the global paths table. It
2274 specifies the path that was just threaded. */
2276 void
2277 back_jt_path_registry::adjust_paths_after_duplication (unsigned curr_path_num)
2279 vec<jump_thread_edge *> *curr_path = m_paths[curr_path_num];
2281 /* Iterate through all the other paths and adjust them. */
2282 for (unsigned cand_path_num = 0; cand_path_num < m_paths.length (); )
2284 if (cand_path_num == curr_path_num)
2286 ++cand_path_num;
2287 continue;
2289 /* Make sure the candidate to adjust starts with the same path
2290 as the recently threaded path. */
2291 vec<jump_thread_edge *> *cand_path = m_paths[cand_path_num];
2292 if ((*cand_path)[0]->e != (*curr_path)[0]->e)
2294 ++cand_path_num;
2295 continue;
2297 if (dump_file && (dump_flags & TDF_DETAILS))
2299 fprintf (dump_file, "adjusting candidate: ");
2300 debug_path (dump_file, cand_path_num);
2303 /* Chop off from the candidate path any prefix it shares with
2304 the recently threaded path. */
2305 unsigned minlength = MIN (curr_path->length (), cand_path->length ());
2306 unsigned j;
2307 for (j = 0; j < minlength; ++j)
2309 edge cand_edge = (*cand_path)[j]->e;
2310 edge curr_edge = (*curr_path)[j]->e;
2312 /* Once the prefix no longer matches, adjust the first
2313 non-matching edge to point from an adjusted edge to
2314 wherever it was going. */
2315 if (cand_edge != curr_edge)
2317 gcc_assert (cand_edge->src == curr_edge->src);
2318 if (!rewire_first_differing_edge (cand_path_num, j))
2319 goto remove_candidate_from_list;
2320 break;
2323 if (j == minlength)
2325 /* If we consumed the max subgraph we could look at, and
2326 still didn't find any different edges, it's the
2327 last edge after MINLENGTH. */
2328 if (cand_path->length () > minlength)
2330 if (!rewire_first_differing_edge (cand_path_num, j))
2331 goto remove_candidate_from_list;
2333 else if (dump_file && (dump_flags & TDF_DETAILS))
2334 fprintf (dump_file, "adjusting first edge after MINLENGTH.\n");
2336 if (j > 0)
2338 /* If we are removing everything, delete the entire candidate. */
2339 if (j == cand_path->length ())
2341 remove_candidate_from_list:
2342 cancel_thread (cand_path, "Adjusted candidate is EMPTY");
2343 m_paths.unordered_remove (cand_path_num);
2344 continue;
2346 /* Otherwise, just remove the redundant sub-path. */
2347 if (cand_path->length () - j > 1)
2348 cand_path->block_remove (0, j);
2349 else if (dump_file && (dump_flags & TDF_DETAILS))
2350 fprintf (dump_file, "Dropping illformed candidate.\n");
2352 if (dump_file && (dump_flags & TDF_DETAILS))
2354 fprintf (dump_file, "adjusted candidate: ");
2355 debug_path (dump_file, cand_path_num);
2357 ++cand_path_num;
2361 /* Duplicates a jump-thread path of N_REGION basic blocks.
2362 The ENTRY edge is redirected to the duplicate of the region.
2364 Remove the last conditional statement in the last basic block in the REGION,
2365 and create a single fallthru edge pointing to the same destination as the
2366 EXIT edge.
2368 CURRENT_PATH_NO is an index into the global paths[] table
2369 specifying the jump-thread path.
2371 Returns false if it is unable to copy the region, true otherwise. */
2373 bool
2374 back_jt_path_registry::duplicate_thread_path (edge entry,
2375 edge exit,
2376 basic_block *region,
2377 unsigned n_region,
2378 unsigned current_path_no)
2380 unsigned i;
2381 class loop *loop = entry->dest->loop_father;
2382 edge exit_copy;
2383 edge redirected;
2384 profile_count curr_count;
2386 if (!can_copy_bbs_p (region, n_region))
2387 return false;
2389 /* Some sanity checking. Note that we do not check for all possible
2390 missuses of the functions. I.e. if you ask to copy something weird,
2391 it will work, but the state of structures probably will not be
2392 correct. */
2393 for (i = 0; i < n_region; i++)
2395 /* We do not handle subloops, i.e. all the blocks must belong to the
2396 same loop. */
2397 if (region[i]->loop_father != loop)
2398 return false;
2401 initialize_original_copy_tables ();
2403 set_loop_copy (loop, loop);
2405 basic_block *region_copy = XNEWVEC (basic_block, n_region);
2406 copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop,
2407 split_edge_bb_loc (entry), false);
2409 /* Fix up: copy_bbs redirects all edges pointing to copied blocks. The
2410 following code ensures that all the edges exiting the jump-thread path are
2411 redirected back to the original code: these edges are exceptions
2412 invalidating the property that is propagated by executing all the blocks of
2413 the jump-thread path in order. */
2415 curr_count = entry->count ();
2417 for (i = 0; i < n_region; i++)
2419 edge e;
2420 edge_iterator ei;
2421 basic_block bb = region_copy[i];
2423 /* Watch inconsistent profile. */
2424 if (curr_count > region[i]->count)
2425 curr_count = region[i]->count;
2426 /* Scale current BB. */
2427 if (region[i]->count.nonzero_p () && curr_count.initialized_p ())
2429 /* In the middle of the path we only scale the frequencies.
2430 In last BB we need to update probabilities of outgoing edges
2431 because we know which one is taken at the threaded path. */
2432 if (i + 1 != n_region)
2433 scale_bbs_frequencies_profile_count (region + i, 1,
2434 region[i]->count - curr_count,
2435 region[i]->count);
2436 else
2437 update_bb_profile_for_threading (region[i],
2438 curr_count,
2439 exit);
2440 scale_bbs_frequencies_profile_count (region_copy + i, 1, curr_count,
2441 region_copy[i]->count);
2444 if (single_succ_p (bb))
2446 /* Make sure the successor is the next node in the path. */
2447 gcc_assert (i + 1 == n_region
2448 || region_copy[i + 1] == single_succ_edge (bb)->dest);
2449 if (i + 1 != n_region)
2451 curr_count = single_succ_edge (bb)->count ();
2453 continue;
2456 /* Special case the last block on the path: make sure that it does not
2457 jump back on the copied path, including back to itself. */
2458 if (i + 1 == n_region)
2460 FOR_EACH_EDGE (e, ei, bb->succs)
2461 if (bb_in_bbs (e->dest, region_copy, n_region))
2463 basic_block orig = get_bb_original (e->dest);
2464 if (orig)
2465 redirect_edge_and_branch_force (e, orig);
2467 continue;
2470 /* Redirect all other edges jumping to non-adjacent blocks back to the
2471 original code. */
2472 FOR_EACH_EDGE (e, ei, bb->succs)
2473 if (region_copy[i + 1] != e->dest)
2475 basic_block orig = get_bb_original (e->dest);
2476 if (orig)
2477 redirect_edge_and_branch_force (e, orig);
2479 else
2481 curr_count = e->count ();
2486 if (flag_checking)
2487 verify_jump_thread (region_copy, n_region);
2489 /* Remove the last branch in the jump thread path. */
2490 remove_ctrl_stmt_and_useless_edges (region_copy[n_region - 1], exit->dest);
2492 /* And fixup the flags on the single remaining edge. */
2493 edge fix_e = find_edge (region_copy[n_region - 1], exit->dest);
2494 fix_e->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE | EDGE_ABNORMAL);
2495 fix_e->flags |= EDGE_FALLTHRU;
2497 edge e = make_edge (region_copy[n_region - 1], exit->dest, EDGE_FALLTHRU);
2499 if (e)
2501 rescan_loop_exit (e, true, false);
2502 e->probability = profile_probability::always ();
2505 /* Redirect the entry and add the phi node arguments. */
2506 if (entry->dest == loop->header)
2507 mark_loop_for_removal (loop);
2508 redirected = redirect_edge_and_branch (entry, get_bb_copy (entry->dest));
2509 gcc_assert (redirected != NULL);
2510 flush_pending_stmts (entry);
2512 /* Add the other PHI node arguments. */
2513 add_phi_args_after_copy (region_copy, n_region, NULL);
2515 free (region_copy);
2517 adjust_paths_after_duplication (current_path_no);
2519 free_original_copy_tables ();
2520 return true;
2523 /* Return true when PATH is a valid jump-thread path. */
2525 static bool
2526 valid_jump_thread_path (vec<jump_thread_edge *> *path)
2528 unsigned len = path->length ();
2530 /* Check that the path is connected. */
2531 for (unsigned int j = 0; j < len - 1; j++)
2533 edge e = (*path)[j]->e;
2534 if (e->dest != (*path)[j+1]->e->src)
2535 return false;
2537 return true;
2540 /* Remove any queued jump threads that include edge E.
2542 We don't actually remove them here, just record the edges into ax
2543 hash table. That way we can do the search once per iteration of
2544 DOM/VRP rather than for every case where DOM optimizes away a COND_EXPR. */
2546 void
2547 fwd_jt_path_registry::remove_jump_threads_including (edge_def *e)
2549 if (!m_paths.exists () || !flag_thread_jumps)
2550 return;
2552 edge *slot = m_removed_edges->find_slot (e, INSERT);
2553 *slot = e;
2556 /* Thread all paths that have been queued for jump threading, and
2557 update the CFG accordingly.
2559 It is the caller's responsibility to fix the dominance information
2560 and rewrite duplicated SSA_NAMEs back into SSA form.
2562 If PEEL_LOOP_HEADERS is false, avoid threading edges through loop
2563 headers if it does not simplify the loop.
2565 Returns true if one or more edges were threaded. */
2567 bool
2568 jt_path_registry::thread_through_all_blocks (bool peel_loop_headers)
2570 if (m_paths.length () == 0)
2571 return false;
2573 m_num_threaded_edges = 0;
2575 bool retval = update_cfg (peel_loop_headers);
2577 statistics_counter_event (cfun, "Jumps threaded", m_num_threaded_edges);
2579 if (retval)
2581 loops_state_set (LOOPS_NEED_FIXUP);
2582 return true;
2584 return false;
2587 /* This is the backward threader version of thread_through_all_blocks
2588 using a generic BB copier. */
2590 bool
2591 back_jt_path_registry::update_cfg (bool /*peel_loop_headers*/)
2593 bool retval = false;
2594 hash_set<edge> visited_starting_edges;
2596 while (m_paths.length ())
2598 vec<jump_thread_edge *> *path = m_paths[0];
2599 edge entry = (*path)[0]->e;
2601 /* Do not jump-thread twice from the same starting edge.
2603 Previously we only checked that we weren't threading twice
2604 from the same BB, but that was too restrictive. Imagine a
2605 path that starts from GIMPLE_COND(x_123 == 0,...), where both
2606 edges out of this conditional yield paths that can be
2607 threaded (for example, both lead to an x_123==0 or x_123!=0
2608 conditional further down the line. */
2609 if (visited_starting_edges.contains (entry)
2610 /* We may not want to realize this jump thread path for
2611 various reasons. So check it first. */
2612 || !valid_jump_thread_path (path))
2614 /* Remove invalid jump-thread paths. */
2615 cancel_thread (path, "Avoiding threading twice from same edge");
2616 m_paths.unordered_remove (0);
2617 continue;
2620 unsigned len = path->length ();
2621 edge exit = (*path)[len - 1]->e;
2622 basic_block *region = XNEWVEC (basic_block, len - 1);
2624 for (unsigned int j = 0; j < len - 1; j++)
2625 region[j] = (*path)[j]->e->dest;
2627 if (duplicate_thread_path (entry, exit, region, len - 1, 0))
2629 /* We do not update dominance info. */
2630 free_dominance_info (CDI_DOMINATORS);
2631 visited_starting_edges.add (entry);
2632 retval = true;
2633 m_num_threaded_edges++;
2636 path->release ();
2637 m_paths.unordered_remove (0);
2638 free (region);
2640 return retval;
2643 /* This is the forward threader version of thread_through_all_blocks,
2644 using a custom BB copier. */
2646 bool
2647 fwd_jt_path_registry::update_cfg (bool may_peel_loop_headers)
2649 bool retval = false;
2651 /* Remove any paths that referenced removed edges. */
2652 if (m_removed_edges)
2653 for (unsigned i = 0; i < m_paths.length (); )
2655 unsigned int j;
2656 vec<jump_thread_edge *> *path = m_paths[i];
2658 for (j = 0; j < path->length (); j++)
2660 edge e = (*path)[j]->e;
2661 if (m_removed_edges->find_slot (e, NO_INSERT)
2662 || (((*path)[j]->type == EDGE_COPY_SRC_BLOCK
2663 || (*path)[j]->type == EDGE_COPY_SRC_JOINER_BLOCK)
2664 && !can_duplicate_block_p (e->src)))
2665 break;
2668 if (j != path->length ())
2670 cancel_thread (path, "Thread references removed edge");
2671 m_paths.unordered_remove (i);
2672 continue;
2674 i++;
2677 auto_bitmap threaded_blocks;
2678 mark_threaded_blocks (threaded_blocks);
2680 initialize_original_copy_tables ();
2682 /* The order in which we process jump threads can be important.
2684 Consider if we have two jump threading paths A and B. If the
2685 target edge of A is the starting edge of B and we thread path A
2686 first, then we create an additional incoming edge into B->dest that
2687 we cannot discover as a jump threading path on this iteration.
2689 If we instead thread B first, then the edge into B->dest will have
2690 already been redirected before we process path A and path A will
2691 natually, with no further work, target the redirected path for B.
2693 An post-order is sufficient here. Compute the ordering first, then
2694 process the blocks. */
2695 if (!bitmap_empty_p (threaded_blocks))
2697 int *postorder = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
2698 unsigned int postorder_num = post_order_compute (postorder, false, false);
2699 for (unsigned int i = 0; i < postorder_num; i++)
2701 unsigned int indx = postorder[i];
2702 if (bitmap_bit_p (threaded_blocks, indx))
2704 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, indx);
2705 retval |= thread_block (bb, true);
2708 free (postorder);
2711 /* Then perform the threading through loop headers. We start with the
2712 innermost loop, so that the changes in cfg we perform won't affect
2713 further threading. */
2714 for (auto loop : loops_list (cfun, LI_FROM_INNERMOST))
2716 if (!loop->header
2717 || !bitmap_bit_p (threaded_blocks, loop->header->index))
2718 continue;
2720 retval |= thread_through_loop_header (loop, may_peel_loop_headers);
2723 /* All jump threading paths should have been resolved at this
2724 point. Verify that is the case. */
2725 basic_block bb;
2726 FOR_EACH_BB_FN (bb, cfun)
2728 edge_iterator ei;
2729 edge e;
2730 FOR_EACH_EDGE (e, ei, bb->preds)
2731 gcc_assert (e->aux == NULL);
2734 free_original_copy_tables ();
2736 return retval;
2739 bool
2740 jt_path_registry::cancel_invalid_paths (vec<jump_thread_edge *> &path)
2742 gcc_checking_assert (!path.is_empty ());
2743 edge entry = path[0]->e;
2744 edge exit = path[path.length () - 1]->e;
2745 bool seen_latch = false;
2746 int loops_crossed = 0;
2747 bool crossed_latch = false;
2748 bool crossed_loop_header = false;
2749 // Use ->dest here instead of ->src to ignore the first block. The
2750 // first block is allowed to be in a different loop, since it'll be
2751 // redirected. See similar comment in profitable_path_p: "we don't
2752 // care about that block...".
2753 loop_p loop = entry->dest->loop_father;
2754 loop_p curr_loop = loop;
2756 for (unsigned int i = 0; i < path.length (); i++)
2758 edge e = path[i]->e;
2760 if (e == NULL)
2762 // NULL outgoing edges on a path can happen for jumping to a
2763 // constant address.
2764 cancel_thread (&path, "Found NULL edge in jump threading path");
2765 return true;
2768 if (loop->latch == e->src || loop->latch == e->dest)
2770 seen_latch = true;
2771 // Like seen_latch, but excludes the first block.
2772 if (e->src != entry->src)
2773 crossed_latch = true;
2776 if (e->dest->loop_father != curr_loop)
2778 curr_loop = e->dest->loop_father;
2779 ++loops_crossed;
2782 // ?? Avoid threading through loop headers that remain in the
2783 // loop, as such threadings tend to create sub-loops which
2784 // _might_ be OK ??.
2785 if (e->dest->loop_father->header == e->dest
2786 && !flow_loop_nested_p (exit->dest->loop_father,
2787 e->dest->loop_father))
2788 crossed_loop_header = true;
2790 if (flag_checking && !m_backedge_threads)
2791 gcc_assert ((path[i]->e->flags & EDGE_DFS_BACK) == 0);
2794 // If we crossed a loop into an outer loop without crossing the
2795 // latch, this is just an early exit from the loop.
2796 if (loops_crossed == 1
2797 && !crossed_latch
2798 && flow_loop_nested_p (exit->dest->loop_father, exit->src->loop_father))
2799 return false;
2801 if (cfun->curr_properties & PROP_loop_opts_done)
2802 return false;
2804 if (seen_latch && empty_block_p (loop->latch))
2806 cancel_thread (&path, "Threading through latch before loop opts "
2807 "would create non-empty latch");
2808 return true;
2810 if (loops_crossed)
2812 cancel_thread (&path, "Path crosses loops");
2813 return true;
2815 // The path should either start and end in the same loop or exit the
2816 // loop it starts in but never enter a loop. This also catches
2817 // creating irreducible loops, not only rotation.
2818 if (entry->src->loop_father != exit->dest->loop_father
2819 && !flow_loop_nested_p (exit->src->loop_father,
2820 entry->dest->loop_father))
2822 cancel_thread (&path, "Path rotates loop");
2823 return true;
2825 if (crossed_loop_header)
2827 cancel_thread (&path, "Path crosses loop header but does not exit it");
2828 return true;
2830 return false;
2833 /* Register a jump threading opportunity. We queue up all the jump
2834 threading opportunities discovered by a pass and update the CFG
2835 and SSA form all at once.
2837 E is the edge we can thread, E2 is the new target edge, i.e., we
2838 are effectively recording that E->dest can be changed to E2->dest
2839 after fixing the SSA graph.
2841 Return TRUE if PATH was successfully threaded. */
2843 bool
2844 jt_path_registry::register_jump_thread (vec<jump_thread_edge *> *path)
2846 gcc_checking_assert (flag_thread_jumps);
2848 if (!dbg_cnt (registered_jump_thread))
2850 path->release ();
2851 return false;
2854 if (cancel_invalid_paths (*path))
2855 return false;
2857 if (dump_file && (dump_flags & TDF_DETAILS))
2858 dump_jump_thread_path (dump_file, *path, true);
2860 m_paths.safe_push (path);
2861 return true;
2864 /* Return how many uses of T there are within BB, as long as there
2865 aren't any uses outside BB. If there are any uses outside BB,
2866 return -1 if there's at most one use within BB, or -2 if there is
2867 more than one use within BB. */
2869 static int
2870 uses_in_bb (tree t, basic_block bb)
2872 int uses = 0;
2873 bool outside_bb = false;
2875 imm_use_iterator iter;
2876 use_operand_p use_p;
2877 FOR_EACH_IMM_USE_FAST (use_p, iter, t)
2879 if (is_gimple_debug (USE_STMT (use_p)))
2880 continue;
2882 if (gimple_bb (USE_STMT (use_p)) != bb)
2883 outside_bb = true;
2884 else
2885 uses++;
2887 if (outside_bb && uses > 1)
2888 return -2;
2891 if (outside_bb)
2892 return -1;
2894 return uses;
2897 /* Starting from the final control flow stmt in BB, assuming it will
2898 be removed, follow uses in to-be-removed stmts back to their defs
2899 and count how many defs are to become dead and be removed as
2900 well. */
2902 unsigned int
2903 estimate_threading_killed_stmts (basic_block bb)
2905 int killed_stmts = 0;
2906 hash_map<tree, int> ssa_remaining_uses;
2907 auto_vec<gimple *, 4> dead_worklist;
2909 /* If the block has only two predecessors, threading will turn phi
2910 dsts into either src, so count them as dead stmts. */
2911 bool drop_all_phis = EDGE_COUNT (bb->preds) == 2;
2913 if (drop_all_phis)
2914 for (gphi_iterator gsi = gsi_start_phis (bb);
2915 !gsi_end_p (gsi); gsi_next (&gsi))
2917 gphi *phi = gsi.phi ();
2918 tree dst = gimple_phi_result (phi);
2920 /* We don't count virtual PHIs as stmts in
2921 record_temporary_equivalences_from_phis. */
2922 if (virtual_operand_p (dst))
2923 continue;
2925 killed_stmts++;
2928 if (gsi_end_p (gsi_last_bb (bb)))
2929 return killed_stmts;
2931 gimple *stmt = gsi_stmt (gsi_last_bb (bb));
2932 if (gimple_code (stmt) != GIMPLE_COND
2933 && gimple_code (stmt) != GIMPLE_GOTO
2934 && gimple_code (stmt) != GIMPLE_SWITCH)
2935 return killed_stmts;
2937 /* The control statement is always dead. */
2938 killed_stmts++;
2939 dead_worklist.quick_push (stmt);
2940 while (!dead_worklist.is_empty ())
2942 stmt = dead_worklist.pop ();
2944 ssa_op_iter iter;
2945 use_operand_p use_p;
2946 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
2948 tree t = USE_FROM_PTR (use_p);
2949 gimple *def = SSA_NAME_DEF_STMT (t);
2951 if (gimple_bb (def) == bb
2952 && (gimple_code (def) != GIMPLE_PHI
2953 || !drop_all_phis)
2954 && !gimple_has_side_effects (def))
2956 int *usesp = ssa_remaining_uses.get (t);
2957 int uses;
2959 if (usesp)
2960 uses = *usesp;
2961 else
2962 uses = uses_in_bb (t, bb);
2964 gcc_assert (uses);
2966 /* Don't bother recording the expected use count if we
2967 won't find any further uses within BB. */
2968 if (!usesp && (uses < -1 || uses > 1))
2970 usesp = &ssa_remaining_uses.get_or_insert (t);
2971 *usesp = uses;
2974 if (uses < 0)
2975 continue;
2977 --uses;
2978 if (usesp)
2979 *usesp = uses;
2981 if (!uses)
2983 killed_stmts++;
2984 if (usesp)
2985 ssa_remaining_uses.remove (t);
2986 if (gimple_code (def) != GIMPLE_PHI)
2987 dead_worklist.safe_push (def);
2993 if (dump_file)
2994 fprintf (dump_file, "threading bb %i kills %i stmts\n",
2995 bb->index, killed_stmts);
2997 return killed_stmts;