tree-ssa-threadupdate.cc revision 1.1 1 1.1 mrg /* Thread edges through blocks and update the control flow and SSA graphs.
2 1.1 mrg Copyright (C) 2004-2022 Free Software Foundation, Inc.
3 1.1 mrg
4 1.1 mrg This file is part of GCC.
5 1.1 mrg
6 1.1 mrg GCC is free software; you can redistribute it and/or modify
7 1.1 mrg it under the terms of the GNU General Public License as published by
8 1.1 mrg the Free Software Foundation; either version 3, or (at your option)
9 1.1 mrg any later version.
10 1.1 mrg
11 1.1 mrg GCC is distributed in the hope that it will be useful,
12 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
13 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 1.1 mrg GNU General Public License for more details.
15 1.1 mrg
16 1.1 mrg You should have received a copy of the GNU General Public License
17 1.1 mrg along with GCC; see the file COPYING3. If not see
18 1.1 mrg <http://www.gnu.org/licenses/>. */
19 1.1 mrg
20 1.1 mrg #include "config.h"
21 1.1 mrg #include "system.h"
22 1.1 mrg #include "coretypes.h"
23 1.1 mrg #include "backend.h"
24 1.1 mrg #include "tree.h"
25 1.1 mrg #include "gimple.h"
26 1.1 mrg #include "cfghooks.h"
27 1.1 mrg #include "tree-pass.h"
28 1.1 mrg #include "ssa.h"
29 1.1 mrg #include "fold-const.h"
30 1.1 mrg #include "cfganal.h"
31 1.1 mrg #include "gimple-iterator.h"
32 1.1 mrg #include "tree-ssa.h"
33 1.1 mrg #include "tree-ssa-threadupdate.h"
34 1.1 mrg #include "cfgloop.h"
35 1.1 mrg #include "dbgcnt.h"
36 1.1 mrg #include "tree-cfg.h"
37 1.1 mrg #include "tree-vectorizer.h"
38 1.1 mrg #include "tree-pass.h"
39 1.1 mrg
40 1.1 mrg /* Given a block B, update the CFG and SSA graph to reflect redirecting
41 1.1 mrg one or more in-edges to B to instead reach the destination of an
42 1.1 mrg out-edge from B while preserving any side effects in B.
43 1.1 mrg
44 1.1 mrg i.e., given A->B and B->C, change A->B to be A->C yet still preserve the
45 1.1 mrg side effects of executing B.
46 1.1 mrg
47 1.1 mrg 1. Make a copy of B (including its outgoing edges and statements). Call
48 1.1 mrg the copy B'. Note B' has no incoming edges or PHIs at this time.
49 1.1 mrg
50 1.1 mrg 2. Remove the control statement at the end of B' and all outgoing edges
51 1.1 mrg except B'->C.
52 1.1 mrg
53 1.1 mrg 3. Add a new argument to each PHI in C with the same value as the existing
54 1.1 mrg argument associated with edge B->C. Associate the new PHI arguments
55 1.1 mrg with the edge B'->C.
56 1.1 mrg
57 1.1 mrg 4. For each PHI in B, find or create a PHI in B' with an identical
58 1.1 mrg PHI_RESULT. Add an argument to the PHI in B' which has the same
59 1.1 mrg value as the PHI in B associated with the edge A->B. Associate
60 1.1 mrg the new argument in the PHI in B' with the edge A->B.
61 1.1 mrg
62 1.1 mrg 5. Change the edge A->B to A->B'.
63 1.1 mrg
64 1.1 mrg 5a. This automatically deletes any PHI arguments associated with the
65 1.1 mrg edge A->B in B.
66 1.1 mrg
67 1.1 mrg 5b. This automatically associates each new argument added in step 4
68 1.1 mrg with the edge A->B'.
69 1.1 mrg
70 1.1 mrg 6. Repeat for other incoming edges into B.
71 1.1 mrg
72 1.1 mrg 7. Put the duplicated resources in B and all the B' blocks into SSA form.
73 1.1 mrg
74 1.1 mrg Note that block duplication can be minimized by first collecting the
75 1.1 mrg set of unique destination blocks that the incoming edges should
76 1.1 mrg be threaded to.
77 1.1 mrg
78 1.1 mrg We reduce the number of edges and statements we create by not copying all
79 1.1 mrg the outgoing edges and the control statement in step #1. We instead create
80 1.1 mrg a template block without the outgoing edges and duplicate the template.
81 1.1 mrg
82 1.1 mrg Another case this code handles is threading through a "joiner" block. In
83 1.1 mrg this case, we do not know the destination of the joiner block, but one
84 1.1 mrg of the outgoing edges from the joiner block leads to a threadable path. This
85 1.1 mrg case largely works as outlined above, except the duplicate of the joiner
86 1.1 mrg block still contains a full set of outgoing edges and its control statement.
87 1.1 mrg We just redirect one of its outgoing edges to our jump threading path. */
88 1.1 mrg
89 1.1 mrg
90 1.1 mrg /* Steps #5 and #6 of the above algorithm are best implemented by walking
91 1.1 mrg all the incoming edges which thread to the same destination edge at
92 1.1 mrg the same time. That avoids lots of table lookups to get information
93 1.1 mrg for the destination edge.
94 1.1 mrg
95 1.1 mrg To realize that implementation we create a list of incoming edges
96 1.1 mrg which thread to the same outgoing edge. Thus to implement steps
97 1.1 mrg #5 and #6 we traverse our hash table of outgoing edge information.
98 1.1 mrg For each entry we walk the list of incoming edges which thread to
99 1.1 mrg the current outgoing edge. */
100 1.1 mrg
101 1.1 mrg struct el
102 1.1 mrg {
103 1.1 mrg edge e;
104 1.1 mrg struct el *next;
105 1.1 mrg };
106 1.1 mrg
107 1.1 mrg /* Main data structure recording information regarding B's duplicate
108 1.1 mrg blocks. */
109 1.1 mrg
110 1.1 mrg /* We need to efficiently record the unique thread destinations of this
111 1.1 mrg block and specific information associated with those destinations. We
112 1.1 mrg may have many incoming edges threaded to the same outgoing edge. This
113 1.1 mrg can be naturally implemented with a hash table. */
114 1.1 mrg
115 1.1 mrg struct redirection_data : free_ptr_hash<redirection_data>
116 1.1 mrg {
117 1.1 mrg /* We support wiring up two block duplicates in a jump threading path.
118 1.1 mrg
119 1.1 mrg One is a normal block copy where we remove the control statement
120 1.1 mrg and wire up its single remaining outgoing edge to the thread path.
121 1.1 mrg
122 1.1 mrg The other is a joiner block where we leave the control statement
123 1.1 mrg in place, but wire one of the outgoing edges to a thread path.
124 1.1 mrg
125 1.1 mrg In theory we could have multiple block duplicates in a jump
126 1.1 mrg threading path, but I haven't tried that.
127 1.1 mrg
128 1.1 mrg The duplicate blocks appear in this array in the same order in
129 1.1 mrg which they appear in the jump thread path. */
130 1.1 mrg basic_block dup_blocks[2];
131 1.1 mrg
132 1.1 mrg vec<jump_thread_edge *> *path;
133 1.1 mrg
134 1.1 mrg /* A list of incoming edges which we want to thread to the
135 1.1 mrg same path. */
136 1.1 mrg struct el *incoming_edges;
137 1.1 mrg
138 1.1 mrg /* hash_table support. */
139 1.1 mrg static inline hashval_t hash (const redirection_data *);
140 1.1 mrg static inline int equal (const redirection_data *, const redirection_data *);
141 1.1 mrg };
142 1.1 mrg
143 1.1 mrg jump_thread_path_allocator::jump_thread_path_allocator ()
144 1.1 mrg {
145 1.1 mrg obstack_init (&m_obstack);
146 1.1 mrg }
147 1.1 mrg
148 1.1 mrg jump_thread_path_allocator::~jump_thread_path_allocator ()
149 1.1 mrg {
150 1.1 mrg obstack_free (&m_obstack, NULL);
151 1.1 mrg }
152 1.1 mrg
153 1.1 mrg jump_thread_edge *
154 1.1 mrg jump_thread_path_allocator::allocate_thread_edge (edge e,
155 1.1 mrg jump_thread_edge_type type)
156 1.1 mrg {
157 1.1 mrg void *r = obstack_alloc (&m_obstack, sizeof (jump_thread_edge));
158 1.1 mrg return new (r) jump_thread_edge (e, type);
159 1.1 mrg }
160 1.1 mrg
161 1.1 mrg vec<jump_thread_edge *> *
162 1.1 mrg jump_thread_path_allocator::allocate_thread_path ()
163 1.1 mrg {
164 1.1 mrg // ?? Since the paths live in an obstack, we should be able to remove all
165 1.1 mrg // references to path->release() throughout the code.
166 1.1 mrg void *r = obstack_alloc (&m_obstack, sizeof (vec <jump_thread_edge *>));
167 1.1 mrg return new (r) vec<jump_thread_edge *> ();
168 1.1 mrg }
169 1.1 mrg
170 1.1 mrg jt_path_registry::jt_path_registry (bool backedge_threads)
171 1.1 mrg {
172 1.1 mrg m_paths.create (5);
173 1.1 mrg m_num_threaded_edges = 0;
174 1.1 mrg m_backedge_threads = backedge_threads;
175 1.1 mrg }
176 1.1 mrg
177 1.1 mrg jt_path_registry::~jt_path_registry ()
178 1.1 mrg {
179 1.1 mrg m_paths.release ();
180 1.1 mrg }
181 1.1 mrg
182 1.1 mrg fwd_jt_path_registry::fwd_jt_path_registry ()
183 1.1 mrg : jt_path_registry (/*backedge_threads=*/false)
184 1.1 mrg {
185 1.1 mrg m_removed_edges = new hash_table<struct removed_edges> (17);
186 1.1 mrg m_redirection_data = NULL;
187 1.1 mrg }
188 1.1 mrg
189 1.1 mrg fwd_jt_path_registry::~fwd_jt_path_registry ()
190 1.1 mrg {
191 1.1 mrg delete m_removed_edges;
192 1.1 mrg }
193 1.1 mrg
194 1.1 mrg back_jt_path_registry::back_jt_path_registry ()
195 1.1 mrg : jt_path_registry (/*backedge_threads=*/true)
196 1.1 mrg {
197 1.1 mrg }
198 1.1 mrg
199 1.1 mrg void
200 1.1 mrg jt_path_registry::push_edge (vec<jump_thread_edge *> *path,
201 1.1 mrg edge e, jump_thread_edge_type type)
202 1.1 mrg {
203 1.1 mrg jump_thread_edge *x = m_allocator.allocate_thread_edge (e, type);
204 1.1 mrg path->safe_push (x);
205 1.1 mrg }
206 1.1 mrg
207 1.1 mrg vec<jump_thread_edge *> *
208 1.1 mrg jt_path_registry::allocate_thread_path ()
209 1.1 mrg {
210 1.1 mrg return m_allocator.allocate_thread_path ();
211 1.1 mrg }
212 1.1 mrg
213 1.1 mrg /* Dump a jump threading path, including annotations about each
214 1.1 mrg edge in the path. */
215 1.1 mrg
216 1.1 mrg static void
217 1.1 mrg dump_jump_thread_path (FILE *dump_file,
218 1.1 mrg const vec<jump_thread_edge *> &path,
219 1.1 mrg bool registering)
220 1.1 mrg {
221 1.1 mrg if (registering)
222 1.1 mrg fprintf (dump_file,
223 1.1 mrg " [%u] Registering jump thread: (%d, %d) incoming edge; ",
224 1.1 mrg dbg_cnt_counter (registered_jump_thread),
225 1.1 mrg path[0]->e->src->index, path[0]->e->dest->index);
226 1.1 mrg else
227 1.1 mrg fprintf (dump_file,
228 1.1 mrg " Cancelling jump thread: (%d, %d) incoming edge; ",
229 1.1 mrg path[0]->e->src->index, path[0]->e->dest->index);
230 1.1 mrg
231 1.1 mrg for (unsigned int i = 1; i < path.length (); i++)
232 1.1 mrg {
233 1.1 mrg /* We can get paths with a NULL edge when the final destination
234 1.1 mrg of a jump thread turns out to be a constant address. We dump
235 1.1 mrg those paths when debugging, so we have to be prepared for that
236 1.1 mrg possibility here. */
237 1.1 mrg if (path[i]->e == NULL)
238 1.1 mrg continue;
239 1.1 mrg
240 1.1 mrg fprintf (dump_file, " (%d, %d) ",
241 1.1 mrg path[i]->e->src->index, path[i]->e->dest->index);
242 1.1 mrg switch (path[i]->type)
243 1.1 mrg {
244 1.1 mrg case EDGE_COPY_SRC_JOINER_BLOCK:
245 1.1 mrg fprintf (dump_file, "joiner");
246 1.1 mrg break;
247 1.1 mrg case EDGE_COPY_SRC_BLOCK:
248 1.1 mrg fprintf (dump_file, "normal");
249 1.1 mrg break;
250 1.1 mrg case EDGE_NO_COPY_SRC_BLOCK:
251 1.1 mrg fprintf (dump_file, "nocopy");
252 1.1 mrg break;
253 1.1 mrg default:
254 1.1 mrg gcc_unreachable ();
255 1.1 mrg }
256 1.1 mrg
257 1.1 mrg if ((path[i]->e->flags & EDGE_DFS_BACK) != 0)
258 1.1 mrg fprintf (dump_file, " (back)");
259 1.1 mrg }
260 1.1 mrg fprintf (dump_file, "; \n");
261 1.1 mrg }
262 1.1 mrg
263 1.1 mrg DEBUG_FUNCTION void
264 1.1 mrg debug (const vec<jump_thread_edge *> &path)
265 1.1 mrg {
266 1.1 mrg dump_jump_thread_path (stderr, path, true);
267 1.1 mrg }
268 1.1 mrg
269 1.1 mrg DEBUG_FUNCTION void
270 1.1 mrg debug (const vec<jump_thread_edge *> *path)
271 1.1 mrg {
272 1.1 mrg debug (*path);
273 1.1 mrg }
274 1.1 mrg
275 1.1 mrg /* Release the memory associated with PATH, and if dumping is enabled,
276 1.1 mrg dump out the reason why the thread was canceled. */
277 1.1 mrg
278 1.1 mrg static void
279 1.1 mrg cancel_thread (vec<jump_thread_edge *> *path, const char *reason = NULL)
280 1.1 mrg {
281 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
282 1.1 mrg {
283 1.1 mrg if (reason)
284 1.1 mrg fprintf (dump_file, "%s: ", reason);
285 1.1 mrg
286 1.1 mrg dump_jump_thread_path (dump_file, *path, false);
287 1.1 mrg fprintf (dump_file, "\n");
288 1.1 mrg }
289 1.1 mrg path->release ();
290 1.1 mrg }
291 1.1 mrg
292 1.1 mrg /* Simple hashing function. For any given incoming edge E, we're going
293 1.1 mrg to be most concerned with the final destination of its jump thread
294 1.1 mrg path. So hash on the block index of the final edge in the path. */
295 1.1 mrg
296 1.1 mrg inline hashval_t
297 1.1 mrg redirection_data::hash (const redirection_data *p)
298 1.1 mrg {
299 1.1 mrg vec<jump_thread_edge *> *path = p->path;
300 1.1 mrg return path->last ()->e->dest->index;
301 1.1 mrg }
302 1.1 mrg
303 1.1 mrg /* Given two hash table entries, return true if they have the same
304 1.1 mrg jump threading path. */
305 1.1 mrg inline int
306 1.1 mrg redirection_data::equal (const redirection_data *p1, const redirection_data *p2)
307 1.1 mrg {
308 1.1 mrg vec<jump_thread_edge *> *path1 = p1->path;
309 1.1 mrg vec<jump_thread_edge *> *path2 = p2->path;
310 1.1 mrg
311 1.1 mrg if (path1->length () != path2->length ())
312 1.1 mrg return false;
313 1.1 mrg
314 1.1 mrg for (unsigned int i = 1; i < path1->length (); i++)
315 1.1 mrg {
316 1.1 mrg if ((*path1)[i]->type != (*path2)[i]->type
317 1.1 mrg || (*path1)[i]->e != (*path2)[i]->e)
318 1.1 mrg return false;
319 1.1 mrg }
320 1.1 mrg
321 1.1 mrg return true;
322 1.1 mrg }
323 1.1 mrg
324 1.1 mrg /* Data structure of information to pass to hash table traversal routines. */
325 1.1 mrg struct ssa_local_info_t
326 1.1 mrg {
327 1.1 mrg /* The current block we are working on. */
328 1.1 mrg basic_block bb;
329 1.1 mrg
330 1.1 mrg /* We only create a template block for the first duplicated block in a
331 1.1 mrg jump threading path as we may need many duplicates of that block.
332 1.1 mrg
333 1.1 mrg The second duplicate block in a path is specific to that path. Creating
334 1.1 mrg and sharing a template for that block is considerably more difficult. */
335 1.1 mrg basic_block template_block;
336 1.1 mrg
337 1.1 mrg /* If we append debug stmts to the template block after creating it,
338 1.1 mrg this iterator won't be the last one in the block, and further
339 1.1 mrg copies of the template block shouldn't get debug stmts after
340 1.1 mrg it. */
341 1.1 mrg gimple_stmt_iterator template_last_to_copy;
342 1.1 mrg
343 1.1 mrg /* Blocks duplicated for the thread. */
344 1.1 mrg bitmap duplicate_blocks;
345 1.1 mrg
346 1.1 mrg /* TRUE if we thread one or more jumps, FALSE otherwise. */
347 1.1 mrg bool jumps_threaded;
348 1.1 mrg
349 1.1 mrg /* When we have multiple paths through a joiner which reach different
350 1.1 mrg final destinations, then we may need to correct for potential
351 1.1 mrg profile insanities. */
352 1.1 mrg bool need_profile_correction;
353 1.1 mrg
354 1.1 mrg // Jump threading statistics.
355 1.1 mrg unsigned long num_threaded_edges;
356 1.1 mrg };
357 1.1 mrg
358 1.1 mrg /* When we start updating the CFG for threading, data necessary for jump
359 1.1 mrg threading is attached to the AUX field for the incoming edge. Use these
360 1.1 mrg macros to access the underlying structure attached to the AUX field. */
361 1.1 mrg #define THREAD_PATH(E) ((vec<jump_thread_edge *> *)(E)->aux)
362 1.1 mrg
363 1.1 mrg /* Remove the last statement in block BB if it is a control statement
364 1.1 mrg Also remove all outgoing edges except the edge which reaches DEST_BB.
365 1.1 mrg If DEST_BB is NULL, then remove all outgoing edges. */
366 1.1 mrg
367 1.1 mrg static void
368 1.1 mrg remove_ctrl_stmt_and_useless_edges (basic_block bb, basic_block dest_bb)
369 1.1 mrg {
370 1.1 mrg gimple_stmt_iterator gsi;
371 1.1 mrg edge e;
372 1.1 mrg edge_iterator ei;
373 1.1 mrg
374 1.1 mrg gsi = gsi_last_bb (bb);
375 1.1 mrg
376 1.1 mrg /* If the duplicate ends with a control statement, then remove it.
377 1.1 mrg
378 1.1 mrg Note that if we are duplicating the template block rather than the
379 1.1 mrg original basic block, then the duplicate might not have any real
380 1.1 mrg statements in it. */
381 1.1 mrg if (!gsi_end_p (gsi)
382 1.1 mrg && gsi_stmt (gsi)
383 1.1 mrg && (gimple_code (gsi_stmt (gsi)) == GIMPLE_COND
384 1.1 mrg || gimple_code (gsi_stmt (gsi)) == GIMPLE_GOTO
385 1.1 mrg || gimple_code (gsi_stmt (gsi)) == GIMPLE_SWITCH))
386 1.1 mrg gsi_remove (&gsi, true);
387 1.1 mrg
388 1.1 mrg for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
389 1.1 mrg {
390 1.1 mrg if (e->dest != dest_bb)
391 1.1 mrg {
392 1.1 mrg free_dom_edge_info (e);
393 1.1 mrg remove_edge (e);
394 1.1 mrg }
395 1.1 mrg else
396 1.1 mrg {
397 1.1 mrg e->probability = profile_probability::always ();
398 1.1 mrg ei_next (&ei);
399 1.1 mrg }
400 1.1 mrg }
401 1.1 mrg
402 1.1 mrg /* If the remaining edge is a loop exit, there must have
403 1.1 mrg a removed edge that was not a loop exit.
404 1.1 mrg
405 1.1 mrg In that case BB and possibly other blocks were previously
406 1.1 mrg in the loop, but are now outside the loop. Thus, we need
407 1.1 mrg to update the loop structures. */
408 1.1 mrg if (single_succ_p (bb)
409 1.1 mrg && loop_outer (bb->loop_father)
410 1.1 mrg && loop_exit_edge_p (bb->loop_father, single_succ_edge (bb)))
411 1.1 mrg loops_state_set (LOOPS_NEED_FIXUP);
412 1.1 mrg }
413 1.1 mrg
414 1.1 mrg /* Create a duplicate of BB. Record the duplicate block in an array
415 1.1 mrg indexed by COUNT stored in RD. */
416 1.1 mrg
417 1.1 mrg static void
418 1.1 mrg create_block_for_threading (basic_block bb,
419 1.1 mrg struct redirection_data *rd,
420 1.1 mrg unsigned int count,
421 1.1 mrg bitmap *duplicate_blocks)
422 1.1 mrg {
423 1.1 mrg edge_iterator ei;
424 1.1 mrg edge e;
425 1.1 mrg
426 1.1 mrg /* We can use the generic block duplication code and simply remove
427 1.1 mrg the stuff we do not need. */
428 1.1 mrg rd->dup_blocks[count] = duplicate_block (bb, NULL, NULL);
429 1.1 mrg
430 1.1 mrg FOR_EACH_EDGE (e, ei, rd->dup_blocks[count]->succs)
431 1.1 mrg {
432 1.1 mrg e->aux = NULL;
433 1.1 mrg
434 1.1 mrg /* If we duplicate a block with an outgoing edge marked as
435 1.1 mrg EDGE_IGNORE, we must clear EDGE_IGNORE so that it doesn't
436 1.1 mrg leak out of the current pass.
437 1.1 mrg
438 1.1 mrg It would be better to simplify switch statements and remove
439 1.1 mrg the edges before we get here, but the sequencing is nontrivial. */
440 1.1 mrg e->flags &= ~EDGE_IGNORE;
441 1.1 mrg }
442 1.1 mrg
443 1.1 mrg /* Zero out the profile, since the block is unreachable for now. */
444 1.1 mrg rd->dup_blocks[count]->count = profile_count::uninitialized ();
445 1.1 mrg if (duplicate_blocks)
446 1.1 mrg bitmap_set_bit (*duplicate_blocks, rd->dup_blocks[count]->index);
447 1.1 mrg }
448 1.1 mrg
449 1.1 mrg /* Given an outgoing edge E lookup and return its entry in our hash table.
450 1.1 mrg
451 1.1 mrg If INSERT is true, then we insert the entry into the hash table if
452 1.1 mrg it is not already present. INCOMING_EDGE is added to the list of incoming
453 1.1 mrg edges associated with E in the hash table. */
454 1.1 mrg
455 1.1 mrg redirection_data *
456 1.1 mrg fwd_jt_path_registry::lookup_redirection_data (edge e, insert_option insert)
457 1.1 mrg {
458 1.1 mrg struct redirection_data **slot;
459 1.1 mrg struct redirection_data *elt;
460 1.1 mrg vec<jump_thread_edge *> *path = THREAD_PATH (e);
461 1.1 mrg
462 1.1 mrg /* Build a hash table element so we can see if E is already
463 1.1 mrg in the table. */
464 1.1 mrg elt = XNEW (struct redirection_data);
465 1.1 mrg elt->path = path;
466 1.1 mrg elt->dup_blocks[0] = NULL;
467 1.1 mrg elt->dup_blocks[1] = NULL;
468 1.1 mrg elt->incoming_edges = NULL;
469 1.1 mrg
470 1.1 mrg slot = m_redirection_data->find_slot (elt, insert);
471 1.1 mrg
472 1.1 mrg /* This will only happen if INSERT is false and the entry is not
473 1.1 mrg in the hash table. */
474 1.1 mrg if (slot == NULL)
475 1.1 mrg {
476 1.1 mrg free (elt);
477 1.1 mrg return NULL;
478 1.1 mrg }
479 1.1 mrg
480 1.1 mrg /* This will only happen if E was not in the hash table and
481 1.1 mrg INSERT is true. */
482 1.1 mrg if (*slot == NULL)
483 1.1 mrg {
484 1.1 mrg *slot = elt;
485 1.1 mrg elt->incoming_edges = XNEW (struct el);
486 1.1 mrg elt->incoming_edges->e = e;
487 1.1 mrg elt->incoming_edges->next = NULL;
488 1.1 mrg return elt;
489 1.1 mrg }
490 1.1 mrg /* E was in the hash table. */
491 1.1 mrg else
492 1.1 mrg {
493 1.1 mrg /* Free ELT as we do not need it anymore, we will extract the
494 1.1 mrg relevant entry from the hash table itself. */
495 1.1 mrg free (elt);
496 1.1 mrg
497 1.1 mrg /* Get the entry stored in the hash table. */
498 1.1 mrg elt = *slot;
499 1.1 mrg
500 1.1 mrg /* If insertion was requested, then we need to add INCOMING_EDGE
501 1.1 mrg to the list of incoming edges associated with E. */
502 1.1 mrg if (insert)
503 1.1 mrg {
504 1.1 mrg struct el *el = XNEW (struct el);
505 1.1 mrg el->next = elt->incoming_edges;
506 1.1 mrg el->e = e;
507 1.1 mrg elt->incoming_edges = el;
508 1.1 mrg }
509 1.1 mrg
510 1.1 mrg return elt;
511 1.1 mrg }
512 1.1 mrg }
513 1.1 mrg
514 1.1 mrg /* Similar to copy_phi_args, except that the PHI arg exists, it just
515 1.1 mrg does not have a value associated with it. */
516 1.1 mrg
517 1.1 mrg static void
518 1.1 mrg copy_phi_arg_into_existing_phi (edge src_e, edge tgt_e)
519 1.1 mrg {
520 1.1 mrg int src_idx = src_e->dest_idx;
521 1.1 mrg int tgt_idx = tgt_e->dest_idx;
522 1.1 mrg
523 1.1 mrg /* Iterate over each PHI in e->dest. */
524 1.1 mrg for (gphi_iterator gsi = gsi_start_phis (src_e->dest),
525 1.1 mrg gsi2 = gsi_start_phis (tgt_e->dest);
526 1.1 mrg !gsi_end_p (gsi);
527 1.1 mrg gsi_next (&gsi), gsi_next (&gsi2))
528 1.1 mrg {
529 1.1 mrg gphi *src_phi = gsi.phi ();
530 1.1 mrg gphi *dest_phi = gsi2.phi ();
531 1.1 mrg tree val = gimple_phi_arg_def (src_phi, src_idx);
532 1.1 mrg location_t locus = gimple_phi_arg_location (src_phi, src_idx);
533 1.1 mrg
534 1.1 mrg SET_PHI_ARG_DEF (dest_phi, tgt_idx, val);
535 1.1 mrg gimple_phi_arg_set_location (dest_phi, tgt_idx, locus);
536 1.1 mrg }
537 1.1 mrg }
538 1.1 mrg
539 1.1 mrg /* Given ssa_name DEF, backtrack jump threading PATH from node IDX
540 1.1 mrg to see if it has constant value in a flow sensitive manner. Set
541 1.1 mrg LOCUS to location of the constant phi arg and return the value.
542 1.1 mrg Return DEF directly if either PATH or idx is ZERO. */
543 1.1 mrg
544 1.1 mrg static tree
545 1.1 mrg get_value_locus_in_path (tree def, vec<jump_thread_edge *> *path,
546 1.1 mrg basic_block bb, int idx, location_t *locus)
547 1.1 mrg {
548 1.1 mrg tree arg;
549 1.1 mrg gphi *def_phi;
550 1.1 mrg basic_block def_bb;
551 1.1 mrg
552 1.1 mrg if (path == NULL || idx == 0)
553 1.1 mrg return def;
554 1.1 mrg
555 1.1 mrg def_phi = dyn_cast <gphi *> (SSA_NAME_DEF_STMT (def));
556 1.1 mrg if (!def_phi)
557 1.1 mrg return def;
558 1.1 mrg
559 1.1 mrg def_bb = gimple_bb (def_phi);
560 1.1 mrg /* Don't propagate loop invariants into deeper loops. */
561 1.1 mrg if (!def_bb || bb_loop_depth (def_bb) < bb_loop_depth (bb))
562 1.1 mrg return def;
563 1.1 mrg
564 1.1 mrg /* Backtrack jump threading path from IDX to see if def has constant
565 1.1 mrg value. */
566 1.1 mrg for (int j = idx - 1; j >= 0; j--)
567 1.1 mrg {
568 1.1 mrg edge e = (*path)[j]->e;
569 1.1 mrg if (e->dest == def_bb)
570 1.1 mrg {
571 1.1 mrg arg = gimple_phi_arg_def (def_phi, e->dest_idx);
572 1.1 mrg if (is_gimple_min_invariant (arg))
573 1.1 mrg {
574 1.1 mrg *locus = gimple_phi_arg_location (def_phi, e->dest_idx);
575 1.1 mrg return arg;
576 1.1 mrg }
577 1.1 mrg break;
578 1.1 mrg }
579 1.1 mrg }
580 1.1 mrg
581 1.1 mrg return def;
582 1.1 mrg }
583 1.1 mrg
584 1.1 mrg /* For each PHI in BB, copy the argument associated with SRC_E to TGT_E.
585 1.1 mrg Try to backtrack jump threading PATH from node IDX to see if the arg
586 1.1 mrg has constant value, copy constant value instead of argument itself
587 1.1 mrg if yes. */
588 1.1 mrg
589 1.1 mrg static void
590 1.1 mrg copy_phi_args (basic_block bb, edge src_e, edge tgt_e,
591 1.1 mrg vec<jump_thread_edge *> *path, int idx)
592 1.1 mrg {
593 1.1 mrg gphi_iterator gsi;
594 1.1 mrg int src_indx = src_e->dest_idx;
595 1.1 mrg
596 1.1 mrg for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
597 1.1 mrg {
598 1.1 mrg gphi *phi = gsi.phi ();
599 1.1 mrg tree def = gimple_phi_arg_def (phi, src_indx);
600 1.1 mrg location_t locus = gimple_phi_arg_location (phi, src_indx);
601 1.1 mrg
602 1.1 mrg if (TREE_CODE (def) == SSA_NAME
603 1.1 mrg && !virtual_operand_p (gimple_phi_result (phi)))
604 1.1 mrg def = get_value_locus_in_path (def, path, bb, idx, &locus);
605 1.1 mrg
606 1.1 mrg add_phi_arg (phi, def, tgt_e, locus);
607 1.1 mrg }
608 1.1 mrg }
609 1.1 mrg
610 1.1 mrg /* We have recently made a copy of ORIG_BB, including its outgoing
611 1.1 mrg edges. The copy is NEW_BB. Every PHI node in every direct successor of
612 1.1 mrg ORIG_BB has a new argument associated with edge from NEW_BB to the
613 1.1 mrg successor. Initialize the PHI argument so that it is equal to the PHI
614 1.1 mrg argument associated with the edge from ORIG_BB to the successor.
615 1.1 mrg PATH and IDX are used to check if the new PHI argument has constant
616 1.1 mrg value in a flow sensitive manner. */
617 1.1 mrg
618 1.1 mrg static void
619 1.1 mrg update_destination_phis (basic_block orig_bb, basic_block new_bb,
620 1.1 mrg vec<jump_thread_edge *> *path, int idx)
621 1.1 mrg {
622 1.1 mrg edge_iterator ei;
623 1.1 mrg edge e;
624 1.1 mrg
625 1.1 mrg FOR_EACH_EDGE (e, ei, orig_bb->succs)
626 1.1 mrg {
627 1.1 mrg edge e2 = find_edge (new_bb, e->dest);
628 1.1 mrg copy_phi_args (e->dest, e, e2, path, idx);
629 1.1 mrg }
630 1.1 mrg }
631 1.1 mrg
632 1.1 mrg /* Given a duplicate block and its single destination (both stored
633 1.1 mrg in RD). Create an edge between the duplicate and its single
634 1.1 mrg destination.
635 1.1 mrg
636 1.1 mrg Add an additional argument to any PHI nodes at the single
637 1.1 mrg destination. IDX is the start node in jump threading path
638 1.1 mrg we start to check to see if the new PHI argument has constant
639 1.1 mrg value along the jump threading path. */
640 1.1 mrg
641 1.1 mrg static void
642 1.1 mrg create_edge_and_update_destination_phis (struct redirection_data *rd,
643 1.1 mrg basic_block bb, int idx)
644 1.1 mrg {
645 1.1 mrg edge e = make_single_succ_edge (bb, rd->path->last ()->e->dest, EDGE_FALLTHRU);
646 1.1 mrg
647 1.1 mrg rescan_loop_exit (e, true, false);
648 1.1 mrg
649 1.1 mrg /* We used to copy the thread path here. That was added in 2007
650 1.1 mrg and dutifully updated through the representation changes in 2013.
651 1.1 mrg
652 1.1 mrg In 2013 we added code to thread from an interior node through
653 1.1 mrg the backedge to another interior node. That runs after the code
654 1.1 mrg to thread through loop headers from outside the loop.
655 1.1 mrg
656 1.1 mrg The latter may delete edges in the CFG, including those
657 1.1 mrg which appeared in the jump threading path we copied here. Thus
658 1.1 mrg we'd end up using a dangling pointer.
659 1.1 mrg
660 1.1 mrg After reviewing the 2007/2011 code, I can't see how anything
661 1.1 mrg depended on copying the AUX field and clearly copying the jump
662 1.1 mrg threading path is problematical due to embedded edge pointers.
663 1.1 mrg It has been removed. */
664 1.1 mrg e->aux = NULL;
665 1.1 mrg
666 1.1 mrg /* If there are any PHI nodes at the destination of the outgoing edge
667 1.1 mrg from the duplicate block, then we will need to add a new argument
668 1.1 mrg to them. The argument should have the same value as the argument
669 1.1 mrg associated with the outgoing edge stored in RD. */
670 1.1 mrg copy_phi_args (e->dest, rd->path->last ()->e, e, rd->path, idx);
671 1.1 mrg }
672 1.1 mrg
673 1.1 mrg /* Look through PATH beginning at START and return TRUE if there are
674 1.1 mrg any additional blocks that need to be duplicated. Otherwise,
675 1.1 mrg return FALSE. */
676 1.1 mrg static bool
677 1.1 mrg any_remaining_duplicated_blocks (vec<jump_thread_edge *> *path,
678 1.1 mrg unsigned int start)
679 1.1 mrg {
680 1.1 mrg for (unsigned int i = start + 1; i < path->length (); i++)
681 1.1 mrg {
682 1.1 mrg if ((*path)[i]->type == EDGE_COPY_SRC_JOINER_BLOCK
683 1.1 mrg || (*path)[i]->type == EDGE_COPY_SRC_BLOCK)
684 1.1 mrg return true;
685 1.1 mrg }
686 1.1 mrg return false;
687 1.1 mrg }
688 1.1 mrg
689 1.1 mrg
690 1.1 mrg /* Compute the amount of profile count coming into the jump threading
691 1.1 mrg path stored in RD that we are duplicating, returned in PATH_IN_COUNT_PTR and
692 1.1 mrg PATH_IN_FREQ_PTR, as well as the amount of counts flowing out of the
693 1.1 mrg duplicated path, returned in PATH_OUT_COUNT_PTR. LOCAL_INFO is used to
694 1.1 mrg identify blocks duplicated for jump threading, which have duplicated
695 1.1 mrg edges that need to be ignored in the analysis. Return true if path contains
696 1.1 mrg a joiner, false otherwise.
697 1.1 mrg
698 1.1 mrg In the non-joiner case, this is straightforward - all the counts
699 1.1 mrg flowing into the jump threading path should flow through the duplicated
700 1.1 mrg block and out of the duplicated path.
701 1.1 mrg
702 1.1 mrg In the joiner case, it is very tricky. Some of the counts flowing into
703 1.1 mrg the original path go offpath at the joiner. The problem is that while
704 1.1 mrg we know how much total count goes off-path in the original control flow,
705 1.1 mrg we don't know how many of the counts corresponding to just the jump
706 1.1 mrg threading path go offpath at the joiner.
707 1.1 mrg
708 1.1 mrg For example, assume we have the following control flow and identified
709 1.1 mrg jump threading paths:
710 1.1 mrg
711 1.1 mrg A B C
712 1.1 mrg \ | /
713 1.1 mrg Ea \ |Eb / Ec
714 1.1 mrg \ | /
715 1.1 mrg v v v
716 1.1 mrg J <-- Joiner
717 1.1 mrg / \
718 1.1 mrg Eoff/ \Eon
719 1.1 mrg / \
720 1.1 mrg v v
721 1.1 mrg Soff Son <--- Normal
722 1.1 mrg /\
723 1.1 mrg Ed/ \ Ee
724 1.1 mrg / \
725 1.1 mrg v v
726 1.1 mrg D E
727 1.1 mrg
728 1.1 mrg Jump threading paths: A -> J -> Son -> D (path 1)
729 1.1 mrg C -> J -> Son -> E (path 2)
730 1.1 mrg
731 1.1 mrg Note that the control flow could be more complicated:
732 1.1 mrg - Each jump threading path may have more than one incoming edge. I.e. A and
733 1.1 mrg Ea could represent multiple incoming blocks/edges that are included in
734 1.1 mrg path 1.
735 1.1 mrg - There could be EDGE_NO_COPY_SRC_BLOCK edges after the joiner (either
736 1.1 mrg before or after the "normal" copy block). These are not duplicated onto
737 1.1 mrg the jump threading path, as they are single-successor.
738 1.1 mrg - Any of the blocks along the path may have other incoming edges that
739 1.1 mrg are not part of any jump threading path, but add profile counts along
740 1.1 mrg the path.
741 1.1 mrg
742 1.1 mrg In the above example, after all jump threading is complete, we will
743 1.1 mrg end up with the following control flow:
744 1.1 mrg
745 1.1 mrg A B C
746 1.1 mrg | | |
747 1.1 mrg Ea| |Eb |Ec
748 1.1 mrg | | |
749 1.1 mrg v v v
750 1.1 mrg Ja J Jc
751 1.1 mrg / \ / \Eon' / \
752 1.1 mrg Eona/ \ ---/---\-------- \Eonc
753 1.1 mrg / \ / / \ \
754 1.1 mrg v v v v v
755 1.1 mrg Sona Soff Son Sonc
756 1.1 mrg \ /\ /
757 1.1 mrg \___________ / \ _____/
758 1.1 mrg \ / \/
759 1.1 mrg vv v
760 1.1 mrg D E
761 1.1 mrg
762 1.1 mrg The main issue to notice here is that when we are processing path 1
763 1.1 mrg (A->J->Son->D) we need to figure out the outgoing edge weights to
764 1.1 mrg the duplicated edges Ja->Sona and Ja->Soff, while ensuring that the
765 1.1 mrg sum of the incoming weights to D remain Ed. The problem with simply
766 1.1 mrg assuming that Ja (and Jc when processing path 2) has the same outgoing
767 1.1 mrg probabilities to its successors as the original block J, is that after
768 1.1 mrg all paths are processed and other edges/counts removed (e.g. none
769 1.1 mrg of Ec will reach D after processing path 2), we may end up with not
770 1.1 mrg enough count flowing along duplicated edge Sona->D.
771 1.1 mrg
772 1.1 mrg Therefore, in the case of a joiner, we keep track of all counts
773 1.1 mrg coming in along the current path, as well as from predecessors not
774 1.1 mrg on any jump threading path (Eb in the above example). While we
775 1.1 mrg first assume that the duplicated Eona for Ja->Sona has the same
776 1.1 mrg probability as the original, we later compensate for other jump
777 1.1 mrg threading paths that may eliminate edges. We do that by keep track
778 1.1 mrg of all counts coming into the original path that are not in a jump
779 1.1 mrg thread (Eb in the above example, but as noted earlier, there could
780 1.1 mrg be other predecessors incoming to the path at various points, such
781 1.1 mrg as at Son). Call this cumulative non-path count coming into the path
782 1.1 mrg before D as Enonpath. We then ensure that the count from Sona->D is as at
783 1.1 mrg least as big as (Ed - Enonpath), but no bigger than the minimum
784 1.1 mrg weight along the jump threading path. The probabilities of both the
785 1.1 mrg original and duplicated joiner block J and Ja will be adjusted
786 1.1 mrg accordingly after the updates. */
787 1.1 mrg
788 1.1 mrg static bool
789 1.1 mrg compute_path_counts (struct redirection_data *rd,
790 1.1 mrg ssa_local_info_t *local_info,
791 1.1 mrg profile_count *path_in_count_ptr,
792 1.1 mrg profile_count *path_out_count_ptr)
793 1.1 mrg {
794 1.1 mrg edge e = rd->incoming_edges->e;
795 1.1 mrg vec<jump_thread_edge *> *path = THREAD_PATH (e);
796 1.1 mrg edge elast = path->last ()->e;
797 1.1 mrg profile_count nonpath_count = profile_count::zero ();
798 1.1 mrg bool has_joiner = false;
799 1.1 mrg profile_count path_in_count = profile_count::zero ();
800 1.1 mrg
801 1.1 mrg /* Start by accumulating incoming edge counts to the path's first bb
802 1.1 mrg into a couple buckets:
803 1.1 mrg path_in_count: total count of incoming edges that flow into the
804 1.1 mrg current path.
805 1.1 mrg nonpath_count: total count of incoming edges that are not
806 1.1 mrg flowing along *any* path. These are the counts
807 1.1 mrg that will still flow along the original path after
808 1.1 mrg all path duplication is done by potentially multiple
809 1.1 mrg calls to this routine.
810 1.1 mrg (any other incoming edge counts are for a different jump threading
811 1.1 mrg path that will be handled by a later call to this routine.)
812 1.1 mrg To make this easier, start by recording all incoming edges that flow into
813 1.1 mrg the current path in a bitmap. We could add up the path's incoming edge
814 1.1 mrg counts here, but we still need to walk all the first bb's incoming edges
815 1.1 mrg below to add up the counts of the other edges not included in this jump
816 1.1 mrg threading path. */
817 1.1 mrg struct el *next, *el;
818 1.1 mrg auto_bitmap in_edge_srcs;
819 1.1 mrg for (el = rd->incoming_edges; el; el = next)
820 1.1 mrg {
821 1.1 mrg next = el->next;
822 1.1 mrg bitmap_set_bit (in_edge_srcs, el->e->src->index);
823 1.1 mrg }
824 1.1 mrg edge ein;
825 1.1 mrg edge_iterator ei;
826 1.1 mrg FOR_EACH_EDGE (ein, ei, e->dest->preds)
827 1.1 mrg {
828 1.1 mrg vec<jump_thread_edge *> *ein_path = THREAD_PATH (ein);
829 1.1 mrg /* Simply check the incoming edge src against the set captured above. */
830 1.1 mrg if (ein_path
831 1.1 mrg && bitmap_bit_p (in_edge_srcs, (*ein_path)[0]->e->src->index))
832 1.1 mrg {
833 1.1 mrg /* It is necessary but not sufficient that the last path edges
834 1.1 mrg are identical. There may be different paths that share the
835 1.1 mrg same last path edge in the case where the last edge has a nocopy
836 1.1 mrg source block. */
837 1.1 mrg gcc_assert (ein_path->last ()->e == elast);
838 1.1 mrg path_in_count += ein->count ();
839 1.1 mrg }
840 1.1 mrg else if (!ein_path)
841 1.1 mrg {
842 1.1 mrg /* Keep track of the incoming edges that are not on any jump-threading
843 1.1 mrg path. These counts will still flow out of original path after all
844 1.1 mrg jump threading is complete. */
845 1.1 mrg nonpath_count += ein->count ();
846 1.1 mrg }
847 1.1 mrg }
848 1.1 mrg
849 1.1 mrg /* Now compute the fraction of the total count coming into the first
850 1.1 mrg path bb that is from the current threading path. */
851 1.1 mrg profile_count total_count = e->dest->count;
852 1.1 mrg /* Handle incoming profile insanities. */
853 1.1 mrg if (total_count < path_in_count)
854 1.1 mrg path_in_count = total_count;
855 1.1 mrg profile_probability onpath_scale = path_in_count.probability_in (total_count);
856 1.1 mrg
857 1.1 mrg /* Walk the entire path to do some more computation in order to estimate
858 1.1 mrg how much of the path_in_count will flow out of the duplicated threading
859 1.1 mrg path. In the non-joiner case this is straightforward (it should be
860 1.1 mrg the same as path_in_count, although we will handle incoming profile
861 1.1 mrg insanities by setting it equal to the minimum count along the path).
862 1.1 mrg
863 1.1 mrg In the joiner case, we need to estimate how much of the path_in_count
864 1.1 mrg will stay on the threading path after the joiner's conditional branch.
865 1.1 mrg We don't really know for sure how much of the counts
866 1.1 mrg associated with this path go to each successor of the joiner, but we'll
867 1.1 mrg estimate based on the fraction of the total count coming into the path
868 1.1 mrg bb was from the threading paths (computed above in onpath_scale).
869 1.1 mrg Afterwards, we will need to do some fixup to account for other threading
870 1.1 mrg paths and possible profile insanities.
871 1.1 mrg
872 1.1 mrg In order to estimate the joiner case's counts we also need to update
873 1.1 mrg nonpath_count with any additional counts coming into the path. Other
874 1.1 mrg blocks along the path may have additional predecessors from outside
875 1.1 mrg the path. */
876 1.1 mrg profile_count path_out_count = path_in_count;
877 1.1 mrg profile_count min_path_count = path_in_count;
878 1.1 mrg for (unsigned int i = 1; i < path->length (); i++)
879 1.1 mrg {
880 1.1 mrg edge epath = (*path)[i]->e;
881 1.1 mrg profile_count cur_count = epath->count ();
882 1.1 mrg if ((*path)[i]->type == EDGE_COPY_SRC_JOINER_BLOCK)
883 1.1 mrg {
884 1.1 mrg has_joiner = true;
885 1.1 mrg cur_count = cur_count.apply_probability (onpath_scale);
886 1.1 mrg }
887 1.1 mrg /* In the joiner case we need to update nonpath_count for any edges
888 1.1 mrg coming into the path that will contribute to the count flowing
889 1.1 mrg into the path successor. */
890 1.1 mrg if (has_joiner && epath != elast)
891 1.1 mrg {
892 1.1 mrg /* Look for other incoming edges after joiner. */
893 1.1 mrg FOR_EACH_EDGE (ein, ei, epath->dest->preds)
894 1.1 mrg {
895 1.1 mrg if (ein != epath
896 1.1 mrg /* Ignore in edges from blocks we have duplicated for a
897 1.1 mrg threading path, which have duplicated edge counts until
898 1.1 mrg they are redirected by an invocation of this routine. */
899 1.1 mrg && !bitmap_bit_p (local_info->duplicate_blocks,
900 1.1 mrg ein->src->index))
901 1.1 mrg nonpath_count += ein->count ();
902 1.1 mrg }
903 1.1 mrg }
904 1.1 mrg if (cur_count < path_out_count)
905 1.1 mrg path_out_count = cur_count;
906 1.1 mrg if (epath->count () < min_path_count)
907 1.1 mrg min_path_count = epath->count ();
908 1.1 mrg }
909 1.1 mrg
910 1.1 mrg /* We computed path_out_count above assuming that this path targeted
911 1.1 mrg the joiner's on-path successor with the same likelihood as it
912 1.1 mrg reached the joiner. However, other thread paths through the joiner
913 1.1 mrg may take a different path through the normal copy source block
914 1.1 mrg (i.e. they have a different elast), meaning that they do not
915 1.1 mrg contribute any counts to this path's elast. As a result, it may
916 1.1 mrg turn out that this path must have more count flowing to the on-path
917 1.1 mrg successor of the joiner. Essentially, all of this path's elast
918 1.1 mrg count must be contributed by this path and any nonpath counts
919 1.1 mrg (since any path through the joiner with a different elast will not
920 1.1 mrg include a copy of this elast in its duplicated path).
921 1.1 mrg So ensure that this path's path_out_count is at least the
922 1.1 mrg difference between elast->count () and nonpath_count. Otherwise the edge
923 1.1 mrg counts after threading will not be sane. */
924 1.1 mrg if (local_info->need_profile_correction
925 1.1 mrg && has_joiner && path_out_count < elast->count () - nonpath_count)
926 1.1 mrg {
927 1.1 mrg path_out_count = elast->count () - nonpath_count;
928 1.1 mrg /* But neither can we go above the minimum count along the path
929 1.1 mrg we are duplicating. This can be an issue due to profile
930 1.1 mrg insanities coming in to this pass. */
931 1.1 mrg if (path_out_count > min_path_count)
932 1.1 mrg path_out_count = min_path_count;
933 1.1 mrg }
934 1.1 mrg
935 1.1 mrg *path_in_count_ptr = path_in_count;
936 1.1 mrg *path_out_count_ptr = path_out_count;
937 1.1 mrg return has_joiner;
938 1.1 mrg }
939 1.1 mrg
940 1.1 mrg
941 1.1 mrg /* Update the counts and frequencies for both an original path
942 1.1 mrg edge EPATH and its duplicate EDUP. The duplicate source block
943 1.1 mrg will get a count of PATH_IN_COUNT and PATH_IN_FREQ,
944 1.1 mrg and the duplicate edge EDUP will have a count of PATH_OUT_COUNT. */
945 1.1 mrg static void
946 1.1 mrg update_profile (edge epath, edge edup, profile_count path_in_count,
947 1.1 mrg profile_count path_out_count)
948 1.1 mrg {
949 1.1 mrg
950 1.1 mrg /* First update the duplicated block's count. */
951 1.1 mrg if (edup)
952 1.1 mrg {
953 1.1 mrg basic_block dup_block = edup->src;
954 1.1 mrg
955 1.1 mrg /* Edup's count is reduced by path_out_count. We need to redistribute
956 1.1 mrg probabilities to the remaining edges. */
957 1.1 mrg
958 1.1 mrg edge esucc;
959 1.1 mrg edge_iterator ei;
960 1.1 mrg profile_probability edup_prob
961 1.1 mrg = path_out_count.probability_in (path_in_count);
962 1.1 mrg
963 1.1 mrg /* Either scale up or down the remaining edges.
964 1.1 mrg probabilities are always in range <0,1> and thus we can't do
965 1.1 mrg both by same loop. */
966 1.1 mrg if (edup->probability > edup_prob)
967 1.1 mrg {
968 1.1 mrg profile_probability rev_scale
969 1.1 mrg = (profile_probability::always () - edup->probability)
970 1.1 mrg / (profile_probability::always () - edup_prob);
971 1.1 mrg FOR_EACH_EDGE (esucc, ei, dup_block->succs)
972 1.1 mrg if (esucc != edup)
973 1.1 mrg esucc->probability /= rev_scale;
974 1.1 mrg }
975 1.1 mrg else if (edup->probability < edup_prob)
976 1.1 mrg {
977 1.1 mrg profile_probability scale
978 1.1 mrg = (profile_probability::always () - edup_prob)
979 1.1 mrg / (profile_probability::always () - edup->probability);
980 1.1 mrg FOR_EACH_EDGE (esucc, ei, dup_block->succs)
981 1.1 mrg if (esucc != edup)
982 1.1 mrg esucc->probability *= scale;
983 1.1 mrg }
984 1.1 mrg if (edup_prob.initialized_p ())
985 1.1 mrg edup->probability = edup_prob;
986 1.1 mrg
987 1.1 mrg gcc_assert (!dup_block->count.initialized_p ());
988 1.1 mrg dup_block->count = path_in_count;
989 1.1 mrg }
990 1.1 mrg
991 1.1 mrg if (path_in_count == profile_count::zero ())
992 1.1 mrg return;
993 1.1 mrg
994 1.1 mrg profile_count final_count = epath->count () - path_out_count;
995 1.1 mrg
996 1.1 mrg /* Now update the original block's count in the
997 1.1 mrg opposite manner - remove the counts/freq that will flow
998 1.1 mrg into the duplicated block. Handle underflow due to precision/
999 1.1 mrg rounding issues. */
1000 1.1 mrg epath->src->count -= path_in_count;
1001 1.1 mrg
1002 1.1 mrg /* Next update this path edge's original and duplicated counts. We know
1003 1.1 mrg that the duplicated path will have path_out_count flowing
1004 1.1 mrg out of it (in the joiner case this is the count along the duplicated path
1005 1.1 mrg out of the duplicated joiner). This count can then be removed from the
1006 1.1 mrg original path edge. */
1007 1.1 mrg
1008 1.1 mrg edge esucc;
1009 1.1 mrg edge_iterator ei;
1010 1.1 mrg profile_probability epath_prob = final_count.probability_in (epath->src->count);
1011 1.1 mrg
1012 1.1 mrg if (epath->probability > epath_prob)
1013 1.1 mrg {
1014 1.1 mrg profile_probability rev_scale
1015 1.1 mrg = (profile_probability::always () - epath->probability)
1016 1.1 mrg / (profile_probability::always () - epath_prob);
1017 1.1 mrg FOR_EACH_EDGE (esucc, ei, epath->src->succs)
1018 1.1 mrg if (esucc != epath)
1019 1.1 mrg esucc->probability /= rev_scale;
1020 1.1 mrg }
1021 1.1 mrg else if (epath->probability < epath_prob)
1022 1.1 mrg {
1023 1.1 mrg profile_probability scale
1024 1.1 mrg = (profile_probability::always () - epath_prob)
1025 1.1 mrg / (profile_probability::always () - epath->probability);
1026 1.1 mrg FOR_EACH_EDGE (esucc, ei, epath->src->succs)
1027 1.1 mrg if (esucc != epath)
1028 1.1 mrg esucc->probability *= scale;
1029 1.1 mrg }
1030 1.1 mrg if (epath_prob.initialized_p ())
1031 1.1 mrg epath->probability = epath_prob;
1032 1.1 mrg }
1033 1.1 mrg
1034 1.1 mrg /* Wire up the outgoing edges from the duplicate blocks and
1035 1.1 mrg update any PHIs as needed. Also update the profile counts
1036 1.1 mrg on the original and duplicate blocks and edges. */
1037 1.1 mrg void
1038 1.1 mrg ssa_fix_duplicate_block_edges (struct redirection_data *rd,
1039 1.1 mrg ssa_local_info_t *local_info)
1040 1.1 mrg {
1041 1.1 mrg bool multi_incomings = (rd->incoming_edges->next != NULL);
1042 1.1 mrg edge e = rd->incoming_edges->e;
1043 1.1 mrg vec<jump_thread_edge *> *path = THREAD_PATH (e);
1044 1.1 mrg edge elast = path->last ()->e;
1045 1.1 mrg profile_count path_in_count = profile_count::zero ();
1046 1.1 mrg profile_count path_out_count = profile_count::zero ();
1047 1.1 mrg
1048 1.1 mrg /* First determine how much profile count to move from original
1049 1.1 mrg path to the duplicate path. This is tricky in the presence of
1050 1.1 mrg a joiner (see comments for compute_path_counts), where some portion
1051 1.1 mrg of the path's counts will flow off-path from the joiner. In the
1052 1.1 mrg non-joiner case the path_in_count and path_out_count should be the
1053 1.1 mrg same. */
1054 1.1 mrg bool has_joiner = compute_path_counts (rd, local_info,
1055 1.1 mrg &path_in_count, &path_out_count);
1056 1.1 mrg
1057 1.1 mrg for (unsigned int count = 0, i = 1; i < path->length (); i++)
1058 1.1 mrg {
1059 1.1 mrg edge epath = (*path)[i]->e;
1060 1.1 mrg
1061 1.1 mrg /* If we were threading through an joiner block, then we want
1062 1.1 mrg to keep its control statement and redirect an outgoing edge.
1063 1.1 mrg Else we want to remove the control statement & edges, then create
1064 1.1 mrg a new outgoing edge. In both cases we may need to update PHIs. */
1065 1.1 mrg if ((*path)[i]->type == EDGE_COPY_SRC_JOINER_BLOCK)
1066 1.1 mrg {
1067 1.1 mrg edge victim;
1068 1.1 mrg edge e2;
1069 1.1 mrg
1070 1.1 mrg gcc_assert (has_joiner);
1071 1.1 mrg
1072 1.1 mrg /* This updates the PHIs at the destination of the duplicate
1073 1.1 mrg block. Pass 0 instead of i if we are threading a path which
1074 1.1 mrg has multiple incoming edges. */
1075 1.1 mrg update_destination_phis (local_info->bb, rd->dup_blocks[count],
1076 1.1 mrg path, multi_incomings ? 0 : i);
1077 1.1 mrg
1078 1.1 mrg /* Find the edge from the duplicate block to the block we're
1079 1.1 mrg threading through. That's the edge we want to redirect. */
1080 1.1 mrg victim = find_edge (rd->dup_blocks[count], (*path)[i]->e->dest);
1081 1.1 mrg
1082 1.1 mrg /* If there are no remaining blocks on the path to duplicate,
1083 1.1 mrg then redirect VICTIM to the final destination of the jump
1084 1.1 mrg threading path. */
1085 1.1 mrg if (!any_remaining_duplicated_blocks (path, i))
1086 1.1 mrg {
1087 1.1 mrg e2 = redirect_edge_and_branch (victim, elast->dest);
1088 1.1 mrg /* If we redirected the edge, then we need to copy PHI arguments
1089 1.1 mrg at the target. If the edge already existed (e2 != victim
1090 1.1 mrg case), then the PHIs in the target already have the correct
1091 1.1 mrg arguments. */
1092 1.1 mrg if (e2 == victim)
1093 1.1 mrg copy_phi_args (e2->dest, elast, e2,
1094 1.1 mrg path, multi_incomings ? 0 : i);
1095 1.1 mrg }
1096 1.1 mrg else
1097 1.1 mrg {
1098 1.1 mrg /* Redirect VICTIM to the next duplicated block in the path. */
1099 1.1 mrg e2 = redirect_edge_and_branch (victim, rd->dup_blocks[count + 1]);
1100 1.1 mrg
1101 1.1 mrg /* We need to update the PHIs in the next duplicated block. We
1102 1.1 mrg want the new PHI args to have the same value as they had
1103 1.1 mrg in the source of the next duplicate block.
1104 1.1 mrg
1105 1.1 mrg Thus, we need to know which edge we traversed into the
1106 1.1 mrg source of the duplicate. Furthermore, we may have
1107 1.1 mrg traversed many edges to reach the source of the duplicate.
1108 1.1 mrg
1109 1.1 mrg Walk through the path starting at element I until we
1110 1.1 mrg hit an edge marked with EDGE_COPY_SRC_BLOCK. We want
1111 1.1 mrg the edge from the prior element. */
1112 1.1 mrg for (unsigned int j = i + 1; j < path->length (); j++)
1113 1.1 mrg {
1114 1.1 mrg if ((*path)[j]->type == EDGE_COPY_SRC_BLOCK)
1115 1.1 mrg {
1116 1.1 mrg copy_phi_arg_into_existing_phi ((*path)[j - 1]->e, e2);
1117 1.1 mrg break;
1118 1.1 mrg }
1119 1.1 mrg }
1120 1.1 mrg }
1121 1.1 mrg
1122 1.1 mrg /* Update the counts of both the original block
1123 1.1 mrg and path edge, and the duplicates. The path duplicate's
1124 1.1 mrg incoming count are the totals for all edges
1125 1.1 mrg incoming to this jump threading path computed earlier.
1126 1.1 mrg And we know that the duplicated path will have path_out_count
1127 1.1 mrg flowing out of it (i.e. along the duplicated path out of the
1128 1.1 mrg duplicated joiner). */
1129 1.1 mrg update_profile (epath, e2, path_in_count, path_out_count);
1130 1.1 mrg }
1131 1.1 mrg else if ((*path)[i]->type == EDGE_COPY_SRC_BLOCK)
1132 1.1 mrg {
1133 1.1 mrg remove_ctrl_stmt_and_useless_edges (rd->dup_blocks[count], NULL);
1134 1.1 mrg create_edge_and_update_destination_phis (rd, rd->dup_blocks[count],
1135 1.1 mrg multi_incomings ? 0 : i);
1136 1.1 mrg if (count == 1)
1137 1.1 mrg single_succ_edge (rd->dup_blocks[1])->aux = NULL;
1138 1.1 mrg
1139 1.1 mrg /* Update the counts of both the original block
1140 1.1 mrg and path edge, and the duplicates. Since we are now after
1141 1.1 mrg any joiner that may have existed on the path, the count
1142 1.1 mrg flowing along the duplicated threaded path is path_out_count.
1143 1.1 mrg If we didn't have a joiner, then cur_path_freq was the sum
1144 1.1 mrg of the total frequencies along all incoming edges to the
1145 1.1 mrg thread path (path_in_freq). If we had a joiner, it would have
1146 1.1 mrg been updated at the end of that handling to the edge frequency
1147 1.1 mrg along the duplicated joiner path edge. */
1148 1.1 mrg update_profile (epath, EDGE_SUCC (rd->dup_blocks[count], 0),
1149 1.1 mrg path_out_count, path_out_count);
1150 1.1 mrg }
1151 1.1 mrg else
1152 1.1 mrg {
1153 1.1 mrg /* No copy case. In this case we don't have an equivalent block
1154 1.1 mrg on the duplicated thread path to update, but we do need
1155 1.1 mrg to remove the portion of the counts/freqs that were moved
1156 1.1 mrg to the duplicated path from the counts/freqs flowing through
1157 1.1 mrg this block on the original path. Since all the no-copy edges
1158 1.1 mrg are after any joiner, the removed count is the same as
1159 1.1 mrg path_out_count.
1160 1.1 mrg
1161 1.1 mrg If we didn't have a joiner, then cur_path_freq was the sum
1162 1.1 mrg of the total frequencies along all incoming edges to the
1163 1.1 mrg thread path (path_in_freq). If we had a joiner, it would have
1164 1.1 mrg been updated at the end of that handling to the edge frequency
1165 1.1 mrg along the duplicated joiner path edge. */
1166 1.1 mrg update_profile (epath, NULL, path_out_count, path_out_count);
1167 1.1 mrg }
1168 1.1 mrg
1169 1.1 mrg /* Increment the index into the duplicated path when we processed
1170 1.1 mrg a duplicated block. */
1171 1.1 mrg if ((*path)[i]->type == EDGE_COPY_SRC_JOINER_BLOCK
1172 1.1 mrg || (*path)[i]->type == EDGE_COPY_SRC_BLOCK)
1173 1.1 mrg {
1174 1.1 mrg count++;
1175 1.1 mrg }
1176 1.1 mrg }
1177 1.1 mrg }
1178 1.1 mrg
1179 1.1 mrg /* Hash table traversal callback routine to create duplicate blocks. */
1180 1.1 mrg
1181 1.1 mrg int
1182 1.1 mrg ssa_create_duplicates (struct redirection_data **slot,
1183 1.1 mrg ssa_local_info_t *local_info)
1184 1.1 mrg {
1185 1.1 mrg struct redirection_data *rd = *slot;
1186 1.1 mrg
1187 1.1 mrg /* The second duplicated block in a jump threading path is specific
1188 1.1 mrg to the path. So it gets stored in RD rather than in LOCAL_DATA.
1189 1.1 mrg
1190 1.1 mrg Each time we're called, we have to look through the path and see
1191 1.1 mrg if a second block needs to be duplicated.
1192 1.1 mrg
1193 1.1 mrg Note the search starts with the third edge on the path. The first
1194 1.1 mrg edge is the incoming edge, the second edge always has its source
1195 1.1 mrg duplicated. Thus we start our search with the third edge. */
1196 1.1 mrg vec<jump_thread_edge *> *path = rd->path;
1197 1.1 mrg for (unsigned int i = 2; i < path->length (); i++)
1198 1.1 mrg {
1199 1.1 mrg if ((*path)[i]->type == EDGE_COPY_SRC_BLOCK
1200 1.1 mrg || (*path)[i]->type == EDGE_COPY_SRC_JOINER_BLOCK)
1201 1.1 mrg {
1202 1.1 mrg create_block_for_threading ((*path)[i]->e->src, rd, 1,
1203 1.1 mrg &local_info->duplicate_blocks);
1204 1.1 mrg break;
1205 1.1 mrg }
1206 1.1 mrg }
1207 1.1 mrg
1208 1.1 mrg /* Create a template block if we have not done so already. Otherwise
1209 1.1 mrg use the template to create a new block. */
1210 1.1 mrg if (local_info->template_block == NULL)
1211 1.1 mrg {
1212 1.1 mrg create_block_for_threading ((*path)[1]->e->src, rd, 0,
1213 1.1 mrg &local_info->duplicate_blocks);
1214 1.1 mrg local_info->template_block = rd->dup_blocks[0];
1215 1.1 mrg local_info->template_last_to_copy
1216 1.1 mrg = gsi_last_bb (local_info->template_block);
1217 1.1 mrg
1218 1.1 mrg /* We do not create any outgoing edges for the template. We will
1219 1.1 mrg take care of that in a later traversal. That way we do not
1220 1.1 mrg create edges that are going to just be deleted. */
1221 1.1 mrg }
1222 1.1 mrg else
1223 1.1 mrg {
1224 1.1 mrg gimple_seq seq = NULL;
1225 1.1 mrg if (gsi_stmt (local_info->template_last_to_copy)
1226 1.1 mrg != gsi_stmt (gsi_last_bb (local_info->template_block)))
1227 1.1 mrg {
1228 1.1 mrg if (gsi_end_p (local_info->template_last_to_copy))
1229 1.1 mrg {
1230 1.1 mrg seq = bb_seq (local_info->template_block);
1231 1.1 mrg set_bb_seq (local_info->template_block, NULL);
1232 1.1 mrg }
1233 1.1 mrg else
1234 1.1 mrg seq = gsi_split_seq_after (local_info->template_last_to_copy);
1235 1.1 mrg }
1236 1.1 mrg create_block_for_threading (local_info->template_block, rd, 0,
1237 1.1 mrg &local_info->duplicate_blocks);
1238 1.1 mrg if (seq)
1239 1.1 mrg {
1240 1.1 mrg if (gsi_end_p (local_info->template_last_to_copy))
1241 1.1 mrg set_bb_seq (local_info->template_block, seq);
1242 1.1 mrg else
1243 1.1 mrg gsi_insert_seq_after (&local_info->template_last_to_copy,
1244 1.1 mrg seq, GSI_SAME_STMT);
1245 1.1 mrg }
1246 1.1 mrg
1247 1.1 mrg /* Go ahead and wire up outgoing edges and update PHIs for the duplicate
1248 1.1 mrg block. */
1249 1.1 mrg ssa_fix_duplicate_block_edges (rd, local_info);
1250 1.1 mrg }
1251 1.1 mrg
1252 1.1 mrg if (MAY_HAVE_DEBUG_STMTS)
1253 1.1 mrg {
1254 1.1 mrg /* Copy debug stmts from each NO_COPY src block to the block
1255 1.1 mrg that would have been its predecessor, if we can append to it
1256 1.1 mrg (we can't add stmts after a block-ending stmt), or prepending
1257 1.1 mrg to the duplicate of the successor, if there is one. If
1258 1.1 mrg there's no duplicate successor, we'll mostly drop the blocks
1259 1.1 mrg on the floor; propagate_threaded_block_debug_into, called
1260 1.1 mrg elsewhere, will consolidate and preserve the effects of the
1261 1.1 mrg binds, but none of the markers. */
1262 1.1 mrg gimple_stmt_iterator copy_to = gsi_last_bb (rd->dup_blocks[0]);
1263 1.1 mrg if (!gsi_end_p (copy_to))
1264 1.1 mrg {
1265 1.1 mrg if (stmt_ends_bb_p (gsi_stmt (copy_to)))
1266 1.1 mrg {
1267 1.1 mrg if (rd->dup_blocks[1])
1268 1.1 mrg copy_to = gsi_after_labels (rd->dup_blocks[1]);
1269 1.1 mrg else
1270 1.1 mrg copy_to = gsi_none ();
1271 1.1 mrg }
1272 1.1 mrg else
1273 1.1 mrg gsi_next (©_to);
1274 1.1 mrg }
1275 1.1 mrg for (unsigned int i = 2, j = 0; i < path->length (); i++)
1276 1.1 mrg if ((*path)[i]->type == EDGE_NO_COPY_SRC_BLOCK
1277 1.1 mrg && gsi_bb (copy_to))
1278 1.1 mrg {
1279 1.1 mrg for (gimple_stmt_iterator gsi = gsi_start_bb ((*path)[i]->e->src);
1280 1.1 mrg !gsi_end_p (gsi); gsi_next (&gsi))
1281 1.1 mrg {
1282 1.1 mrg if (!is_gimple_debug (gsi_stmt (gsi)))
1283 1.1 mrg continue;
1284 1.1 mrg gimple *stmt = gsi_stmt (gsi);
1285 1.1 mrg gimple *copy = gimple_copy (stmt);
1286 1.1 mrg gsi_insert_before (©_to, copy, GSI_SAME_STMT);
1287 1.1 mrg }
1288 1.1 mrg }
1289 1.1 mrg else if ((*path)[i]->type == EDGE_COPY_SRC_BLOCK
1290 1.1 mrg || (*path)[i]->type == EDGE_COPY_SRC_JOINER_BLOCK)
1291 1.1 mrg {
1292 1.1 mrg j++;
1293 1.1 mrg gcc_assert (j < 2);
1294 1.1 mrg copy_to = gsi_last_bb (rd->dup_blocks[j]);
1295 1.1 mrg if (!gsi_end_p (copy_to))
1296 1.1 mrg {
1297 1.1 mrg if (stmt_ends_bb_p (gsi_stmt (copy_to)))
1298 1.1 mrg copy_to = gsi_none ();
1299 1.1 mrg else
1300 1.1 mrg gsi_next (©_to);
1301 1.1 mrg }
1302 1.1 mrg }
1303 1.1 mrg }
1304 1.1 mrg
1305 1.1 mrg /* Keep walking the hash table. */
1306 1.1 mrg return 1;
1307 1.1 mrg }
1308 1.1 mrg
1309 1.1 mrg /* We did not create any outgoing edges for the template block during
1310 1.1 mrg block creation. This hash table traversal callback creates the
1311 1.1 mrg outgoing edge for the template block. */
1312 1.1 mrg
1313 1.1 mrg inline int
1314 1.1 mrg ssa_fixup_template_block (struct redirection_data **slot,
1315 1.1 mrg ssa_local_info_t *local_info)
1316 1.1 mrg {
1317 1.1 mrg struct redirection_data *rd = *slot;
1318 1.1 mrg
1319 1.1 mrg /* If this is the template block halt the traversal after updating
1320 1.1 mrg it appropriately.
1321 1.1 mrg
1322 1.1 mrg If we were threading through an joiner block, then we want
1323 1.1 mrg to keep its control statement and redirect an outgoing edge.
1324 1.1 mrg Else we want to remove the control statement & edges, then create
1325 1.1 mrg a new outgoing edge. In both cases we may need to update PHIs. */
1326 1.1 mrg if (rd->dup_blocks[0] && rd->dup_blocks[0] == local_info->template_block)
1327 1.1 mrg {
1328 1.1 mrg ssa_fix_duplicate_block_edges (rd, local_info);
1329 1.1 mrg return 0;
1330 1.1 mrg }
1331 1.1 mrg
1332 1.1 mrg return 1;
1333 1.1 mrg }
1334 1.1 mrg
1335 1.1 mrg /* Hash table traversal callback to redirect each incoming edge
1336 1.1 mrg associated with this hash table element to its new destination. */
1337 1.1 mrg
1338 1.1 mrg static int
1339 1.1 mrg ssa_redirect_edges (struct redirection_data **slot,
1340 1.1 mrg ssa_local_info_t *local_info)
1341 1.1 mrg {
1342 1.1 mrg struct redirection_data *rd = *slot;
1343 1.1 mrg struct el *next, *el;
1344 1.1 mrg
1345 1.1 mrg /* Walk over all the incoming edges associated with this hash table
1346 1.1 mrg entry. */
1347 1.1 mrg for (el = rd->incoming_edges; el; el = next)
1348 1.1 mrg {
1349 1.1 mrg edge e = el->e;
1350 1.1 mrg vec<jump_thread_edge *> *path = THREAD_PATH (e);
1351 1.1 mrg
1352 1.1 mrg /* Go ahead and free this element from the list. Doing this now
1353 1.1 mrg avoids the need for another list walk when we destroy the hash
1354 1.1 mrg table. */
1355 1.1 mrg next = el->next;
1356 1.1 mrg free (el);
1357 1.1 mrg
1358 1.1 mrg local_info->num_threaded_edges++;
1359 1.1 mrg
1360 1.1 mrg if (rd->dup_blocks[0])
1361 1.1 mrg {
1362 1.1 mrg edge e2;
1363 1.1 mrg
1364 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
1365 1.1 mrg fprintf (dump_file, " Threaded jump %d --> %d to %d\n",
1366 1.1 mrg e->src->index, e->dest->index, rd->dup_blocks[0]->index);
1367 1.1 mrg
1368 1.1 mrg /* Redirect the incoming edge (possibly to the joiner block) to the
1369 1.1 mrg appropriate duplicate block. */
1370 1.1 mrg e2 = redirect_edge_and_branch (e, rd->dup_blocks[0]);
1371 1.1 mrg gcc_assert (e == e2);
1372 1.1 mrg flush_pending_stmts (e2);
1373 1.1 mrg }
1374 1.1 mrg
1375 1.1 mrg /* Go ahead and clear E->aux. It's not needed anymore and failure
1376 1.1 mrg to clear it will cause all kinds of unpleasant problems later. */
1377 1.1 mrg path->release ();
1378 1.1 mrg e->aux = NULL;
1379 1.1 mrg
1380 1.1 mrg }
1381 1.1 mrg
1382 1.1 mrg /* Indicate that we actually threaded one or more jumps. */
1383 1.1 mrg if (rd->incoming_edges)
1384 1.1 mrg local_info->jumps_threaded = true;
1385 1.1 mrg
1386 1.1 mrg return 1;
1387 1.1 mrg }
1388 1.1 mrg
1389 1.1 mrg /* Return true if this block has no executable statements other than
1390 1.1 mrg a simple ctrl flow instruction. When the number of outgoing edges
1391 1.1 mrg is one, this is equivalent to a "forwarder" block. */
1392 1.1 mrg
1393 1.1 mrg static bool
1394 1.1 mrg redirection_block_p (basic_block bb)
1395 1.1 mrg {
1396 1.1 mrg gimple_stmt_iterator gsi;
1397 1.1 mrg
1398 1.1 mrg /* Advance to the first executable statement. */
1399 1.1 mrg gsi = gsi_start_bb (bb);
1400 1.1 mrg while (!gsi_end_p (gsi)
1401 1.1 mrg && (gimple_code (gsi_stmt (gsi)) == GIMPLE_LABEL
1402 1.1 mrg || is_gimple_debug (gsi_stmt (gsi))
1403 1.1 mrg || gimple_nop_p (gsi_stmt (gsi))
1404 1.1 mrg || gimple_clobber_p (gsi_stmt (gsi))))
1405 1.1 mrg gsi_next (&gsi);
1406 1.1 mrg
1407 1.1 mrg /* Check if this is an empty block. */
1408 1.1 mrg if (gsi_end_p (gsi))
1409 1.1 mrg return true;
1410 1.1 mrg
1411 1.1 mrg /* Test that we've reached the terminating control statement. */
1412 1.1 mrg return gsi_stmt (gsi)
1413 1.1 mrg && (gimple_code (gsi_stmt (gsi)) == GIMPLE_COND
1414 1.1 mrg || gimple_code (gsi_stmt (gsi)) == GIMPLE_GOTO
1415 1.1 mrg || gimple_code (gsi_stmt (gsi)) == GIMPLE_SWITCH);
1416 1.1 mrg }
1417 1.1 mrg
1418 1.1 mrg /* BB is a block which ends with a COND_EXPR or SWITCH_EXPR and when BB
1419 1.1 mrg is reached via one or more specific incoming edges, we know which
1420 1.1 mrg outgoing edge from BB will be traversed.
1421 1.1 mrg
1422 1.1 mrg We want to redirect those incoming edges to the target of the
1423 1.1 mrg appropriate outgoing edge. Doing so avoids a conditional branch
1424 1.1 mrg and may expose new optimization opportunities. Note that we have
1425 1.1 mrg to update dominator tree and SSA graph after such changes.
1426 1.1 mrg
1427 1.1 mrg The key to keeping the SSA graph update manageable is to duplicate
1428 1.1 mrg the side effects occurring in BB so that those side effects still
1429 1.1 mrg occur on the paths which bypass BB after redirecting edges.
1430 1.1 mrg
1431 1.1 mrg We accomplish this by creating duplicates of BB and arranging for
1432 1.1 mrg the duplicates to unconditionally pass control to one specific
1433 1.1 mrg successor of BB. We then revector the incoming edges into BB to
1434 1.1 mrg the appropriate duplicate of BB.
1435 1.1 mrg
1436 1.1 mrg If NOLOOP_ONLY is true, we only perform the threading as long as it
1437 1.1 mrg does not affect the structure of the loops in a nontrivial way.
1438 1.1 mrg
1439 1.1 mrg If JOINERS is true, then thread through joiner blocks as well. */
1440 1.1 mrg
1441 1.1 mrg bool
1442 1.1 mrg fwd_jt_path_registry::thread_block_1 (basic_block bb,
1443 1.1 mrg bool noloop_only,
1444 1.1 mrg bool joiners)
1445 1.1 mrg {
1446 1.1 mrg /* E is an incoming edge into BB that we may or may not want to
1447 1.1 mrg redirect to a duplicate of BB. */
1448 1.1 mrg edge e, e2;
1449 1.1 mrg edge_iterator ei;
1450 1.1 mrg ssa_local_info_t local_info;
1451 1.1 mrg
1452 1.1 mrg local_info.duplicate_blocks = BITMAP_ALLOC (NULL);
1453 1.1 mrg local_info.need_profile_correction = false;
1454 1.1 mrg local_info.num_threaded_edges = 0;
1455 1.1 mrg
1456 1.1 mrg /* To avoid scanning a linear array for the element we need we instead
1457 1.1 mrg use a hash table. For normal code there should be no noticeable
1458 1.1 mrg difference. However, if we have a block with a large number of
1459 1.1 mrg incoming and outgoing edges such linear searches can get expensive. */
1460 1.1 mrg m_redirection_data
1461 1.1 mrg = new hash_table<struct redirection_data> (EDGE_COUNT (bb->succs));
1462 1.1 mrg
1463 1.1 mrg /* Record each unique threaded destination into a hash table for
1464 1.1 mrg efficient lookups. */
1465 1.1 mrg edge last = NULL;
1466 1.1 mrg FOR_EACH_EDGE (e, ei, bb->preds)
1467 1.1 mrg {
1468 1.1 mrg if (e->aux == NULL)
1469 1.1 mrg continue;
1470 1.1 mrg
1471 1.1 mrg vec<jump_thread_edge *> *path = THREAD_PATH (e);
1472 1.1 mrg
1473 1.1 mrg if (((*path)[1]->type == EDGE_COPY_SRC_JOINER_BLOCK && !joiners)
1474 1.1 mrg || ((*path)[1]->type == EDGE_COPY_SRC_BLOCK && joiners))
1475 1.1 mrg continue;
1476 1.1 mrg
1477 1.1 mrg e2 = path->last ()->e;
1478 1.1 mrg if (!e2 || noloop_only)
1479 1.1 mrg {
1480 1.1 mrg /* If NOLOOP_ONLY is true, we only allow threading through the
1481 1.1 mrg header of a loop to exit edges. */
1482 1.1 mrg
1483 1.1 mrg /* One case occurs when there was loop header buried in a jump
1484 1.1 mrg threading path that crosses loop boundaries. We do not try
1485 1.1 mrg and thread this elsewhere, so just cancel the jump threading
1486 1.1 mrg request by clearing the AUX field now. */
1487 1.1 mrg if (bb->loop_father != e2->src->loop_father
1488 1.1 mrg && (!loop_exit_edge_p (e2->src->loop_father, e2)
1489 1.1 mrg || flow_loop_nested_p (bb->loop_father,
1490 1.1 mrg e2->dest->loop_father)))
1491 1.1 mrg {
1492 1.1 mrg /* Since this case is not handled by our special code
1493 1.1 mrg to thread through a loop header, we must explicitly
1494 1.1 mrg cancel the threading request here. */
1495 1.1 mrg cancel_thread (path, "Threading through unhandled loop header");
1496 1.1 mrg e->aux = NULL;
1497 1.1 mrg continue;
1498 1.1 mrg }
1499 1.1 mrg
1500 1.1 mrg /* Another case occurs when trying to thread through our
1501 1.1 mrg own loop header, possibly from inside the loop. We will
1502 1.1 mrg thread these later. */
1503 1.1 mrg unsigned int i;
1504 1.1 mrg for (i = 1; i < path->length (); i++)
1505 1.1 mrg {
1506 1.1 mrg if ((*path)[i]->e->src == bb->loop_father->header
1507 1.1 mrg && (!loop_exit_edge_p (bb->loop_father, e2)
1508 1.1 mrg || (*path)[1]->type == EDGE_COPY_SRC_JOINER_BLOCK))
1509 1.1 mrg break;
1510 1.1 mrg }
1511 1.1 mrg
1512 1.1 mrg if (i != path->length ())
1513 1.1 mrg continue;
1514 1.1 mrg
1515 1.1 mrg /* Loop parallelization can be confused by the result of
1516 1.1 mrg threading through the loop exit test back into the loop.
1517 1.1 mrg However, theading those jumps seems to help other codes.
1518 1.1 mrg
1519 1.1 mrg I have been unable to find anything related to the shape of
1520 1.1 mrg the CFG, the contents of the affected blocks, etc which would
1521 1.1 mrg allow a more sensible test than what we're using below which
1522 1.1 mrg merely avoids the optimization when parallelizing loops. */
1523 1.1 mrg if (flag_tree_parallelize_loops > 1)
1524 1.1 mrg {
1525 1.1 mrg for (i = 1; i < path->length (); i++)
1526 1.1 mrg if (bb->loop_father == e2->src->loop_father
1527 1.1 mrg && loop_exits_from_bb_p (bb->loop_father,
1528 1.1 mrg (*path)[i]->e->src)
1529 1.1 mrg && !loop_exit_edge_p (bb->loop_father, e2))
1530 1.1 mrg break;
1531 1.1 mrg
1532 1.1 mrg if (i != path->length ())
1533 1.1 mrg {
1534 1.1 mrg cancel_thread (path, "Threading through loop exit");
1535 1.1 mrg e->aux = NULL;
1536 1.1 mrg continue;
1537 1.1 mrg }
1538 1.1 mrg }
1539 1.1 mrg }
1540 1.1 mrg
1541 1.1 mrg /* Insert the outgoing edge into the hash table if it is not
1542 1.1 mrg already in the hash table. */
1543 1.1 mrg lookup_redirection_data (e, INSERT);
1544 1.1 mrg
1545 1.1 mrg /* When we have thread paths through a common joiner with different
1546 1.1 mrg final destinations, then we may need corrections to deal with
1547 1.1 mrg profile insanities. See the big comment before compute_path_counts. */
1548 1.1 mrg if ((*path)[1]->type == EDGE_COPY_SRC_JOINER_BLOCK)
1549 1.1 mrg {
1550 1.1 mrg if (!last)
1551 1.1 mrg last = e2;
1552 1.1 mrg else if (e2 != last)
1553 1.1 mrg local_info.need_profile_correction = true;
1554 1.1 mrg }
1555 1.1 mrg }
1556 1.1 mrg
1557 1.1 mrg /* We do not update dominance info. */
1558 1.1 mrg free_dominance_info (CDI_DOMINATORS);
1559 1.1 mrg
1560 1.1 mrg /* We know we only thread through the loop header to loop exits.
1561 1.1 mrg Let the basic block duplication hook know we are not creating
1562 1.1 mrg a multiple entry loop. */
1563 1.1 mrg if (noloop_only
1564 1.1 mrg && bb == bb->loop_father->header)
1565 1.1 mrg set_loop_copy (bb->loop_father, loop_outer (bb->loop_father));
1566 1.1 mrg
1567 1.1 mrg /* Now create duplicates of BB.
1568 1.1 mrg
1569 1.1 mrg Note that for a block with a high outgoing degree we can waste
1570 1.1 mrg a lot of time and memory creating and destroying useless edges.
1571 1.1 mrg
1572 1.1 mrg So we first duplicate BB and remove the control structure at the
1573 1.1 mrg tail of the duplicate as well as all outgoing edges from the
1574 1.1 mrg duplicate. We then use that duplicate block as a template for
1575 1.1 mrg the rest of the duplicates. */
1576 1.1 mrg local_info.template_block = NULL;
1577 1.1 mrg local_info.bb = bb;
1578 1.1 mrg local_info.jumps_threaded = false;
1579 1.1 mrg m_redirection_data->traverse <ssa_local_info_t *, ssa_create_duplicates>
1580 1.1 mrg (&local_info);
1581 1.1 mrg
1582 1.1 mrg /* The template does not have an outgoing edge. Create that outgoing
1583 1.1 mrg edge and update PHI nodes as the edge's target as necessary.
1584 1.1 mrg
1585 1.1 mrg We do this after creating all the duplicates to avoid creating
1586 1.1 mrg unnecessary edges. */
1587 1.1 mrg m_redirection_data->traverse <ssa_local_info_t *, ssa_fixup_template_block>
1588 1.1 mrg (&local_info);
1589 1.1 mrg
1590 1.1 mrg /* The hash table traversals above created the duplicate blocks (and the
1591 1.1 mrg statements within the duplicate blocks). This loop creates PHI nodes for
1592 1.1 mrg the duplicated blocks and redirects the incoming edges into BB to reach
1593 1.1 mrg the duplicates of BB. */
1594 1.1 mrg m_redirection_data->traverse <ssa_local_info_t *, ssa_redirect_edges>
1595 1.1 mrg (&local_info);
1596 1.1 mrg
1597 1.1 mrg /* Done with this block. Clear REDIRECTION_DATA. */
1598 1.1 mrg delete m_redirection_data;
1599 1.1 mrg m_redirection_data = NULL;
1600 1.1 mrg
1601 1.1 mrg if (noloop_only
1602 1.1 mrg && bb == bb->loop_father->header)
1603 1.1 mrg set_loop_copy (bb->loop_father, NULL);
1604 1.1 mrg
1605 1.1 mrg BITMAP_FREE (local_info.duplicate_blocks);
1606 1.1 mrg local_info.duplicate_blocks = NULL;
1607 1.1 mrg
1608 1.1 mrg m_num_threaded_edges += local_info.num_threaded_edges;
1609 1.1 mrg
1610 1.1 mrg /* Indicate to our caller whether or not any jumps were threaded. */
1611 1.1 mrg return local_info.jumps_threaded;
1612 1.1 mrg }
1613 1.1 mrg
1614 1.1 mrg /* Wrapper for thread_block_1 so that we can first handle jump
1615 1.1 mrg thread paths which do not involve copying joiner blocks, then
1616 1.1 mrg handle jump thread paths which have joiner blocks.
1617 1.1 mrg
1618 1.1 mrg By doing things this way we can be as aggressive as possible and
1619 1.1 mrg not worry that copying a joiner block will create a jump threading
1620 1.1 mrg opportunity. */
1621 1.1 mrg
1622 1.1 mrg bool
1623 1.1 mrg fwd_jt_path_registry::thread_block (basic_block bb, bool noloop_only)
1624 1.1 mrg {
1625 1.1 mrg bool retval;
1626 1.1 mrg retval = thread_block_1 (bb, noloop_only, false);
1627 1.1 mrg retval |= thread_block_1 (bb, noloop_only, true);
1628 1.1 mrg return retval;
1629 1.1 mrg }
1630 1.1 mrg
1631 1.1 mrg /* Callback for dfs_enumerate_from. Returns true if BB is different
1632 1.1 mrg from STOP and DBDS_CE_STOP. */
1633 1.1 mrg
1634 1.1 mrg static basic_block dbds_ce_stop;
1635 1.1 mrg static bool
1636 1.1 mrg dbds_continue_enumeration_p (const_basic_block bb, const void *stop)
1637 1.1 mrg {
1638 1.1 mrg return (bb != (const_basic_block) stop
1639 1.1 mrg && bb != dbds_ce_stop);
1640 1.1 mrg }
1641 1.1 mrg
1642 1.1 mrg /* Evaluates the dominance relationship of latch of the LOOP and BB, and
1643 1.1 mrg returns the state. */
1644 1.1 mrg
1645 1.1 mrg enum bb_dom_status
1646 1.1 mrg determine_bb_domination_status (class loop *loop, basic_block bb)
1647 1.1 mrg {
1648 1.1 mrg basic_block *bblocks;
1649 1.1 mrg unsigned nblocks, i;
1650 1.1 mrg bool bb_reachable = false;
1651 1.1 mrg edge_iterator ei;
1652 1.1 mrg edge e;
1653 1.1 mrg
1654 1.1 mrg /* This function assumes BB is a successor of LOOP->header.
1655 1.1 mrg If that is not the case return DOMST_NONDOMINATING which
1656 1.1 mrg is always safe. */
1657 1.1 mrg {
1658 1.1 mrg bool ok = false;
1659 1.1 mrg
1660 1.1 mrg FOR_EACH_EDGE (e, ei, bb->preds)
1661 1.1 mrg {
1662 1.1 mrg if (e->src == loop->header)
1663 1.1 mrg {
1664 1.1 mrg ok = true;
1665 1.1 mrg break;
1666 1.1 mrg }
1667 1.1 mrg }
1668 1.1 mrg
1669 1.1 mrg if (!ok)
1670 1.1 mrg return DOMST_NONDOMINATING;
1671 1.1 mrg }
1672 1.1 mrg
1673 1.1 mrg if (bb == loop->latch)
1674 1.1 mrg return DOMST_DOMINATING;
1675 1.1 mrg
1676 1.1 mrg /* Check that BB dominates LOOP->latch, and that it is back-reachable
1677 1.1 mrg from it. */
1678 1.1 mrg
1679 1.1 mrg bblocks = XCNEWVEC (basic_block, loop->num_nodes);
1680 1.1 mrg dbds_ce_stop = loop->header;
1681 1.1 mrg nblocks = dfs_enumerate_from (loop->latch, 1, dbds_continue_enumeration_p,
1682 1.1 mrg bblocks, loop->num_nodes, bb);
1683 1.1 mrg for (i = 0; i < nblocks; i++)
1684 1.1 mrg FOR_EACH_EDGE (e, ei, bblocks[i]->preds)
1685 1.1 mrg {
1686 1.1 mrg if (e->src == loop->header)
1687 1.1 mrg {
1688 1.1 mrg free (bblocks);
1689 1.1 mrg return DOMST_NONDOMINATING;
1690 1.1 mrg }
1691 1.1 mrg if (e->src == bb)
1692 1.1 mrg bb_reachable = true;
1693 1.1 mrg }
1694 1.1 mrg
1695 1.1 mrg free (bblocks);
1696 1.1 mrg return (bb_reachable ? DOMST_DOMINATING : DOMST_LOOP_BROKEN);
1697 1.1 mrg }
1698 1.1 mrg
1699 1.1 mrg /* Thread jumps through the header of LOOP. Returns true if cfg changes.
1700 1.1 mrg If MAY_PEEL_LOOP_HEADERS is false, we avoid threading from entry edges
1701 1.1 mrg to the inside of the loop. */
1702 1.1 mrg
1703 1.1 mrg bool
1704 1.1 mrg fwd_jt_path_registry::thread_through_loop_header (class loop *loop,
1705 1.1 mrg bool may_peel_loop_headers)
1706 1.1 mrg {
1707 1.1 mrg basic_block header = loop->header;
1708 1.1 mrg edge e, tgt_edge, latch = loop_latch_edge (loop);
1709 1.1 mrg edge_iterator ei;
1710 1.1 mrg basic_block tgt_bb, atgt_bb;
1711 1.1 mrg enum bb_dom_status domst;
1712 1.1 mrg
1713 1.1 mrg /* We have already threaded through headers to exits, so all the threading
1714 1.1 mrg requests now are to the inside of the loop. We need to avoid creating
1715 1.1 mrg irreducible regions (i.e., loops with more than one entry block), and
1716 1.1 mrg also loop with several latch edges, or new subloops of the loop (although
1717 1.1 mrg there are cases where it might be appropriate, it is difficult to decide,
1718 1.1 mrg and doing it wrongly may confuse other optimizers).
1719 1.1 mrg
1720 1.1 mrg We could handle more general cases here. However, the intention is to
1721 1.1 mrg preserve some information about the loop, which is impossible if its
1722 1.1 mrg structure changes significantly, in a way that is not well understood.
1723 1.1 mrg Thus we only handle few important special cases, in which also updating
1724 1.1 mrg of the loop-carried information should be feasible:
1725 1.1 mrg
1726 1.1 mrg 1) Propagation of latch edge to a block that dominates the latch block
1727 1.1 mrg of a loop. This aims to handle the following idiom:
1728 1.1 mrg
1729 1.1 mrg first = 1;
1730 1.1 mrg while (1)
1731 1.1 mrg {
1732 1.1 mrg if (first)
1733 1.1 mrg initialize;
1734 1.1 mrg first = 0;
1735 1.1 mrg body;
1736 1.1 mrg }
1737 1.1 mrg
1738 1.1 mrg After threading the latch edge, this becomes
1739 1.1 mrg
1740 1.1 mrg first = 1;
1741 1.1 mrg if (first)
1742 1.1 mrg initialize;
1743 1.1 mrg while (1)
1744 1.1 mrg {
1745 1.1 mrg first = 0;
1746 1.1 mrg body;
1747 1.1 mrg }
1748 1.1 mrg
1749 1.1 mrg The original header of the loop is moved out of it, and we may thread
1750 1.1 mrg the remaining edges through it without further constraints.
1751 1.1 mrg
1752 1.1 mrg 2) All entry edges are propagated to a single basic block that dominates
1753 1.1 mrg the latch block of the loop. This aims to handle the following idiom
1754 1.1 mrg (normally created for "for" loops):
1755 1.1 mrg
1756 1.1 mrg i = 0;
1757 1.1 mrg while (1)
1758 1.1 mrg {
1759 1.1 mrg if (i >= 100)
1760 1.1 mrg break;
1761 1.1 mrg body;
1762 1.1 mrg i++;
1763 1.1 mrg }
1764 1.1 mrg
1765 1.1 mrg This becomes
1766 1.1 mrg
1767 1.1 mrg i = 0;
1768 1.1 mrg while (1)
1769 1.1 mrg {
1770 1.1 mrg body;
1771 1.1 mrg i++;
1772 1.1 mrg if (i >= 100)
1773 1.1 mrg break;
1774 1.1 mrg }
1775 1.1 mrg */
1776 1.1 mrg
1777 1.1 mrg /* Threading through the header won't improve the code if the header has just
1778 1.1 mrg one successor. */
1779 1.1 mrg if (single_succ_p (header))
1780 1.1 mrg goto fail;
1781 1.1 mrg
1782 1.1 mrg if (!may_peel_loop_headers && !redirection_block_p (loop->header))
1783 1.1 mrg goto fail;
1784 1.1 mrg else
1785 1.1 mrg {
1786 1.1 mrg tgt_bb = NULL;
1787 1.1 mrg tgt_edge = NULL;
1788 1.1 mrg FOR_EACH_EDGE (e, ei, header->preds)
1789 1.1 mrg {
1790 1.1 mrg if (!e->aux)
1791 1.1 mrg {
1792 1.1 mrg if (e == latch)
1793 1.1 mrg continue;
1794 1.1 mrg
1795 1.1 mrg /* If latch is not threaded, and there is a header
1796 1.1 mrg edge that is not threaded, we would create loop
1797 1.1 mrg with multiple entries. */
1798 1.1 mrg goto fail;
1799 1.1 mrg }
1800 1.1 mrg
1801 1.1 mrg vec<jump_thread_edge *> *path = THREAD_PATH (e);
1802 1.1 mrg
1803 1.1 mrg if ((*path)[1]->type == EDGE_COPY_SRC_JOINER_BLOCK)
1804 1.1 mrg goto fail;
1805 1.1 mrg tgt_edge = (*path)[1]->e;
1806 1.1 mrg atgt_bb = tgt_edge->dest;
1807 1.1 mrg if (!tgt_bb)
1808 1.1 mrg tgt_bb = atgt_bb;
1809 1.1 mrg /* Two targets of threading would make us create loop
1810 1.1 mrg with multiple entries. */
1811 1.1 mrg else if (tgt_bb != atgt_bb)
1812 1.1 mrg goto fail;
1813 1.1 mrg }
1814 1.1 mrg
1815 1.1 mrg if (!tgt_bb)
1816 1.1 mrg {
1817 1.1 mrg /* There are no threading requests. */
1818 1.1 mrg return false;
1819 1.1 mrg }
1820 1.1 mrg
1821 1.1 mrg /* Redirecting to empty loop latch is useless. */
1822 1.1 mrg if (tgt_bb == loop->latch
1823 1.1 mrg && empty_block_p (loop->latch))
1824 1.1 mrg goto fail;
1825 1.1 mrg }
1826 1.1 mrg
1827 1.1 mrg /* The target block must dominate the loop latch, otherwise we would be
1828 1.1 mrg creating a subloop. */
1829 1.1 mrg domst = determine_bb_domination_status (loop, tgt_bb);
1830 1.1 mrg if (domst == DOMST_NONDOMINATING)
1831 1.1 mrg goto fail;
1832 1.1 mrg if (domst == DOMST_LOOP_BROKEN)
1833 1.1 mrg {
1834 1.1 mrg /* If the loop ceased to exist, mark it as such, and thread through its
1835 1.1 mrg original header. */
1836 1.1 mrg mark_loop_for_removal (loop);
1837 1.1 mrg return thread_block (header, false);
1838 1.1 mrg }
1839 1.1 mrg
1840 1.1 mrg if (tgt_bb->loop_father->header == tgt_bb)
1841 1.1 mrg {
1842 1.1 mrg /* If the target of the threading is a header of a subloop, we need
1843 1.1 mrg to create a preheader for it, so that the headers of the two loops
1844 1.1 mrg do not merge. */
1845 1.1 mrg if (EDGE_COUNT (tgt_bb->preds) > 2)
1846 1.1 mrg {
1847 1.1 mrg tgt_bb = create_preheader (tgt_bb->loop_father, 0);
1848 1.1 mrg gcc_assert (tgt_bb != NULL);
1849 1.1 mrg }
1850 1.1 mrg else
1851 1.1 mrg tgt_bb = split_edge (tgt_edge);
1852 1.1 mrg }
1853 1.1 mrg
1854 1.1 mrg basic_block new_preheader;
1855 1.1 mrg
1856 1.1 mrg /* Now consider the case entry edges are redirected to the new entry
1857 1.1 mrg block. Remember one entry edge, so that we can find the new
1858 1.1 mrg preheader (its destination after threading). */
1859 1.1 mrg FOR_EACH_EDGE (e, ei, header->preds)
1860 1.1 mrg {
1861 1.1 mrg if (e->aux)
1862 1.1 mrg break;
1863 1.1 mrg }
1864 1.1 mrg
1865 1.1 mrg /* The duplicate of the header is the new preheader of the loop. Ensure
1866 1.1 mrg that it is placed correctly in the loop hierarchy. */
1867 1.1 mrg set_loop_copy (loop, loop_outer (loop));
1868 1.1 mrg
1869 1.1 mrg thread_block (header, false);
1870 1.1 mrg set_loop_copy (loop, NULL);
1871 1.1 mrg new_preheader = e->dest;
1872 1.1 mrg
1873 1.1 mrg /* Create the new latch block. This is always necessary, as the latch
1874 1.1 mrg must have only a single successor, but the original header had at
1875 1.1 mrg least two successors. */
1876 1.1 mrg loop->latch = NULL;
1877 1.1 mrg mfb_kj_edge = single_succ_edge (new_preheader);
1878 1.1 mrg loop->header = mfb_kj_edge->dest;
1879 1.1 mrg latch = make_forwarder_block (tgt_bb, mfb_keep_just, NULL);
1880 1.1 mrg loop->header = latch->dest;
1881 1.1 mrg loop->latch = latch->src;
1882 1.1 mrg return true;
1883 1.1 mrg
1884 1.1 mrg fail:
1885 1.1 mrg /* We failed to thread anything. Cancel the requests. */
1886 1.1 mrg FOR_EACH_EDGE (e, ei, header->preds)
1887 1.1 mrg {
1888 1.1 mrg vec<jump_thread_edge *> *path = THREAD_PATH (e);
1889 1.1 mrg
1890 1.1 mrg if (path)
1891 1.1 mrg {
1892 1.1 mrg cancel_thread (path, "Failure in thread_through_loop_header");
1893 1.1 mrg e->aux = NULL;
1894 1.1 mrg }
1895 1.1 mrg }
1896 1.1 mrg return false;
1897 1.1 mrg }
1898 1.1 mrg
1899 1.1 mrg /* E1 and E2 are edges into the same basic block. Return TRUE if the
1900 1.1 mrg PHI arguments associated with those edges are equal or there are no
1901 1.1 mrg PHI arguments, otherwise return FALSE. */
1902 1.1 mrg
1903 1.1 mrg static bool
1904 1.1 mrg phi_args_equal_on_edges (edge e1, edge e2)
1905 1.1 mrg {
1906 1.1 mrg gphi_iterator gsi;
1907 1.1 mrg int indx1 = e1->dest_idx;
1908 1.1 mrg int indx2 = e2->dest_idx;
1909 1.1 mrg
1910 1.1 mrg for (gsi = gsi_start_phis (e1->dest); !gsi_end_p (gsi); gsi_next (&gsi))
1911 1.1 mrg {
1912 1.1 mrg gphi *phi = gsi.phi ();
1913 1.1 mrg
1914 1.1 mrg if (!operand_equal_p (gimple_phi_arg_def (phi, indx1),
1915 1.1 mrg gimple_phi_arg_def (phi, indx2), 0))
1916 1.1 mrg return false;
1917 1.1 mrg }
1918 1.1 mrg return true;
1919 1.1 mrg }
1920 1.1 mrg
1921 1.1 mrg /* Return the number of non-debug statements and non-virtual PHIs in a
1922 1.1 mrg block. */
1923 1.1 mrg
1924 1.1 mrg static unsigned int
1925 1.1 mrg count_stmts_and_phis_in_block (basic_block bb)
1926 1.1 mrg {
1927 1.1 mrg unsigned int num_stmts = 0;
1928 1.1 mrg
1929 1.1 mrg gphi_iterator gpi;
1930 1.1 mrg for (gpi = gsi_start_phis (bb); !gsi_end_p (gpi); gsi_next (&gpi))
1931 1.1 mrg if (!virtual_operand_p (PHI_RESULT (gpi.phi ())))
1932 1.1 mrg num_stmts++;
1933 1.1 mrg
1934 1.1 mrg gimple_stmt_iterator gsi;
1935 1.1 mrg for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1936 1.1 mrg {
1937 1.1 mrg gimple *stmt = gsi_stmt (gsi);
1938 1.1 mrg if (!is_gimple_debug (stmt))
1939 1.1 mrg num_stmts++;
1940 1.1 mrg }
1941 1.1 mrg
1942 1.1 mrg return num_stmts;
1943 1.1 mrg }
1944 1.1 mrg
1945 1.1 mrg
1946 1.1 mrg /* Walk through the registered jump threads and convert them into a
1947 1.1 mrg form convenient for this pass.
1948 1.1 mrg
1949 1.1 mrg Any block which has incoming edges threaded to outgoing edges
1950 1.1 mrg will have its entry in THREADED_BLOCK set.
1951 1.1 mrg
1952 1.1 mrg Any threaded edge will have its new outgoing edge stored in the
1953 1.1 mrg original edge's AUX field.
1954 1.1 mrg
1955 1.1 mrg This form avoids the need to walk all the edges in the CFG to
1956 1.1 mrg discover blocks which need processing and avoids unnecessary
1957 1.1 mrg hash table lookups to map from threaded edge to new target. */
1958 1.1 mrg
1959 1.1 mrg void
1960 1.1 mrg fwd_jt_path_registry::mark_threaded_blocks (bitmap threaded_blocks)
1961 1.1 mrg {
1962 1.1 mrg unsigned int i;
1963 1.1 mrg bitmap_iterator bi;
1964 1.1 mrg auto_bitmap tmp;
1965 1.1 mrg basic_block bb;
1966 1.1 mrg edge e;
1967 1.1 mrg edge_iterator ei;
1968 1.1 mrg
1969 1.1 mrg /* It is possible to have jump threads in which one is a subpath
1970 1.1 mrg of the other. ie, (A, B), (B, C), (C, D) where B is a joiner
1971 1.1 mrg block and (B, C), (C, D) where no joiner block exists.
1972 1.1 mrg
1973 1.1 mrg When this occurs ignore the jump thread request with the joiner
1974 1.1 mrg block. It's totally subsumed by the simpler jump thread request.
1975 1.1 mrg
1976 1.1 mrg This results in less block copying, simpler CFGs. More importantly,
1977 1.1 mrg when we duplicate the joiner block, B, in this case we will create
1978 1.1 mrg a new threading opportunity that we wouldn't be able to optimize
1979 1.1 mrg until the next jump threading iteration.
1980 1.1 mrg
1981 1.1 mrg So first convert the jump thread requests which do not require a
1982 1.1 mrg joiner block. */
1983 1.1 mrg for (i = 0; i < m_paths.length (); i++)
1984 1.1 mrg {
1985 1.1 mrg vec<jump_thread_edge *> *path = m_paths[i];
1986 1.1 mrg
1987 1.1 mrg if (path->length () > 1
1988 1.1 mrg && (*path)[1]->type != EDGE_COPY_SRC_JOINER_BLOCK)
1989 1.1 mrg {
1990 1.1 mrg edge e = (*path)[0]->e;
1991 1.1 mrg e->aux = (void *)path;
1992 1.1 mrg bitmap_set_bit (tmp, e->dest->index);
1993 1.1 mrg }
1994 1.1 mrg }
1995 1.1 mrg
1996 1.1 mrg /* Now iterate again, converting cases where we want to thread
1997 1.1 mrg through a joiner block, but only if no other edge on the path
1998 1.1 mrg already has a jump thread attached to it. We do this in two passes,
1999 1.1 mrg to avoid situations where the order in the paths vec can hide overlapping
2000 1.1 mrg threads (the path is recorded on the incoming edge, so we would miss
2001 1.1 mrg cases where the second path starts at a downstream edge on the same
2002 1.1 mrg path). First record all joiner paths, deleting any in the unexpected
2003 1.1 mrg case where there is already a path for that incoming edge. */
2004 1.1 mrg for (i = 0; i < m_paths.length ();)
2005 1.1 mrg {
2006 1.1 mrg vec<jump_thread_edge *> *path = m_paths[i];
2007 1.1 mrg
2008 1.1 mrg if (path->length () > 1
2009 1.1 mrg && (*path)[1]->type == EDGE_COPY_SRC_JOINER_BLOCK)
2010 1.1 mrg {
2011 1.1 mrg /* Attach the path to the starting edge if none is yet recorded. */
2012 1.1 mrg if ((*path)[0]->e->aux == NULL)
2013 1.1 mrg {
2014 1.1 mrg (*path)[0]->e->aux = path;
2015 1.1 mrg i++;
2016 1.1 mrg }
2017 1.1 mrg else
2018 1.1 mrg {
2019 1.1 mrg m_paths.unordered_remove (i);
2020 1.1 mrg cancel_thread (path);
2021 1.1 mrg }
2022 1.1 mrg }
2023 1.1 mrg else
2024 1.1 mrg {
2025 1.1 mrg i++;
2026 1.1 mrg }
2027 1.1 mrg }
2028 1.1 mrg
2029 1.1 mrg /* Second, look for paths that have any other jump thread attached to
2030 1.1 mrg them, and either finish converting them or cancel them. */
2031 1.1 mrg for (i = 0; i < m_paths.length ();)
2032 1.1 mrg {
2033 1.1 mrg vec<jump_thread_edge *> *path = m_paths[i];
2034 1.1 mrg edge e = (*path)[0]->e;
2035 1.1 mrg
2036 1.1 mrg if (path->length () > 1
2037 1.1 mrg && (*path)[1]->type == EDGE_COPY_SRC_JOINER_BLOCK && e->aux == path)
2038 1.1 mrg {
2039 1.1 mrg unsigned int j;
2040 1.1 mrg for (j = 1; j < path->length (); j++)
2041 1.1 mrg if ((*path)[j]->e->aux != NULL)
2042 1.1 mrg break;
2043 1.1 mrg
2044 1.1 mrg /* If we iterated through the entire path without exiting the loop,
2045 1.1 mrg then we are good to go, record it. */
2046 1.1 mrg if (j == path->length ())
2047 1.1 mrg {
2048 1.1 mrg bitmap_set_bit (tmp, e->dest->index);
2049 1.1 mrg i++;
2050 1.1 mrg }
2051 1.1 mrg else
2052 1.1 mrg {
2053 1.1 mrg e->aux = NULL;
2054 1.1 mrg m_paths.unordered_remove (i);
2055 1.1 mrg cancel_thread (path);
2056 1.1 mrg }
2057 1.1 mrg }
2058 1.1 mrg else
2059 1.1 mrg {
2060 1.1 mrg i++;
2061 1.1 mrg }
2062 1.1 mrg }
2063 1.1 mrg
2064 1.1 mrg /* When optimizing for size, prune all thread paths where statement
2065 1.1 mrg duplication is necessary.
2066 1.1 mrg
2067 1.1 mrg We walk the jump thread path looking for copied blocks. There's
2068 1.1 mrg two types of copied blocks.
2069 1.1 mrg
2070 1.1 mrg EDGE_COPY_SRC_JOINER_BLOCK is always copied and thus we will
2071 1.1 mrg cancel the jump threading request when optimizing for size.
2072 1.1 mrg
2073 1.1 mrg EDGE_COPY_SRC_BLOCK which is copied, but some of its statements
2074 1.1 mrg will be killed by threading. If threading does not kill all of
2075 1.1 mrg its statements, then we should cancel the jump threading request
2076 1.1 mrg when optimizing for size. */
2077 1.1 mrg if (optimize_function_for_size_p (cfun))
2078 1.1 mrg {
2079 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (tmp, 0, i, bi)
2080 1.1 mrg {
2081 1.1 mrg FOR_EACH_EDGE (e, ei, BASIC_BLOCK_FOR_FN (cfun, i)->preds)
2082 1.1 mrg if (e->aux)
2083 1.1 mrg {
2084 1.1 mrg vec<jump_thread_edge *> *path = THREAD_PATH (e);
2085 1.1 mrg
2086 1.1 mrg unsigned int j;
2087 1.1 mrg for (j = 1; j < path->length (); j++)
2088 1.1 mrg {
2089 1.1 mrg bb = (*path)[j]->e->src;
2090 1.1 mrg if (redirection_block_p (bb))
2091 1.1 mrg ;
2092 1.1 mrg else if ((*path)[j]->type == EDGE_COPY_SRC_JOINER_BLOCK
2093 1.1 mrg || ((*path)[j]->type == EDGE_COPY_SRC_BLOCK
2094 1.1 mrg && (count_stmts_and_phis_in_block (bb)
2095 1.1 mrg != estimate_threading_killed_stmts (bb))))
2096 1.1 mrg break;
2097 1.1 mrg }
2098 1.1 mrg
2099 1.1 mrg if (j != path->length ())
2100 1.1 mrg {
2101 1.1 mrg cancel_thread (path);
2102 1.1 mrg e->aux = NULL;
2103 1.1 mrg }
2104 1.1 mrg else
2105 1.1 mrg bitmap_set_bit (threaded_blocks, i);
2106 1.1 mrg }
2107 1.1 mrg }
2108 1.1 mrg }
2109 1.1 mrg else
2110 1.1 mrg bitmap_copy (threaded_blocks, tmp);
2111 1.1 mrg
2112 1.1 mrg /* If we have a joiner block (J) which has two successors S1 and S2 and
2113 1.1 mrg we are threading though S1 and the final destination of the thread
2114 1.1 mrg is S2, then we must verify that any PHI nodes in S2 have the same
2115 1.1 mrg PHI arguments for the edge J->S2 and J->S1->...->S2.
2116 1.1 mrg
2117 1.1 mrg We used to detect this prior to registering the jump thread, but
2118 1.1 mrg that prohibits propagation of edge equivalences into non-dominated
2119 1.1 mrg PHI nodes as the equivalency test might occur before propagation.
2120 1.1 mrg
2121 1.1 mrg This must also occur after we truncate any jump threading paths
2122 1.1 mrg as this scenario may only show up after truncation.
2123 1.1 mrg
2124 1.1 mrg This works for now, but will need improvement as part of the FSA
2125 1.1 mrg optimization.
2126 1.1 mrg
2127 1.1 mrg Note since we've moved the thread request data to the edges,
2128 1.1 mrg we have to iterate on those rather than the threaded_edges vector. */
2129 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (tmp, 0, i, bi)
2130 1.1 mrg {
2131 1.1 mrg bb = BASIC_BLOCK_FOR_FN (cfun, i);
2132 1.1 mrg FOR_EACH_EDGE (e, ei, bb->preds)
2133 1.1 mrg {
2134 1.1 mrg if (e->aux)
2135 1.1 mrg {
2136 1.1 mrg vec<jump_thread_edge *> *path = THREAD_PATH (e);
2137 1.1 mrg bool have_joiner = ((*path)[1]->type == EDGE_COPY_SRC_JOINER_BLOCK);
2138 1.1 mrg
2139 1.1 mrg if (have_joiner)
2140 1.1 mrg {
2141 1.1 mrg basic_block joiner = e->dest;
2142 1.1 mrg edge final_edge = path->last ()->e;
2143 1.1 mrg basic_block final_dest = final_edge->dest;
2144 1.1 mrg edge e2 = find_edge (joiner, final_dest);
2145 1.1 mrg
2146 1.1 mrg if (e2 && !phi_args_equal_on_edges (e2, final_edge))
2147 1.1 mrg {
2148 1.1 mrg cancel_thread (path);
2149 1.1 mrg e->aux = NULL;
2150 1.1 mrg }
2151 1.1 mrg }
2152 1.1 mrg }
2153 1.1 mrg }
2154 1.1 mrg }
2155 1.1 mrg
2156 1.1 mrg /* Look for jump threading paths which cross multiple loop headers.
2157 1.1 mrg
2158 1.1 mrg The code to thread through loop headers will change the CFG in ways
2159 1.1 mrg that invalidate the cached loop iteration information. So we must
2160 1.1 mrg detect that case and wipe the cached information. */
2161 1.1 mrg EXECUTE_IF_SET_IN_BITMAP (tmp, 0, i, bi)
2162 1.1 mrg {
2163 1.1 mrg basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i);
2164 1.1 mrg FOR_EACH_EDGE (e, ei, bb->preds)
2165 1.1 mrg {
2166 1.1 mrg if (e->aux)
2167 1.1 mrg {
2168 1.1 mrg gcc_assert (loops_state_satisfies_p
2169 1.1 mrg (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS));
2170 1.1 mrg vec<jump_thread_edge *> *path = THREAD_PATH (e);
2171 1.1 mrg
2172 1.1 mrg for (unsigned int i = 0, crossed_headers = 0;
2173 1.1 mrg i < path->length ();
2174 1.1 mrg i++)
2175 1.1 mrg {
2176 1.1 mrg basic_block dest = (*path)[i]->e->dest;
2177 1.1 mrg basic_block src = (*path)[i]->e->src;
2178 1.1 mrg /* If we enter a loop. */
2179 1.1 mrg if (flow_loop_nested_p (src->loop_father, dest->loop_father))
2180 1.1 mrg ++crossed_headers;
2181 1.1 mrg /* If we step from a block outside an irreducible region
2182 1.1 mrg to a block inside an irreducible region, then we have
2183 1.1 mrg crossed into a loop. */
2184 1.1 mrg else if (! (src->flags & BB_IRREDUCIBLE_LOOP)
2185 1.1 mrg && (dest->flags & BB_IRREDUCIBLE_LOOP))
2186 1.1 mrg ++crossed_headers;
2187 1.1 mrg if (crossed_headers > 1)
2188 1.1 mrg {
2189 1.1 mrg vect_free_loop_info_assumptions
2190 1.1 mrg ((*path)[path->length () - 1]->e->dest->loop_father);
2191 1.1 mrg break;
2192 1.1 mrg }
2193 1.1 mrg }
2194 1.1 mrg }
2195 1.1 mrg }
2196 1.1 mrg }
2197 1.1 mrg }
2198 1.1 mrg
2199 1.1 mrg
2200 1.1 mrg /* Verify that the REGION is a valid jump thread. A jump thread is a special
2201 1.1 mrg case of SEME Single Entry Multiple Exits region in which all nodes in the
2202 1.1 mrg REGION have exactly one incoming edge. The only exception is the first block
2203 1.1 mrg that may not have been connected to the rest of the cfg yet. */
2204 1.1 mrg
2205 1.1 mrg DEBUG_FUNCTION void
2206 1.1 mrg verify_jump_thread (basic_block *region, unsigned n_region)
2207 1.1 mrg {
2208 1.1 mrg for (unsigned i = 0; i < n_region; i++)
2209 1.1 mrg gcc_assert (EDGE_COUNT (region[i]->preds) <= 1);
2210 1.1 mrg }
2211 1.1 mrg
2212 1.1 mrg /* Return true when BB is one of the first N items in BBS. */
2213 1.1 mrg
2214 1.1 mrg static inline bool
2215 1.1 mrg bb_in_bbs (basic_block bb, basic_block *bbs, int n)
2216 1.1 mrg {
2217 1.1 mrg for (int i = 0; i < n; i++)
2218 1.1 mrg if (bb == bbs[i])
2219 1.1 mrg return true;
2220 1.1 mrg
2221 1.1 mrg return false;
2222 1.1 mrg }
2223 1.1 mrg
2224 1.1 mrg void
2225 1.1 mrg jt_path_registry::debug_path (FILE *dump_file, int pathno)
2226 1.1 mrg {
2227 1.1 mrg vec<jump_thread_edge *> *p = m_paths[pathno];
2228 1.1 mrg fprintf (dump_file, "path: ");
2229 1.1 mrg for (unsigned i = 0; i < p->length (); ++i)
2230 1.1 mrg fprintf (dump_file, "%d -> %d, ",
2231 1.1 mrg (*p)[i]->e->src->index, (*p)[i]->e->dest->index);
2232 1.1 mrg fprintf (dump_file, "\n");
2233 1.1 mrg }
2234 1.1 mrg
2235 1.1 mrg void
2236 1.1 mrg jt_path_registry::debug ()
2237 1.1 mrg {
2238 1.1 mrg for (unsigned i = 0; i < m_paths.length (); ++i)
2239 1.1 mrg debug_path (stderr, i);
2240 1.1 mrg }
2241 1.1 mrg
2242 1.1 mrg /* Rewire a jump_thread_edge so that the source block is now a
2243 1.1 mrg threaded source block.
2244 1.1 mrg
2245 1.1 mrg PATH_NUM is an index into the global path table PATHS.
2246 1.1 mrg EDGE_NUM is the jump thread edge number into said path.
2247 1.1 mrg
2248 1.1 mrg Returns TRUE if we were able to successfully rewire the edge. */
2249 1.1 mrg
2250 1.1 mrg bool
2251 1.1 mrg back_jt_path_registry::rewire_first_differing_edge (unsigned path_num,
2252 1.1 mrg unsigned edge_num)
2253 1.1 mrg {
2254 1.1 mrg vec<jump_thread_edge *> *path = m_paths[path_num];
2255 1.1 mrg edge &e = (*path)[edge_num]->e;
2256 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
2257 1.1 mrg fprintf (dump_file, "rewiring edge candidate: %d -> %d\n",
2258 1.1 mrg e->src->index, e->dest->index);
2259 1.1 mrg basic_block src_copy = get_bb_copy (e->src);
2260 1.1 mrg if (src_copy == NULL)
2261 1.1 mrg {
2262 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
2263 1.1 mrg fprintf (dump_file, "ignoring candidate: there is no src COPY\n");
2264 1.1 mrg return false;
2265 1.1 mrg }
2266 1.1 mrg edge new_edge = find_edge (src_copy, e->dest);
2267 1.1 mrg /* If the previously threaded paths created a flow graph where we
2268 1.1 mrg can no longer figure out where to go, give up. */
2269 1.1 mrg if (new_edge == NULL)
2270 1.1 mrg {
2271 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
2272 1.1 mrg fprintf (dump_file, "ignoring candidate: we lost our way\n");
2273 1.1 mrg return false;
2274 1.1 mrg }
2275 1.1 mrg e = new_edge;
2276 1.1 mrg return true;
2277 1.1 mrg }
2278 1.1 mrg
2279 1.1 mrg /* After a path has been jump threaded, adjust the remaining paths
2280 1.1 mrg that are subsets of this path, so these paths can be safely
2281 1.1 mrg threaded within the context of the new threaded path.
2282 1.1 mrg
2283 1.1 mrg For example, suppose we have just threaded:
2284 1.1 mrg
2285 1.1 mrg 5 -> 6 -> 7 -> 8 -> 12 => 5 -> 6' -> 7' -> 8' -> 12'
2286 1.1 mrg
2287 1.1 mrg And we have an upcoming threading candidate:
2288 1.1 mrg 5 -> 6 -> 7 -> 8 -> 15 -> 20
2289 1.1 mrg
2290 1.1 mrg This function adjusts the upcoming path into:
2291 1.1 mrg 8' -> 15 -> 20
2292 1.1 mrg
2293 1.1 mrg CURR_PATH_NUM is an index into the global paths table. It
2294 1.1 mrg specifies the path that was just threaded. */
2295 1.1 mrg
2296 1.1 mrg void
2297 1.1 mrg back_jt_path_registry::adjust_paths_after_duplication (unsigned curr_path_num)
2298 1.1 mrg {
2299 1.1 mrg vec<jump_thread_edge *> *curr_path = m_paths[curr_path_num];
2300 1.1 mrg
2301 1.1 mrg /* Iterate through all the other paths and adjust them. */
2302 1.1 mrg for (unsigned cand_path_num = 0; cand_path_num < m_paths.length (); )
2303 1.1 mrg {
2304 1.1 mrg if (cand_path_num == curr_path_num)
2305 1.1 mrg {
2306 1.1 mrg ++cand_path_num;
2307 1.1 mrg continue;
2308 1.1 mrg }
2309 1.1 mrg /* Make sure the candidate to adjust starts with the same path
2310 1.1 mrg as the recently threaded path. */
2311 1.1 mrg vec<jump_thread_edge *> *cand_path = m_paths[cand_path_num];
2312 1.1 mrg if ((*cand_path)[0]->e != (*curr_path)[0]->e)
2313 1.1 mrg {
2314 1.1 mrg ++cand_path_num;
2315 1.1 mrg continue;
2316 1.1 mrg }
2317 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
2318 1.1 mrg {
2319 1.1 mrg fprintf (dump_file, "adjusting candidate: ");
2320 1.1 mrg debug_path (dump_file, cand_path_num);
2321 1.1 mrg }
2322 1.1 mrg
2323 1.1 mrg /* Chop off from the candidate path any prefix it shares with
2324 1.1 mrg the recently threaded path. */
2325 1.1 mrg unsigned minlength = MIN (curr_path->length (), cand_path->length ());
2326 1.1 mrg unsigned j;
2327 1.1 mrg for (j = 0; j < minlength; ++j)
2328 1.1 mrg {
2329 1.1 mrg edge cand_edge = (*cand_path)[j]->e;
2330 1.1 mrg edge curr_edge = (*curr_path)[j]->e;
2331 1.1 mrg
2332 1.1 mrg /* Once the prefix no longer matches, adjust the first
2333 1.1 mrg non-matching edge to point from an adjusted edge to
2334 1.1 mrg wherever it was going. */
2335 1.1 mrg if (cand_edge != curr_edge)
2336 1.1 mrg {
2337 1.1 mrg gcc_assert (cand_edge->src == curr_edge->src);
2338 1.1 mrg if (!rewire_first_differing_edge (cand_path_num, j))
2339 1.1 mrg goto remove_candidate_from_list;
2340 1.1 mrg break;
2341 1.1 mrg }
2342 1.1 mrg }
2343 1.1 mrg if (j == minlength)
2344 1.1 mrg {
2345 1.1 mrg /* If we consumed the max subgraph we could look at, and
2346 1.1 mrg still didn't find any different edges, it's the
2347 1.1 mrg last edge after MINLENGTH. */
2348 1.1 mrg if (cand_path->length () > minlength)
2349 1.1 mrg {
2350 1.1 mrg if (!rewire_first_differing_edge (cand_path_num, j))
2351 1.1 mrg goto remove_candidate_from_list;
2352 1.1 mrg }
2353 1.1 mrg else if (dump_file && (dump_flags & TDF_DETAILS))
2354 1.1 mrg fprintf (dump_file, "adjusting first edge after MINLENGTH.\n");
2355 1.1 mrg }
2356 1.1 mrg if (j > 0)
2357 1.1 mrg {
2358 1.1 mrg /* If we are removing everything, delete the entire candidate. */
2359 1.1 mrg if (j == cand_path->length ())
2360 1.1 mrg {
2361 1.1 mrg remove_candidate_from_list:
2362 1.1 mrg cancel_thread (cand_path, "Adjusted candidate is EMPTY");
2363 1.1 mrg m_paths.unordered_remove (cand_path_num);
2364 1.1 mrg continue;
2365 1.1 mrg }
2366 1.1 mrg /* Otherwise, just remove the redundant sub-path. */
2367 1.1 mrg if (cand_path->length () - j > 1)
2368 1.1 mrg cand_path->block_remove (0, j);
2369 1.1 mrg else if (dump_file && (dump_flags & TDF_DETAILS))
2370 1.1 mrg fprintf (dump_file, "Dropping illformed candidate.\n");
2371 1.1 mrg }
2372 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
2373 1.1 mrg {
2374 1.1 mrg fprintf (dump_file, "adjusted candidate: ");
2375 1.1 mrg debug_path (dump_file, cand_path_num);
2376 1.1 mrg }
2377 1.1 mrg ++cand_path_num;
2378 1.1 mrg }
2379 1.1 mrg }
2380 1.1 mrg
2381 1.1 mrg /* Duplicates a jump-thread path of N_REGION basic blocks.
2382 1.1 mrg The ENTRY edge is redirected to the duplicate of the region.
2383 1.1 mrg
2384 1.1 mrg Remove the last conditional statement in the last basic block in the REGION,
2385 1.1 mrg and create a single fallthru edge pointing to the same destination as the
2386 1.1 mrg EXIT edge.
2387 1.1 mrg
2388 1.1 mrg CURRENT_PATH_NO is an index into the global paths[] table
2389 1.1 mrg specifying the jump-thread path.
2390 1.1 mrg
2391 1.1 mrg Returns false if it is unable to copy the region, true otherwise. */
2392 1.1 mrg
2393 1.1 mrg bool
2394 1.1 mrg back_jt_path_registry::duplicate_thread_path (edge entry,
2395 1.1 mrg edge exit,
2396 1.1 mrg basic_block *region,
2397 1.1 mrg unsigned n_region,
2398 1.1 mrg unsigned current_path_no)
2399 1.1 mrg {
2400 1.1 mrg unsigned i;
2401 1.1 mrg class loop *loop = entry->dest->loop_father;
2402 1.1 mrg edge exit_copy;
2403 1.1 mrg edge redirected;
2404 1.1 mrg profile_count curr_count;
2405 1.1 mrg
2406 1.1 mrg if (!can_copy_bbs_p (region, n_region))
2407 1.1 mrg return false;
2408 1.1 mrg
2409 1.1 mrg /* Some sanity checking. Note that we do not check for all possible
2410 1.1 mrg missuses of the functions. I.e. if you ask to copy something weird,
2411 1.1 mrg it will work, but the state of structures probably will not be
2412 1.1 mrg correct. */
2413 1.1 mrg for (i = 0; i < n_region; i++)
2414 1.1 mrg {
2415 1.1 mrg /* We do not handle subloops, i.e. all the blocks must belong to the
2416 1.1 mrg same loop. */
2417 1.1 mrg if (region[i]->loop_father != loop)
2418 1.1 mrg return false;
2419 1.1 mrg }
2420 1.1 mrg
2421 1.1 mrg initialize_original_copy_tables ();
2422 1.1 mrg
2423 1.1 mrg set_loop_copy (loop, loop);
2424 1.1 mrg
2425 1.1 mrg basic_block *region_copy = XNEWVEC (basic_block, n_region);
2426 1.1 mrg copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop,
2427 1.1 mrg split_edge_bb_loc (entry), false);
2428 1.1 mrg
2429 1.1 mrg /* Fix up: copy_bbs redirects all edges pointing to copied blocks. The
2430 1.1 mrg following code ensures that all the edges exiting the jump-thread path are
2431 1.1 mrg redirected back to the original code: these edges are exceptions
2432 1.1 mrg invalidating the property that is propagated by executing all the blocks of
2433 1.1 mrg the jump-thread path in order. */
2434 1.1 mrg
2435 1.1 mrg curr_count = entry->count ();
2436 1.1 mrg
2437 1.1 mrg for (i = 0; i < n_region; i++)
2438 1.1 mrg {
2439 1.1 mrg edge e;
2440 1.1 mrg edge_iterator ei;
2441 1.1 mrg basic_block bb = region_copy[i];
2442 1.1 mrg
2443 1.1 mrg /* Watch inconsistent profile. */
2444 1.1 mrg if (curr_count > region[i]->count)
2445 1.1 mrg curr_count = region[i]->count;
2446 1.1 mrg /* Scale current BB. */
2447 1.1 mrg if (region[i]->count.nonzero_p () && curr_count.initialized_p ())
2448 1.1 mrg {
2449 1.1 mrg /* In the middle of the path we only scale the frequencies.
2450 1.1 mrg In last BB we need to update probabilities of outgoing edges
2451 1.1 mrg because we know which one is taken at the threaded path. */
2452 1.1 mrg if (i + 1 != n_region)
2453 1.1 mrg scale_bbs_frequencies_profile_count (region + i, 1,
2454 1.1 mrg region[i]->count - curr_count,
2455 1.1 mrg region[i]->count);
2456 1.1 mrg else
2457 1.1 mrg update_bb_profile_for_threading (region[i],
2458 1.1 mrg curr_count,
2459 1.1 mrg exit);
2460 1.1 mrg scale_bbs_frequencies_profile_count (region_copy + i, 1, curr_count,
2461 1.1 mrg region_copy[i]->count);
2462 1.1 mrg }
2463 1.1 mrg
2464 1.1 mrg if (single_succ_p (bb))
2465 1.1 mrg {
2466 1.1 mrg /* Make sure the successor is the next node in the path. */
2467 1.1 mrg gcc_assert (i + 1 == n_region
2468 1.1 mrg || region_copy[i + 1] == single_succ_edge (bb)->dest);
2469 1.1 mrg if (i + 1 != n_region)
2470 1.1 mrg {
2471 1.1 mrg curr_count = single_succ_edge (bb)->count ();
2472 1.1 mrg }
2473 1.1 mrg continue;
2474 1.1 mrg }
2475 1.1 mrg
2476 1.1 mrg /* Special case the last block on the path: make sure that it does not
2477 1.1 mrg jump back on the copied path, including back to itself. */
2478 1.1 mrg if (i + 1 == n_region)
2479 1.1 mrg {
2480 1.1 mrg FOR_EACH_EDGE (e, ei, bb->succs)
2481 1.1 mrg if (bb_in_bbs (e->dest, region_copy, n_region))
2482 1.1 mrg {
2483 1.1 mrg basic_block orig = get_bb_original (e->dest);
2484 1.1 mrg if (orig)
2485 1.1 mrg redirect_edge_and_branch_force (e, orig);
2486 1.1 mrg }
2487 1.1 mrg continue;
2488 1.1 mrg }
2489 1.1 mrg
2490 1.1 mrg /* Redirect all other edges jumping to non-adjacent blocks back to the
2491 1.1 mrg original code. */
2492 1.1 mrg FOR_EACH_EDGE (e, ei, bb->succs)
2493 1.1 mrg if (region_copy[i + 1] != e->dest)
2494 1.1 mrg {
2495 1.1 mrg basic_block orig = get_bb_original (e->dest);
2496 1.1 mrg if (orig)
2497 1.1 mrg redirect_edge_and_branch_force (e, orig);
2498 1.1 mrg }
2499 1.1 mrg else
2500 1.1 mrg {
2501 1.1 mrg curr_count = e->count ();
2502 1.1 mrg }
2503 1.1 mrg }
2504 1.1 mrg
2505 1.1 mrg
2506 1.1 mrg if (flag_checking)
2507 1.1 mrg verify_jump_thread (region_copy, n_region);
2508 1.1 mrg
2509 1.1 mrg /* Remove the last branch in the jump thread path. */
2510 1.1 mrg remove_ctrl_stmt_and_useless_edges (region_copy[n_region - 1], exit->dest);
2511 1.1 mrg
2512 1.1 mrg /* And fixup the flags on the single remaining edge. */
2513 1.1 mrg edge fix_e = find_edge (region_copy[n_region - 1], exit->dest);
2514 1.1 mrg fix_e->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE | EDGE_ABNORMAL);
2515 1.1 mrg fix_e->flags |= EDGE_FALLTHRU;
2516 1.1 mrg
2517 1.1 mrg edge e = make_edge (region_copy[n_region - 1], exit->dest, EDGE_FALLTHRU);
2518 1.1 mrg
2519 1.1 mrg if (e)
2520 1.1 mrg {
2521 1.1 mrg rescan_loop_exit (e, true, false);
2522 1.1 mrg e->probability = profile_probability::always ();
2523 1.1 mrg }
2524 1.1 mrg
2525 1.1 mrg /* Redirect the entry and add the phi node arguments. */
2526 1.1 mrg if (entry->dest == loop->header)
2527 1.1 mrg mark_loop_for_removal (loop);
2528 1.1 mrg redirected = redirect_edge_and_branch (entry, get_bb_copy (entry->dest));
2529 1.1 mrg gcc_assert (redirected != NULL);
2530 1.1 mrg flush_pending_stmts (entry);
2531 1.1 mrg
2532 1.1 mrg /* Add the other PHI node arguments. */
2533 1.1 mrg add_phi_args_after_copy (region_copy, n_region, NULL);
2534 1.1 mrg
2535 1.1 mrg free (region_copy);
2536 1.1 mrg
2537 1.1 mrg adjust_paths_after_duplication (current_path_no);
2538 1.1 mrg
2539 1.1 mrg free_original_copy_tables ();
2540 1.1 mrg return true;
2541 1.1 mrg }
2542 1.1 mrg
2543 1.1 mrg /* Return true when PATH is a valid jump-thread path. */
2544 1.1 mrg
2545 1.1 mrg static bool
2546 1.1 mrg valid_jump_thread_path (vec<jump_thread_edge *> *path)
2547 1.1 mrg {
2548 1.1 mrg unsigned len = path->length ();
2549 1.1 mrg
2550 1.1 mrg /* Check that the path is connected. */
2551 1.1 mrg for (unsigned int j = 0; j < len - 1; j++)
2552 1.1 mrg {
2553 1.1 mrg edge e = (*path)[j]->e;
2554 1.1 mrg if (e->dest != (*path)[j+1]->e->src)
2555 1.1 mrg return false;
2556 1.1 mrg }
2557 1.1 mrg return true;
2558 1.1 mrg }
2559 1.1 mrg
2560 1.1 mrg /* Remove any queued jump threads that include edge E.
2561 1.1 mrg
2562 1.1 mrg We don't actually remove them here, just record the edges into ax
2563 1.1 mrg hash table. That way we can do the search once per iteration of
2564 1.1 mrg DOM/VRP rather than for every case where DOM optimizes away a COND_EXPR. */
2565 1.1 mrg
2566 1.1 mrg void
2567 1.1 mrg fwd_jt_path_registry::remove_jump_threads_including (edge_def *e)
2568 1.1 mrg {
2569 1.1 mrg if (!m_paths.exists () || !flag_thread_jumps)
2570 1.1 mrg return;
2571 1.1 mrg
2572 1.1 mrg edge *slot = m_removed_edges->find_slot (e, INSERT);
2573 1.1 mrg *slot = e;
2574 1.1 mrg }
2575 1.1 mrg
2576 1.1 mrg /* Thread all paths that have been queued for jump threading, and
2577 1.1 mrg update the CFG accordingly.
2578 1.1 mrg
2579 1.1 mrg It is the caller's responsibility to fix the dominance information
2580 1.1 mrg and rewrite duplicated SSA_NAMEs back into SSA form.
2581 1.1 mrg
2582 1.1 mrg If PEEL_LOOP_HEADERS is false, avoid threading edges through loop
2583 1.1 mrg headers if it does not simplify the loop.
2584 1.1 mrg
2585 1.1 mrg Returns true if one or more edges were threaded. */
2586 1.1 mrg
2587 1.1 mrg bool
2588 1.1 mrg jt_path_registry::thread_through_all_blocks (bool peel_loop_headers)
2589 1.1 mrg {
2590 1.1 mrg if (m_paths.length () == 0)
2591 1.1 mrg return false;
2592 1.1 mrg
2593 1.1 mrg m_num_threaded_edges = 0;
2594 1.1 mrg
2595 1.1 mrg bool retval = update_cfg (peel_loop_headers);
2596 1.1 mrg
2597 1.1 mrg statistics_counter_event (cfun, "Jumps threaded", m_num_threaded_edges);
2598 1.1 mrg
2599 1.1 mrg if (retval)
2600 1.1 mrg {
2601 1.1 mrg loops_state_set (LOOPS_NEED_FIXUP);
2602 1.1 mrg return true;
2603 1.1 mrg }
2604 1.1 mrg return false;
2605 1.1 mrg }
2606 1.1 mrg
2607 1.1 mrg /* This is the backward threader version of thread_through_all_blocks
2608 1.1 mrg using a generic BB copier. */
2609 1.1 mrg
2610 1.1 mrg bool
2611 1.1 mrg back_jt_path_registry::update_cfg (bool /*peel_loop_headers*/)
2612 1.1 mrg {
2613 1.1 mrg bool retval = false;
2614 1.1 mrg hash_set<edge> visited_starting_edges;
2615 1.1 mrg
2616 1.1 mrg while (m_paths.length ())
2617 1.1 mrg {
2618 1.1 mrg vec<jump_thread_edge *> *path = m_paths[0];
2619 1.1 mrg edge entry = (*path)[0]->e;
2620 1.1 mrg
2621 1.1 mrg /* Do not jump-thread twice from the same starting edge.
2622 1.1 mrg
2623 1.1 mrg Previously we only checked that we weren't threading twice
2624 1.1 mrg from the same BB, but that was too restrictive. Imagine a
2625 1.1 mrg path that starts from GIMPLE_COND(x_123 == 0,...), where both
2626 1.1 mrg edges out of this conditional yield paths that can be
2627 1.1 mrg threaded (for example, both lead to an x_123==0 or x_123!=0
2628 1.1 mrg conditional further down the line. */
2629 1.1 mrg if (visited_starting_edges.contains (entry)
2630 1.1 mrg /* We may not want to realize this jump thread path for
2631 1.1 mrg various reasons. So check it first. */
2632 1.1 mrg || !valid_jump_thread_path (path))
2633 1.1 mrg {
2634 1.1 mrg /* Remove invalid jump-thread paths. */
2635 1.1 mrg cancel_thread (path, "Avoiding threading twice from same edge");
2636 1.1 mrg m_paths.unordered_remove (0);
2637 1.1 mrg continue;
2638 1.1 mrg }
2639 1.1 mrg
2640 1.1 mrg unsigned len = path->length ();
2641 1.1 mrg edge exit = (*path)[len - 1]->e;
2642 1.1 mrg basic_block *region = XNEWVEC (basic_block, len - 1);
2643 1.1 mrg
2644 1.1 mrg for (unsigned int j = 0; j < len - 1; j++)
2645 1.1 mrg region[j] = (*path)[j]->e->dest;
2646 1.1 mrg
2647 1.1 mrg if (duplicate_thread_path (entry, exit, region, len - 1, 0))
2648 1.1 mrg {
2649 1.1 mrg /* We do not update dominance info. */
2650 1.1 mrg free_dominance_info (CDI_DOMINATORS);
2651 1.1 mrg visited_starting_edges.add (entry);
2652 1.1 mrg retval = true;
2653 1.1 mrg m_num_threaded_edges++;
2654 1.1 mrg }
2655 1.1 mrg
2656 1.1 mrg path->release ();
2657 1.1 mrg m_paths.unordered_remove (0);
2658 1.1 mrg free (region);
2659 1.1 mrg }
2660 1.1 mrg return retval;
2661 1.1 mrg }
2662 1.1 mrg
2663 1.1 mrg /* This is the forward threader version of thread_through_all_blocks,
2664 1.1 mrg using a custom BB copier. */
2665 1.1 mrg
2666 1.1 mrg bool
2667 1.1 mrg fwd_jt_path_registry::update_cfg (bool may_peel_loop_headers)
2668 1.1 mrg {
2669 1.1 mrg bool retval = false;
2670 1.1 mrg
2671 1.1 mrg /* Remove any paths that referenced removed edges. */
2672 1.1 mrg if (m_removed_edges)
2673 1.1 mrg for (unsigned i = 0; i < m_paths.length (); )
2674 1.1 mrg {
2675 1.1 mrg unsigned int j;
2676 1.1 mrg vec<jump_thread_edge *> *path = m_paths[i];
2677 1.1 mrg
2678 1.1 mrg for (j = 0; j < path->length (); j++)
2679 1.1 mrg {
2680 1.1 mrg edge e = (*path)[j]->e;
2681 1.1 mrg if (m_removed_edges->find_slot (e, NO_INSERT))
2682 1.1 mrg break;
2683 1.1 mrg }
2684 1.1 mrg
2685 1.1 mrg if (j != path->length ())
2686 1.1 mrg {
2687 1.1 mrg cancel_thread (path, "Thread references removed edge");
2688 1.1 mrg m_paths.unordered_remove (i);
2689 1.1 mrg continue;
2690 1.1 mrg }
2691 1.1 mrg i++;
2692 1.1 mrg }
2693 1.1 mrg
2694 1.1 mrg auto_bitmap threaded_blocks;
2695 1.1 mrg mark_threaded_blocks (threaded_blocks);
2696 1.1 mrg
2697 1.1 mrg initialize_original_copy_tables ();
2698 1.1 mrg
2699 1.1 mrg /* The order in which we process jump threads can be important.
2700 1.1 mrg
2701 1.1 mrg Consider if we have two jump threading paths A and B. If the
2702 1.1 mrg target edge of A is the starting edge of B and we thread path A
2703 1.1 mrg first, then we create an additional incoming edge into B->dest that
2704 1.1 mrg we cannot discover as a jump threading path on this iteration.
2705 1.1 mrg
2706 1.1 mrg If we instead thread B first, then the edge into B->dest will have
2707 1.1 mrg already been redirected before we process path A and path A will
2708 1.1 mrg natually, with no further work, target the redirected path for B.
2709 1.1 mrg
2710 1.1 mrg An post-order is sufficient here. Compute the ordering first, then
2711 1.1 mrg process the blocks. */
2712 1.1 mrg if (!bitmap_empty_p (threaded_blocks))
2713 1.1 mrg {
2714 1.1 mrg int *postorder = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
2715 1.1 mrg unsigned int postorder_num = post_order_compute (postorder, false, false);
2716 1.1 mrg for (unsigned int i = 0; i < postorder_num; i++)
2717 1.1 mrg {
2718 1.1 mrg unsigned int indx = postorder[i];
2719 1.1 mrg if (bitmap_bit_p (threaded_blocks, indx))
2720 1.1 mrg {
2721 1.1 mrg basic_block bb = BASIC_BLOCK_FOR_FN (cfun, indx);
2722 1.1 mrg retval |= thread_block (bb, true);
2723 1.1 mrg }
2724 1.1 mrg }
2725 1.1 mrg free (postorder);
2726 1.1 mrg }
2727 1.1 mrg
2728 1.1 mrg /* Then perform the threading through loop headers. We start with the
2729 1.1 mrg innermost loop, so that the changes in cfg we perform won't affect
2730 1.1 mrg further threading. */
2731 1.1 mrg for (auto loop : loops_list (cfun, LI_FROM_INNERMOST))
2732 1.1 mrg {
2733 1.1 mrg if (!loop->header
2734 1.1 mrg || !bitmap_bit_p (threaded_blocks, loop->header->index))
2735 1.1 mrg continue;
2736 1.1 mrg
2737 1.1 mrg retval |= thread_through_loop_header (loop, may_peel_loop_headers);
2738 1.1 mrg }
2739 1.1 mrg
2740 1.1 mrg /* All jump threading paths should have been resolved at this
2741 1.1 mrg point. Verify that is the case. */
2742 1.1 mrg basic_block bb;
2743 1.1 mrg FOR_EACH_BB_FN (bb, cfun)
2744 1.1 mrg {
2745 1.1 mrg edge_iterator ei;
2746 1.1 mrg edge e;
2747 1.1 mrg FOR_EACH_EDGE (e, ei, bb->preds)
2748 1.1 mrg gcc_assert (e->aux == NULL);
2749 1.1 mrg }
2750 1.1 mrg
2751 1.1 mrg free_original_copy_tables ();
2752 1.1 mrg
2753 1.1 mrg return retval;
2754 1.1 mrg }
2755 1.1 mrg
2756 1.1 mrg bool
2757 1.1 mrg jt_path_registry::cancel_invalid_paths (vec<jump_thread_edge *> &path)
2758 1.1 mrg {
2759 1.1 mrg gcc_checking_assert (!path.is_empty ());
2760 1.1 mrg edge entry = path[0]->e;
2761 1.1 mrg edge exit = path[path.length () - 1]->e;
2762 1.1 mrg bool seen_latch = false;
2763 1.1 mrg int loops_crossed = 0;
2764 1.1 mrg bool crossed_latch = false;
2765 1.1 mrg bool crossed_loop_header = false;
2766 1.1 mrg // Use ->dest here instead of ->src to ignore the first block. The
2767 1.1 mrg // first block is allowed to be in a different loop, since it'll be
2768 1.1 mrg // redirected. See similar comment in profitable_path_p: "we don't
2769 1.1 mrg // care about that block...".
2770 1.1 mrg loop_p loop = entry->dest->loop_father;
2771 1.1 mrg loop_p curr_loop = loop;
2772 1.1 mrg
2773 1.1 mrg for (unsigned int i = 0; i < path.length (); i++)
2774 1.1 mrg {
2775 1.1 mrg edge e = path[i]->e;
2776 1.1 mrg
2777 1.1 mrg if (e == NULL)
2778 1.1 mrg {
2779 1.1 mrg // NULL outgoing edges on a path can happen for jumping to a
2780 1.1 mrg // constant address.
2781 1.1 mrg cancel_thread (&path, "Found NULL edge in jump threading path");
2782 1.1 mrg return true;
2783 1.1 mrg }
2784 1.1 mrg
2785 1.1 mrg if (loop->latch == e->src || loop->latch == e->dest)
2786 1.1 mrg {
2787 1.1 mrg seen_latch = true;
2788 1.1 mrg // Like seen_latch, but excludes the first block.
2789 1.1 mrg if (e->src != entry->src)
2790 1.1 mrg crossed_latch = true;
2791 1.1 mrg }
2792 1.1 mrg
2793 1.1 mrg if (e->dest->loop_father != curr_loop)
2794 1.1 mrg {
2795 1.1 mrg curr_loop = e->dest->loop_father;
2796 1.1 mrg ++loops_crossed;
2797 1.1 mrg }
2798 1.1 mrg
2799 1.1 mrg // ?? Avoid threading through loop headers that remain in the
2800 1.1 mrg // loop, as such threadings tend to create sub-loops which
2801 1.1 mrg // _might_ be OK ??.
2802 1.1 mrg if (e->dest->loop_father->header == e->dest
2803 1.1 mrg && !flow_loop_nested_p (exit->dest->loop_father,
2804 1.1 mrg e->dest->loop_father))
2805 1.1 mrg crossed_loop_header = true;
2806 1.1 mrg
2807 1.1 mrg if (flag_checking && !m_backedge_threads)
2808 1.1 mrg gcc_assert ((path[i]->e->flags & EDGE_DFS_BACK) == 0);
2809 1.1 mrg }
2810 1.1 mrg
2811 1.1 mrg // If we crossed a loop into an outer loop without crossing the
2812 1.1 mrg // latch, this is just an early exit from the loop.
2813 1.1 mrg if (loops_crossed == 1
2814 1.1 mrg && !crossed_latch
2815 1.1 mrg && flow_loop_nested_p (exit->dest->loop_father, exit->src->loop_father))
2816 1.1 mrg return false;
2817 1.1 mrg
2818 1.1 mrg if (cfun->curr_properties & PROP_loop_opts_done)
2819 1.1 mrg return false;
2820 1.1 mrg
2821 1.1 mrg if (seen_latch && empty_block_p (loop->latch))
2822 1.1 mrg {
2823 1.1 mrg cancel_thread (&path, "Threading through latch before loop opts "
2824 1.1 mrg "would create non-empty latch");
2825 1.1 mrg return true;
2826 1.1 mrg }
2827 1.1 mrg if (loops_crossed)
2828 1.1 mrg {
2829 1.1 mrg cancel_thread (&path, "Path crosses loops");
2830 1.1 mrg return true;
2831 1.1 mrg }
2832 1.1 mrg // The path should either start and end in the same loop or exit the
2833 1.1 mrg // loop it starts in but never enter a loop. This also catches
2834 1.1 mrg // creating irreducible loops, not only rotation.
2835 1.1 mrg if (entry->src->loop_father != exit->dest->loop_father
2836 1.1 mrg && !flow_loop_nested_p (exit->src->loop_father,
2837 1.1 mrg entry->dest->loop_father))
2838 1.1 mrg {
2839 1.1 mrg cancel_thread (&path, "Path rotates loop");
2840 1.1 mrg return true;
2841 1.1 mrg }
2842 1.1 mrg if (crossed_loop_header)
2843 1.1 mrg {
2844 1.1 mrg cancel_thread (&path, "Path crosses loop header but does not exit it");
2845 1.1 mrg return true;
2846 1.1 mrg }
2847 1.1 mrg return false;
2848 1.1 mrg }
2849 1.1 mrg
2850 1.1 mrg /* Register a jump threading opportunity. We queue up all the jump
2851 1.1 mrg threading opportunities discovered by a pass and update the CFG
2852 1.1 mrg and SSA form all at once.
2853 1.1 mrg
2854 1.1 mrg E is the edge we can thread, E2 is the new target edge, i.e., we
2855 1.1 mrg are effectively recording that E->dest can be changed to E2->dest
2856 1.1 mrg after fixing the SSA graph.
2857 1.1 mrg
2858 1.1 mrg Return TRUE if PATH was successfully threaded. */
2859 1.1 mrg
2860 1.1 mrg bool
2861 1.1 mrg jt_path_registry::register_jump_thread (vec<jump_thread_edge *> *path)
2862 1.1 mrg {
2863 1.1 mrg gcc_checking_assert (flag_thread_jumps);
2864 1.1 mrg
2865 1.1 mrg if (!dbg_cnt (registered_jump_thread))
2866 1.1 mrg {
2867 1.1 mrg path->release ();
2868 1.1 mrg return false;
2869 1.1 mrg }
2870 1.1 mrg
2871 1.1 mrg if (cancel_invalid_paths (*path))
2872 1.1 mrg return false;
2873 1.1 mrg
2874 1.1 mrg if (dump_file && (dump_flags & TDF_DETAILS))
2875 1.1 mrg dump_jump_thread_path (dump_file, *path, true);
2876 1.1 mrg
2877 1.1 mrg m_paths.safe_push (path);
2878 1.1 mrg return true;
2879 1.1 mrg }
2880 1.1 mrg
2881 1.1 mrg /* Return how many uses of T there are within BB, as long as there
2882 1.1 mrg aren't any uses outside BB. If there are any uses outside BB,
2883 1.1 mrg return -1 if there's at most one use within BB, or -2 if there is
2884 1.1 mrg more than one use within BB. */
2885 1.1 mrg
2886 1.1 mrg static int
2887 1.1 mrg uses_in_bb (tree t, basic_block bb)
2888 1.1 mrg {
2889 1.1 mrg int uses = 0;
2890 1.1 mrg bool outside_bb = false;
2891 1.1 mrg
2892 1.1 mrg imm_use_iterator iter;
2893 1.1 mrg use_operand_p use_p;
2894 1.1 mrg FOR_EACH_IMM_USE_FAST (use_p, iter, t)
2895 1.1 mrg {
2896 1.1 mrg if (is_gimple_debug (USE_STMT (use_p)))
2897 1.1 mrg continue;
2898 1.1 mrg
2899 1.1 mrg if (gimple_bb (USE_STMT (use_p)) != bb)
2900 1.1 mrg outside_bb = true;
2901 1.1 mrg else
2902 1.1 mrg uses++;
2903 1.1 mrg
2904 1.1 mrg if (outside_bb && uses > 1)
2905 1.1 mrg return -2;
2906 1.1 mrg }
2907 1.1 mrg
2908 1.1 mrg if (outside_bb)
2909 1.1 mrg return -1;
2910 1.1 mrg
2911 1.1 mrg return uses;
2912 1.1 mrg }
2913 1.1 mrg
2914 1.1 mrg /* Starting from the final control flow stmt in BB, assuming it will
2915 1.1 mrg be removed, follow uses in to-be-removed stmts back to their defs
2916 1.1 mrg and count how many defs are to become dead and be removed as
2917 1.1 mrg well. */
2918 1.1 mrg
2919 1.1 mrg unsigned int
2920 1.1 mrg estimate_threading_killed_stmts (basic_block bb)
2921 1.1 mrg {
2922 1.1 mrg int killed_stmts = 0;
2923 1.1 mrg hash_map<tree, int> ssa_remaining_uses;
2924 1.1 mrg auto_vec<gimple *, 4> dead_worklist;
2925 1.1 mrg
2926 1.1 mrg /* If the block has only two predecessors, threading will turn phi
2927 1.1 mrg dsts into either src, so count them as dead stmts. */
2928 1.1 mrg bool drop_all_phis = EDGE_COUNT (bb->preds) == 2;
2929 1.1 mrg
2930 1.1 mrg if (drop_all_phis)
2931 1.1 mrg for (gphi_iterator gsi = gsi_start_phis (bb);
2932 1.1 mrg !gsi_end_p (gsi); gsi_next (&gsi))
2933 1.1 mrg {
2934 1.1 mrg gphi *phi = gsi.phi ();
2935 1.1 mrg tree dst = gimple_phi_result (phi);
2936 1.1 mrg
2937 1.1 mrg /* We don't count virtual PHIs as stmts in
2938 1.1 mrg record_temporary_equivalences_from_phis. */
2939 1.1 mrg if (virtual_operand_p (dst))
2940 1.1 mrg continue;
2941 1.1 mrg
2942 1.1 mrg killed_stmts++;
2943 1.1 mrg }
2944 1.1 mrg
2945 1.1 mrg if (gsi_end_p (gsi_last_bb (bb)))
2946 1.1 mrg return killed_stmts;
2947 1.1 mrg
2948 1.1 mrg gimple *stmt = gsi_stmt (gsi_last_bb (bb));
2949 1.1 mrg if (gimple_code (stmt) != GIMPLE_COND
2950 1.1 mrg && gimple_code (stmt) != GIMPLE_GOTO
2951 1.1 mrg && gimple_code (stmt) != GIMPLE_SWITCH)
2952 1.1 mrg return killed_stmts;
2953 1.1 mrg
2954 1.1 mrg /* The control statement is always dead. */
2955 1.1 mrg killed_stmts++;
2956 1.1 mrg dead_worklist.quick_push (stmt);
2957 1.1 mrg while (!dead_worklist.is_empty ())
2958 1.1 mrg {
2959 1.1 mrg stmt = dead_worklist.pop ();
2960 1.1 mrg
2961 1.1 mrg ssa_op_iter iter;
2962 1.1 mrg use_operand_p use_p;
2963 1.1 mrg FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
2964 1.1 mrg {
2965 1.1 mrg tree t = USE_FROM_PTR (use_p);
2966 1.1 mrg gimple *def = SSA_NAME_DEF_STMT (t);
2967 1.1 mrg
2968 1.1 mrg if (gimple_bb (def) == bb
2969 1.1 mrg && (gimple_code (def) != GIMPLE_PHI
2970 1.1 mrg || !drop_all_phis)
2971 1.1 mrg && !gimple_has_side_effects (def))
2972 1.1 mrg {
2973 1.1 mrg int *usesp = ssa_remaining_uses.get (t);
2974 1.1 mrg int uses;
2975 1.1 mrg
2976 1.1 mrg if (usesp)
2977 1.1 mrg uses = *usesp;
2978 1.1 mrg else
2979 1.1 mrg uses = uses_in_bb (t, bb);
2980 1.1 mrg
2981 1.1 mrg gcc_assert (uses);
2982 1.1 mrg
2983 1.1 mrg /* Don't bother recording the expected use count if we
2984 1.1 mrg won't find any further uses within BB. */
2985 1.1 mrg if (!usesp && (uses < -1 || uses > 1))
2986 1.1 mrg {
2987 1.1 mrg usesp = &ssa_remaining_uses.get_or_insert (t);
2988 1.1 mrg *usesp = uses;
2989 1.1 mrg }
2990 1.1 mrg
2991 1.1 mrg if (uses < 0)
2992 1.1 mrg continue;
2993 1.1 mrg
2994 1.1 mrg --uses;
2995 1.1 mrg if (usesp)
2996 1.1 mrg *usesp = uses;
2997 1.1 mrg
2998 1.1 mrg if (!uses)
2999 1.1 mrg {
3000 1.1 mrg killed_stmts++;
3001 1.1 mrg if (usesp)
3002 1.1 mrg ssa_remaining_uses.remove (t);
3003 1.1 mrg if (gimple_code (def) != GIMPLE_PHI)
3004 1.1 mrg dead_worklist.safe_push (def);
3005 1.1 mrg }
3006 1.1 mrg }
3007 1.1 mrg }
3008 1.1 mrg }
3009 1.1 mrg
3010 1.1 mrg if (dump_file)
3011 1.1 mrg fprintf (dump_file, "threading bb %i kills %i stmts\n",
3012 1.1 mrg bb->index, killed_stmts);
3013 1.1 mrg
3014 1.1 mrg return killed_stmts;
3015 1.1 mrg }
3016