Daily bump.
[official-gcc.git] / gcc / tree-ssa-threadedge.c
blob90c1e2af94ac12d251c3a88d4a48a552a2121a47
1 /* SSA Jump Threading
2 Copyright (C) 2005-2015 Free Software Foundation, Inc.
3 Contributed by Jeff Law <law@redhat.com>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "hash-set.h"
26 #include "machmode.h"
27 #include "vec.h"
28 #include "double-int.h"
29 #include "input.h"
30 #include "alias.h"
31 #include "symtab.h"
32 #include "wide-int.h"
33 #include "inchash.h"
34 #include "tree.h"
35 #include "fold-const.h"
36 #include "flags.h"
37 #include "tm_p.h"
38 #include "predict.h"
39 #include "hard-reg-set.h"
40 #include "input.h"
41 #include "function.h"
42 #include "dominance.h"
43 #include "basic-block.h"
44 #include "cfgloop.h"
45 #include "timevar.h"
46 #include "dumpfile.h"
47 #include "tree-ssa-alias.h"
48 #include "internal-fn.h"
49 #include "gimple-expr.h"
50 #include "is-a.h"
51 #include "gimple.h"
52 #include "gimple-iterator.h"
53 #include "gimple-ssa.h"
54 #include "tree-cfg.h"
55 #include "tree-phinodes.h"
56 #include "ssa-iterators.h"
57 #include "stringpool.h"
58 #include "tree-ssanames.h"
59 #include "tree-ssa-propagate.h"
60 #include "tree-ssa-threadupdate.h"
61 #include "langhooks.h"
62 #include "params.h"
63 #include "tree-ssa-threadedge.h"
64 #include "tree-ssa-loop.h"
65 #include "builtins.h"
66 #include "cfg.h"
67 #include "cfganal.h"
69 /* To avoid code explosion due to jump threading, we limit the
70 number of statements we are going to copy. This variable
71 holds the number of statements currently seen that we'll have
72 to copy as part of the jump threading process. */
73 static int stmt_count;
75 /* Array to record value-handles per SSA_NAME. */
76 vec<tree> ssa_name_values;
78 /* Set the value for the SSA name NAME to VALUE. */
80 void
81 set_ssa_name_value (tree name, tree value)
83 if (SSA_NAME_VERSION (name) >= ssa_name_values.length ())
84 ssa_name_values.safe_grow_cleared (SSA_NAME_VERSION (name) + 1);
85 if (value && TREE_OVERFLOW_P (value))
86 value = drop_tree_overflow (value);
87 ssa_name_values[SSA_NAME_VERSION (name)] = value;
90 /* Initialize the per SSA_NAME value-handles array. Returns it. */
91 void
92 threadedge_initialize_values (void)
94 gcc_assert (!ssa_name_values.exists ());
95 ssa_name_values.create (num_ssa_names);
98 /* Free the per SSA_NAME value-handle array. */
99 void
100 threadedge_finalize_values (void)
102 ssa_name_values.release ();
105 /* Return TRUE if we may be able to thread an incoming edge into
106 BB to an outgoing edge from BB. Return FALSE otherwise. */
108 bool
109 potentially_threadable_block (basic_block bb)
111 gimple_stmt_iterator gsi;
113 /* Special case. We can get blocks that are forwarders, but are
114 not optimized away because they forward from outside a loop
115 to the loop header. We want to thread through them as we can
116 sometimes thread to the loop exit, which is obviously profitable.
117 the interesting case here is when the block has PHIs. */
118 if (gsi_end_p (gsi_start_nondebug_bb (bb))
119 && !gsi_end_p (gsi_start_phis (bb)))
120 return true;
122 /* If BB has a single successor or a single predecessor, then
123 there is no threading opportunity. */
124 if (single_succ_p (bb) || single_pred_p (bb))
125 return false;
127 /* If BB does not end with a conditional, switch or computed goto,
128 then there is no threading opportunity. */
129 gsi = gsi_last_bb (bb);
130 if (gsi_end_p (gsi)
131 || ! gsi_stmt (gsi)
132 || (gimple_code (gsi_stmt (gsi)) != GIMPLE_COND
133 && gimple_code (gsi_stmt (gsi)) != GIMPLE_GOTO
134 && gimple_code (gsi_stmt (gsi)) != GIMPLE_SWITCH))
135 return false;
137 return true;
140 /* Return the LHS of any ASSERT_EXPR where OP appears as the first
141 argument to the ASSERT_EXPR and in which the ASSERT_EXPR dominates
142 BB. If no such ASSERT_EXPR is found, return OP. */
144 static tree
145 lhs_of_dominating_assert (tree op, basic_block bb, gimple stmt)
147 imm_use_iterator imm_iter;
148 gimple use_stmt;
149 use_operand_p use_p;
151 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, op)
153 use_stmt = USE_STMT (use_p);
154 if (use_stmt != stmt
155 && gimple_assign_single_p (use_stmt)
156 && TREE_CODE (gimple_assign_rhs1 (use_stmt)) == ASSERT_EXPR
157 && TREE_OPERAND (gimple_assign_rhs1 (use_stmt), 0) == op
158 && dominated_by_p (CDI_DOMINATORS, bb, gimple_bb (use_stmt)))
160 return gimple_assign_lhs (use_stmt);
163 return op;
166 /* We record temporary equivalences created by PHI nodes or
167 statements within the target block. Doing so allows us to
168 identify more jump threading opportunities, even in blocks
169 with side effects.
171 We keep track of those temporary equivalences in a stack
172 structure so that we can unwind them when we're done processing
173 a particular edge. This routine handles unwinding the data
174 structures. */
176 static void
177 remove_temporary_equivalences (vec<tree> *stack)
179 while (stack->length () > 0)
181 tree prev_value, dest;
183 dest = stack->pop ();
185 /* A NULL value indicates we should stop unwinding, otherwise
186 pop off the next entry as they're recorded in pairs. */
187 if (dest == NULL)
188 break;
190 prev_value = stack->pop ();
191 set_ssa_name_value (dest, prev_value);
195 /* Record a temporary equivalence, saving enough information so that
196 we can restore the state of recorded equivalences when we're
197 done processing the current edge. */
199 static void
200 record_temporary_equivalence (tree x, tree y, vec<tree> *stack)
202 tree prev_x = SSA_NAME_VALUE (x);
204 /* Y may be NULL if we are invalidating entries in the table. */
205 if (y && TREE_CODE (y) == SSA_NAME)
207 tree tmp = SSA_NAME_VALUE (y);
208 y = tmp ? tmp : y;
211 set_ssa_name_value (x, y);
212 stack->reserve (2);
213 stack->quick_push (prev_x);
214 stack->quick_push (x);
217 /* Record temporary equivalences created by PHIs at the target of the
218 edge E. Record unwind information for the equivalences onto STACK.
220 If a PHI which prevents threading is encountered, then return FALSE
221 indicating we should not thread this edge, else return TRUE.
223 If SRC_MAP/DST_MAP exist, then mark the source and destination SSA_NAMEs
224 of any equivalences recorded. We use this to make invalidation after
225 traversing back edges less painful. */
227 static bool
228 record_temporary_equivalences_from_phis (edge e, vec<tree> *stack)
230 gphi_iterator gsi;
232 /* Each PHI creates a temporary equivalence, record them.
233 These are context sensitive equivalences and will be removed
234 later. */
235 for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
237 gphi *phi = gsi.phi ();
238 tree src = PHI_ARG_DEF_FROM_EDGE (phi, e);
239 tree dst = gimple_phi_result (phi);
241 /* If the desired argument is not the same as this PHI's result
242 and it is set by a PHI in E->dest, then we can not thread
243 through E->dest. */
244 if (src != dst
245 && TREE_CODE (src) == SSA_NAME
246 && gimple_code (SSA_NAME_DEF_STMT (src)) == GIMPLE_PHI
247 && gimple_bb (SSA_NAME_DEF_STMT (src)) == e->dest)
248 return false;
250 /* We consider any non-virtual PHI as a statement since it
251 count result in a constant assignment or copy operation. */
252 if (!virtual_operand_p (dst))
253 stmt_count++;
255 record_temporary_equivalence (dst, src, stack);
257 return true;
260 /* Fold the RHS of an assignment statement and return it as a tree.
261 May return NULL_TREE if no simplification is possible. */
263 static tree
264 fold_assignment_stmt (gimple stmt)
266 enum tree_code subcode = gimple_assign_rhs_code (stmt);
268 switch (get_gimple_rhs_class (subcode))
270 case GIMPLE_SINGLE_RHS:
271 return fold (gimple_assign_rhs1 (stmt));
273 case GIMPLE_UNARY_RHS:
275 tree lhs = gimple_assign_lhs (stmt);
276 tree op0 = gimple_assign_rhs1 (stmt);
277 return fold_unary (subcode, TREE_TYPE (lhs), op0);
280 case GIMPLE_BINARY_RHS:
282 tree lhs = gimple_assign_lhs (stmt);
283 tree op0 = gimple_assign_rhs1 (stmt);
284 tree op1 = gimple_assign_rhs2 (stmt);
285 return fold_binary (subcode, TREE_TYPE (lhs), op0, op1);
288 case GIMPLE_TERNARY_RHS:
290 tree lhs = gimple_assign_lhs (stmt);
291 tree op0 = gimple_assign_rhs1 (stmt);
292 tree op1 = gimple_assign_rhs2 (stmt);
293 tree op2 = gimple_assign_rhs3 (stmt);
295 /* Sadly, we have to handle conditional assignments specially
296 here, because fold expects all the operands of an expression
297 to be folded before the expression itself is folded, but we
298 can't just substitute the folded condition here. */
299 if (gimple_assign_rhs_code (stmt) == COND_EXPR)
300 op0 = fold (op0);
302 return fold_ternary (subcode, TREE_TYPE (lhs), op0, op1, op2);
305 default:
306 gcc_unreachable ();
310 /* A new value has been assigned to LHS. If necessary, invalidate any
311 equivalences that are no longer valid. This includes invaliding
312 LHS and any objects that are currently equivalent to LHS.
314 Finding the objects that are currently marked as equivalent to LHS
315 is a bit tricky. We could walk the ssa names and see if any have
316 SSA_NAME_VALUE that is the same as LHS. That's expensive.
318 However, it's far more efficient to look at the unwinding stack as
319 that will have all context sensitive equivalences which are the only
320 ones that we really have to worry about here. */
321 static void
322 invalidate_equivalences (tree lhs, vec<tree> *stack)
325 /* The stack is an unwinding stack. If the current element is NULL
326 then it's a "stop unwinding" marker. Else the current marker is
327 the SSA_NAME with an equivalence and the prior entry in the stack
328 is what the current element is equivalent to. */
329 for (int i = stack->length() - 1; i >= 0; i--)
331 /* Ignore the stop unwinding markers. */
332 if ((*stack)[i] == NULL)
333 continue;
335 /* We want to check the current value of stack[i] to see if
336 it matches LHS. If so, then invalidate. */
337 if (SSA_NAME_VALUE ((*stack)[i]) == lhs)
338 record_temporary_equivalence ((*stack)[i], NULL_TREE, stack);
340 /* Remember, we're dealing with two elements in this case. */
341 i--;
344 /* And invalidate any known value for LHS itself. */
345 if (SSA_NAME_VALUE (lhs))
346 record_temporary_equivalence (lhs, NULL_TREE, stack);
349 /* Try to simplify each statement in E->dest, ultimately leading to
350 a simplification of the COND_EXPR at the end of E->dest.
352 Record unwind information for temporary equivalences onto STACK.
354 Use SIMPLIFY (a pointer to a callback function) to further simplify
355 statements using pass specific information.
357 We might consider marking just those statements which ultimately
358 feed the COND_EXPR. It's not clear if the overhead of bookkeeping
359 would be recovered by trying to simplify fewer statements.
361 If we are able to simplify a statement into the form
362 SSA_NAME = (SSA_NAME | gimple invariant), then we can record
363 a context sensitive equivalence which may help us simplify
364 later statements in E->dest. */
366 static gimple
367 record_temporary_equivalences_from_stmts_at_dest (edge e,
368 vec<tree> *stack,
369 tree (*simplify) (gimple,
370 gimple),
371 bool backedge_seen)
373 gimple stmt = NULL;
374 gimple_stmt_iterator gsi;
375 int max_stmt_count;
377 max_stmt_count = PARAM_VALUE (PARAM_MAX_JUMP_THREAD_DUPLICATION_STMTS);
379 /* Walk through each statement in the block recording equivalences
380 we discover. Note any equivalences we discover are context
381 sensitive (ie, are dependent on traversing E) and must be unwound
382 when we're finished processing E. */
383 for (gsi = gsi_start_bb (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
385 tree cached_lhs = NULL;
387 stmt = gsi_stmt (gsi);
389 /* Ignore empty statements and labels. */
390 if (gimple_code (stmt) == GIMPLE_NOP
391 || gimple_code (stmt) == GIMPLE_LABEL
392 || is_gimple_debug (stmt))
393 continue;
395 /* If the statement has volatile operands, then we assume we
396 can not thread through this block. This is overly
397 conservative in some ways. */
398 if (gimple_code (stmt) == GIMPLE_ASM
399 && gimple_asm_volatile_p (as_a <gasm *> (stmt)))
400 return NULL;
402 /* If duplicating this block is going to cause too much code
403 expansion, then do not thread through this block. */
404 stmt_count++;
405 if (stmt_count > max_stmt_count)
406 return NULL;
408 /* If this is not a statement that sets an SSA_NAME to a new
409 value, then do not try to simplify this statement as it will
410 not simplify in any way that is helpful for jump threading. */
411 if ((gimple_code (stmt) != GIMPLE_ASSIGN
412 || TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME)
413 && (gimple_code (stmt) != GIMPLE_CALL
414 || gimple_call_lhs (stmt) == NULL_TREE
415 || TREE_CODE (gimple_call_lhs (stmt)) != SSA_NAME))
417 /* STMT might still have DEFS and we need to invalidate any known
418 equivalences for them.
420 Consider if STMT is a GIMPLE_ASM with one or more outputs that
421 feeds a conditional inside a loop. We might derive an equivalence
422 due to the conditional. */
423 tree op;
424 ssa_op_iter iter;
426 if (backedge_seen)
427 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF)
428 invalidate_equivalences (op, stack);
430 continue;
433 /* The result of __builtin_object_size depends on all the arguments
434 of a phi node. Temporarily using only one edge produces invalid
435 results. For example
437 if (x < 6)
438 goto l;
439 else
440 goto l;
443 r = PHI <&w[2].a[1](2), &a.a[6](3)>
444 __builtin_object_size (r, 0)
446 The result of __builtin_object_size is defined to be the maximum of
447 remaining bytes. If we use only one edge on the phi, the result will
448 change to be the remaining bytes for the corresponding phi argument.
450 Similarly for __builtin_constant_p:
452 r = PHI <1(2), 2(3)>
453 __builtin_constant_p (r)
455 Both PHI arguments are constant, but x ? 1 : 2 is still not
456 constant. */
458 if (is_gimple_call (stmt))
460 tree fndecl = gimple_call_fndecl (stmt);
461 if (fndecl
462 && (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_OBJECT_SIZE
463 || DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CONSTANT_P))
465 if (backedge_seen)
467 tree lhs = gimple_get_lhs (stmt);
468 invalidate_equivalences (lhs, stack);
470 continue;
474 /* At this point we have a statement which assigns an RHS to an
475 SSA_VAR on the LHS. We want to try and simplify this statement
476 to expose more context sensitive equivalences which in turn may
477 allow us to simplify the condition at the end of the loop.
479 Handle simple copy operations as well as implied copies from
480 ASSERT_EXPRs. */
481 if (gimple_assign_single_p (stmt)
482 && TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME)
483 cached_lhs = gimple_assign_rhs1 (stmt);
484 else if (gimple_assign_single_p (stmt)
485 && TREE_CODE (gimple_assign_rhs1 (stmt)) == ASSERT_EXPR)
486 cached_lhs = TREE_OPERAND (gimple_assign_rhs1 (stmt), 0);
487 else
489 /* A statement that is not a trivial copy or ASSERT_EXPR.
490 We're going to temporarily copy propagate the operands
491 and see if that allows us to simplify this statement. */
492 tree *copy;
493 ssa_op_iter iter;
494 use_operand_p use_p;
495 unsigned int num, i = 0;
497 num = NUM_SSA_OPERANDS (stmt, (SSA_OP_USE | SSA_OP_VUSE));
498 copy = XCNEWVEC (tree, num);
500 /* Make a copy of the uses & vuses into USES_COPY, then cprop into
501 the operands. */
502 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE | SSA_OP_VUSE)
504 tree tmp = NULL;
505 tree use = USE_FROM_PTR (use_p);
507 copy[i++] = use;
508 if (TREE_CODE (use) == SSA_NAME)
509 tmp = SSA_NAME_VALUE (use);
510 if (tmp)
511 SET_USE (use_p, tmp);
514 /* Try to fold/lookup the new expression. Inserting the
515 expression into the hash table is unlikely to help. */
516 if (is_gimple_call (stmt))
517 cached_lhs = fold_call_stmt (as_a <gcall *> (stmt), false);
518 else
519 cached_lhs = fold_assignment_stmt (stmt);
521 if (!cached_lhs
522 || (TREE_CODE (cached_lhs) != SSA_NAME
523 && !is_gimple_min_invariant (cached_lhs)))
524 cached_lhs = (*simplify) (stmt, stmt);
526 /* Restore the statement's original uses/defs. */
527 i = 0;
528 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE | SSA_OP_VUSE)
529 SET_USE (use_p, copy[i++]);
531 free (copy);
534 /* Record the context sensitive equivalence if we were able
535 to simplify this statement.
537 If we have traversed a backedge at some point during threading,
538 then always enter something here. Either a real equivalence,
539 or a NULL_TREE equivalence which is effectively invalidation of
540 prior equivalences. */
541 if (cached_lhs
542 && (TREE_CODE (cached_lhs) == SSA_NAME
543 || is_gimple_min_invariant (cached_lhs)))
544 record_temporary_equivalence (gimple_get_lhs (stmt), cached_lhs, stack);
545 else if (backedge_seen)
546 invalidate_equivalences (gimple_get_lhs (stmt), stack);
548 return stmt;
551 /* Once we have passed a backedge in the CFG when threading, we do not want to
552 utilize edge equivalences for simplification purpose. They are no longer
553 necessarily valid. We use this callback rather than the ones provided by
554 DOM/VRP to achieve that effect. */
555 static tree
556 dummy_simplify (gimple stmt1 ATTRIBUTE_UNUSED, gimple stmt2 ATTRIBUTE_UNUSED)
558 return NULL_TREE;
561 /* Simplify the control statement at the end of the block E->dest.
563 To avoid allocating memory unnecessarily, a scratch GIMPLE_COND
564 is available to use/clobber in DUMMY_COND.
566 Use SIMPLIFY (a pointer to a callback function) to further simplify
567 a condition using pass specific information.
569 Return the simplified condition or NULL if simplification could
570 not be performed. */
572 static tree
573 simplify_control_stmt_condition (edge e,
574 gimple stmt,
575 gcond *dummy_cond,
576 tree (*simplify) (gimple, gimple),
577 bool handle_dominating_asserts)
579 tree cond, cached_lhs;
580 enum gimple_code code = gimple_code (stmt);
582 /* For comparisons, we have to update both operands, then try
583 to simplify the comparison. */
584 if (code == GIMPLE_COND)
586 tree op0, op1;
587 enum tree_code cond_code;
589 op0 = gimple_cond_lhs (stmt);
590 op1 = gimple_cond_rhs (stmt);
591 cond_code = gimple_cond_code (stmt);
593 /* Get the current value of both operands. */
594 if (TREE_CODE (op0) == SSA_NAME)
596 for (int i = 0; i < 2; i++)
598 if (TREE_CODE (op0) == SSA_NAME
599 && SSA_NAME_VALUE (op0))
600 op0 = SSA_NAME_VALUE (op0);
601 else
602 break;
606 if (TREE_CODE (op1) == SSA_NAME)
608 for (int i = 0; i < 2; i++)
610 if (TREE_CODE (op1) == SSA_NAME
611 && SSA_NAME_VALUE (op1))
612 op1 = SSA_NAME_VALUE (op1);
613 else
614 break;
618 if (handle_dominating_asserts)
620 /* Now see if the operand was consumed by an ASSERT_EXPR
621 which dominates E->src. If so, we want to replace the
622 operand with the LHS of the ASSERT_EXPR. */
623 if (TREE_CODE (op0) == SSA_NAME)
624 op0 = lhs_of_dominating_assert (op0, e->src, stmt);
626 if (TREE_CODE (op1) == SSA_NAME)
627 op1 = lhs_of_dominating_assert (op1, e->src, stmt);
630 /* We may need to canonicalize the comparison. For
631 example, op0 might be a constant while op1 is an
632 SSA_NAME. Failure to canonicalize will cause us to
633 miss threading opportunities. */
634 if (tree_swap_operands_p (op0, op1, false))
636 tree tmp;
637 cond_code = swap_tree_comparison (cond_code);
638 tmp = op0;
639 op0 = op1;
640 op1 = tmp;
643 /* Stuff the operator and operands into our dummy conditional
644 expression. */
645 gimple_cond_set_code (dummy_cond, cond_code);
646 gimple_cond_set_lhs (dummy_cond, op0);
647 gimple_cond_set_rhs (dummy_cond, op1);
649 /* We absolutely do not care about any type conversions
650 we only care about a zero/nonzero value. */
651 fold_defer_overflow_warnings ();
653 cached_lhs = fold_binary (cond_code, boolean_type_node, op0, op1);
654 if (cached_lhs)
655 while (CONVERT_EXPR_P (cached_lhs))
656 cached_lhs = TREE_OPERAND (cached_lhs, 0);
658 fold_undefer_overflow_warnings ((cached_lhs
659 && is_gimple_min_invariant (cached_lhs)),
660 stmt, WARN_STRICT_OVERFLOW_CONDITIONAL);
662 /* If we have not simplified the condition down to an invariant,
663 then use the pass specific callback to simplify the condition. */
664 if (!cached_lhs
665 || !is_gimple_min_invariant (cached_lhs))
666 cached_lhs = (*simplify) (dummy_cond, stmt);
668 return cached_lhs;
671 if (code == GIMPLE_SWITCH)
672 cond = gimple_switch_index (as_a <gswitch *> (stmt));
673 else if (code == GIMPLE_GOTO)
674 cond = gimple_goto_dest (stmt);
675 else
676 gcc_unreachable ();
678 /* We can have conditionals which just test the state of a variable
679 rather than use a relational operator. These are simpler to handle. */
680 if (TREE_CODE (cond) == SSA_NAME)
682 tree original_lhs = cond;
683 cached_lhs = cond;
685 /* Get the variable's current value from the equivalence chains.
687 It is possible to get loops in the SSA_NAME_VALUE chains
688 (consider threading the backedge of a loop where we have
689 a loop invariant SSA_NAME used in the condition. */
690 if (cached_lhs)
692 for (int i = 0; i < 2; i++)
694 if (TREE_CODE (cached_lhs) == SSA_NAME
695 && SSA_NAME_VALUE (cached_lhs))
696 cached_lhs = SSA_NAME_VALUE (cached_lhs);
697 else
698 break;
702 /* If we're dominated by a suitable ASSERT_EXPR, then
703 update CACHED_LHS appropriately. */
704 if (handle_dominating_asserts && TREE_CODE (cached_lhs) == SSA_NAME)
705 cached_lhs = lhs_of_dominating_assert (cached_lhs, e->src, stmt);
707 /* If we haven't simplified to an invariant yet, then use the
708 pass specific callback to try and simplify it further. */
709 if (cached_lhs && ! is_gimple_min_invariant (cached_lhs))
710 cached_lhs = (*simplify) (stmt, stmt);
712 /* We couldn't find an invariant. But, callers of this
713 function may be able to do something useful with the
714 unmodified destination. */
715 if (!cached_lhs)
716 cached_lhs = original_lhs;
718 else
719 cached_lhs = NULL;
721 return cached_lhs;
724 /* Copy debug stmts from DEST's chain of single predecessors up to
725 SRC, so that we don't lose the bindings as PHI nodes are introduced
726 when DEST gains new predecessors. */
727 void
728 propagate_threaded_block_debug_into (basic_block dest, basic_block src)
730 if (!MAY_HAVE_DEBUG_STMTS)
731 return;
733 if (!single_pred_p (dest))
734 return;
736 gcc_checking_assert (dest != src);
738 gimple_stmt_iterator gsi = gsi_after_labels (dest);
739 int i = 0;
740 const int alloc_count = 16; // ?? Should this be a PARAM?
742 /* Estimate the number of debug vars overridden in the beginning of
743 DEST, to tell how many we're going to need to begin with. */
744 for (gimple_stmt_iterator si = gsi;
745 i * 4 <= alloc_count * 3 && !gsi_end_p (si); gsi_next (&si))
747 gimple stmt = gsi_stmt (si);
748 if (!is_gimple_debug (stmt))
749 break;
750 i++;
753 auto_vec<tree, alloc_count> fewvars;
754 hash_set<tree> *vars = NULL;
756 /* If we're already starting with 3/4 of alloc_count, go for a
757 hash_set, otherwise start with an unordered stack-allocated
758 VEC. */
759 if (i * 4 > alloc_count * 3)
760 vars = new hash_set<tree>;
762 /* Now go through the initial debug stmts in DEST again, this time
763 actually inserting in VARS or FEWVARS. Don't bother checking for
764 duplicates in FEWVARS. */
765 for (gimple_stmt_iterator si = gsi; !gsi_end_p (si); gsi_next (&si))
767 gimple stmt = gsi_stmt (si);
768 if (!is_gimple_debug (stmt))
769 break;
771 tree var;
773 if (gimple_debug_bind_p (stmt))
774 var = gimple_debug_bind_get_var (stmt);
775 else if (gimple_debug_source_bind_p (stmt))
776 var = gimple_debug_source_bind_get_var (stmt);
777 else
778 gcc_unreachable ();
780 if (vars)
781 vars->add (var);
782 else
783 fewvars.quick_push (var);
786 basic_block bb = dest;
790 bb = single_pred (bb);
791 for (gimple_stmt_iterator si = gsi_last_bb (bb);
792 !gsi_end_p (si); gsi_prev (&si))
794 gimple stmt = gsi_stmt (si);
795 if (!is_gimple_debug (stmt))
796 continue;
798 tree var;
800 if (gimple_debug_bind_p (stmt))
801 var = gimple_debug_bind_get_var (stmt);
802 else if (gimple_debug_source_bind_p (stmt))
803 var = gimple_debug_source_bind_get_var (stmt);
804 else
805 gcc_unreachable ();
807 /* Discard debug bind overlaps. ??? Unlike stmts from src,
808 copied into a new block that will precede BB, debug bind
809 stmts in bypassed BBs may actually be discarded if
810 they're overwritten by subsequent debug bind stmts, which
811 might be a problem once we introduce stmt frontier notes
812 or somesuch. Adding `&& bb == src' to the condition
813 below will preserve all potentially relevant debug
814 notes. */
815 if (vars && vars->add (var))
816 continue;
817 else if (!vars)
819 int i = fewvars.length ();
820 while (i--)
821 if (fewvars[i] == var)
822 break;
823 if (i >= 0)
824 continue;
826 if (fewvars.length () < (unsigned) alloc_count)
827 fewvars.quick_push (var);
828 else
830 vars = new hash_set<tree>;
831 for (i = 0; i < alloc_count; i++)
832 vars->add (fewvars[i]);
833 fewvars.release ();
834 vars->add (var);
838 stmt = gimple_copy (stmt);
839 /* ??? Should we drop the location of the copy to denote
840 they're artificial bindings? */
841 gsi_insert_before (&gsi, stmt, GSI_NEW_STMT);
844 while (bb != src && single_pred_p (bb));
846 if (vars)
847 delete vars;
848 else if (fewvars.exists ())
849 fewvars.release ();
852 /* See if TAKEN_EDGE->dest is a threadable block with no side effecs (ie, it
853 need not be duplicated as part of the CFG/SSA updating process).
855 If it is threadable, add it to PATH and VISITED and recurse, ultimately
856 returning TRUE from the toplevel call. Otherwise do nothing and
857 return false.
859 DUMMY_COND, HANDLE_DOMINATING_ASSERTS and SIMPLIFY are used to
860 try and simplify the condition at the end of TAKEN_EDGE->dest. */
861 static bool
862 thread_around_empty_blocks (edge taken_edge,
863 gcond *dummy_cond,
864 bool handle_dominating_asserts,
865 tree (*simplify) (gimple, gimple),
866 bitmap visited,
867 vec<jump_thread_edge *> *path,
868 bool *backedge_seen_p)
870 basic_block bb = taken_edge->dest;
871 gimple_stmt_iterator gsi;
872 gimple stmt;
873 tree cond;
875 /* The key property of these blocks is that they need not be duplicated
876 when threading. Thus they can not have visible side effects such
877 as PHI nodes. */
878 if (!gsi_end_p (gsi_start_phis (bb)))
879 return false;
881 /* Skip over DEBUG statements at the start of the block. */
882 gsi = gsi_start_nondebug_bb (bb);
884 /* If the block has no statements, but does have a single successor, then
885 it's just a forwarding block and we can thread through it trivially.
887 However, note that just threading through empty blocks with single
888 successors is not inherently profitable. For the jump thread to
889 be profitable, we must avoid a runtime conditional.
891 By taking the return value from the recursive call, we get the
892 desired effect of returning TRUE when we found a profitable jump
893 threading opportunity and FALSE otherwise.
895 This is particularly important when this routine is called after
896 processing a joiner block. Returning TRUE too aggressively in
897 that case results in pointless duplication of the joiner block. */
898 if (gsi_end_p (gsi))
900 if (single_succ_p (bb))
902 taken_edge = single_succ_edge (bb);
903 if (!bitmap_bit_p (visited, taken_edge->dest->index))
905 jump_thread_edge *x
906 = new jump_thread_edge (taken_edge, EDGE_NO_COPY_SRC_BLOCK);
907 path->safe_push (x);
908 bitmap_set_bit (visited, taken_edge->dest->index);
909 *backedge_seen_p |= ((taken_edge->flags & EDGE_DFS_BACK) != 0);
910 if (*backedge_seen_p)
911 simplify = dummy_simplify;
912 return thread_around_empty_blocks (taken_edge,
913 dummy_cond,
914 handle_dominating_asserts,
915 simplify,
916 visited,
917 path,
918 backedge_seen_p);
922 /* We have a block with no statements, but multiple successors? */
923 return false;
926 /* The only real statements this block can have are a control
927 flow altering statement. Anything else stops the thread. */
928 stmt = gsi_stmt (gsi);
929 if (gimple_code (stmt) != GIMPLE_COND
930 && gimple_code (stmt) != GIMPLE_GOTO
931 && gimple_code (stmt) != GIMPLE_SWITCH)
932 return false;
934 /* If we have traversed a backedge, then we do not want to look
935 at certain expressions in the table that can not be relied upon.
936 Luckily the only code that looked at those expressions is the
937 SIMPLIFY callback, which we replace if we can no longer use it. */
938 if (*backedge_seen_p)
939 simplify = dummy_simplify;
941 /* Extract and simplify the condition. */
942 cond = simplify_control_stmt_condition (taken_edge, stmt, dummy_cond,
943 simplify, handle_dominating_asserts);
945 /* If the condition can be statically computed and we have not already
946 visited the destination edge, then add the taken edge to our thread
947 path. */
948 if (cond && is_gimple_min_invariant (cond))
950 taken_edge = find_taken_edge (bb, cond);
952 if (bitmap_bit_p (visited, taken_edge->dest->index))
953 return false;
954 bitmap_set_bit (visited, taken_edge->dest->index);
956 jump_thread_edge *x
957 = new jump_thread_edge (taken_edge, EDGE_NO_COPY_SRC_BLOCK);
958 path->safe_push (x);
959 *backedge_seen_p |= ((taken_edge->flags & EDGE_DFS_BACK) != 0);
960 if (*backedge_seen_p)
961 simplify = dummy_simplify;
963 thread_around_empty_blocks (taken_edge,
964 dummy_cond,
965 handle_dominating_asserts,
966 simplify,
967 visited,
968 path,
969 backedge_seen_p);
970 return true;
973 return false;
976 /* Return true if the CFG contains at least one path from START_BB to END_BB.
977 When a path is found, record in PATH the blocks from END_BB to START_BB.
978 VISITED_BBS is used to make sure we don't fall into an infinite loop. Bound
979 the recursion to basic blocks belonging to LOOP. */
981 static bool
982 fsm_find_thread_path (basic_block start_bb, basic_block end_bb,
983 vec<basic_block, va_gc> *&path,
984 hash_set<basic_block> *visited_bbs, loop_p loop)
986 if (loop != start_bb->loop_father)
987 return false;
989 if (start_bb == end_bb)
991 vec_safe_push (path, start_bb);
992 return true;
995 if (!visited_bbs->add (start_bb))
997 edge e;
998 edge_iterator ei;
999 FOR_EACH_EDGE (e, ei, start_bb->succs)
1000 if (fsm_find_thread_path (e->dest, end_bb, path, visited_bbs, loop))
1002 vec_safe_push (path, start_bb);
1003 return true;
1007 return false;
1010 static int max_threaded_paths;
1012 /* We trace the value of the variable EXPR back through any phi nodes looking
1013 for places where it gets a constant value and save the path. Stop after
1014 having recorded MAX_PATHS jump threading paths. */
1016 static void
1017 fsm_find_control_statement_thread_paths (tree expr,
1018 hash_set<basic_block> *visited_bbs,
1019 vec<basic_block, va_gc> *&path,
1020 bool seen_loop_phi)
1022 tree var = SSA_NAME_VAR (expr);
1023 gimple def_stmt = SSA_NAME_DEF_STMT (expr);
1024 basic_block var_bb = gimple_bb (def_stmt);
1026 if (var == NULL || var_bb == NULL)
1027 return;
1029 /* For the moment we assume that an SSA chain only contains phi nodes, and
1030 eventually one of the phi arguments will be an integer constant. In the
1031 future, this could be extended to also handle simple assignments of
1032 arithmetic operations. */
1033 if (gimple_code (def_stmt) != GIMPLE_PHI)
1034 return;
1036 /* Avoid infinite recursion. */
1037 if (visited_bbs->add (var_bb))
1038 return;
1040 gphi *phi = as_a <gphi *> (def_stmt);
1041 int next_path_length = 0;
1042 basic_block last_bb_in_path = path->last ();
1044 if (loop_containing_stmt (phi)->header == gimple_bb (phi))
1046 /* Do not walk through more than one loop PHI node. */
1047 if (seen_loop_phi)
1048 return;
1049 seen_loop_phi = true;
1052 /* Following the chain of SSA_NAME definitions, we jumped from a definition in
1053 LAST_BB_IN_PATH to a definition in VAR_BB. When these basic blocks are
1054 different, append to PATH the blocks from LAST_BB_IN_PATH to VAR_BB. */
1055 if (var_bb != last_bb_in_path)
1057 edge e;
1058 int e_count = 0;
1059 edge_iterator ei;
1060 vec<basic_block, va_gc> *next_path;
1061 vec_alloc (next_path, n_basic_blocks_for_fn (cfun));
1063 FOR_EACH_EDGE (e, ei, last_bb_in_path->preds)
1065 hash_set<basic_block> *visited_bbs = new hash_set<basic_block>;
1067 if (fsm_find_thread_path (var_bb, e->src, next_path, visited_bbs,
1068 e->src->loop_father))
1069 ++e_count;
1071 delete visited_bbs;
1073 /* If there is more than one path, stop. */
1074 if (e_count > 1)
1076 vec_free (next_path);
1077 return;
1081 /* Stop if we have not found a path: this could occur when the recursion
1082 is stopped by one of the bounds. */
1083 if (e_count == 0)
1085 vec_free (next_path);
1086 return;
1089 /* Append all the nodes from NEXT_PATH to PATH. */
1090 vec_safe_splice (path, next_path);
1091 next_path_length = next_path->length ();
1092 vec_free (next_path);
1095 gcc_assert (path->last () == var_bb);
1097 /* Iterate over the arguments of PHI. */
1098 unsigned int i;
1099 for (i = 0; i < gimple_phi_num_args (phi); i++)
1101 tree arg = gimple_phi_arg_def (phi, i);
1102 basic_block bbi = gimple_phi_arg_edge (phi, i)->src;
1104 /* Skip edges pointing outside the current loop. */
1105 if (!arg || var_bb->loop_father != bbi->loop_father)
1106 continue;
1108 if (TREE_CODE (arg) == SSA_NAME)
1110 vec_safe_push (path, bbi);
1111 /* Recursively follow SSA_NAMEs looking for a constant definition. */
1112 fsm_find_control_statement_thread_paths (arg, visited_bbs, path,
1113 seen_loop_phi);
1115 path->pop ();
1116 continue;
1119 if (TREE_CODE (arg) != INTEGER_CST)
1120 continue;
1122 int path_length = path->length ();
1123 /* A path with less than 2 basic blocks should not be jump-threaded. */
1124 if (path_length < 2)
1125 continue;
1127 if (path_length > PARAM_VALUE (PARAM_MAX_FSM_THREAD_LENGTH))
1129 if (dump_file && (dump_flags & TDF_DETAILS))
1130 fprintf (dump_file, "FSM jump-thread path not considered: "
1131 "the number of basic blocks on the path "
1132 "exceeds PARAM_MAX_FSM_THREAD_LENGTH.\n");
1133 continue;
1136 if (max_threaded_paths <= 0)
1138 if (dump_file && (dump_flags & TDF_DETAILS))
1139 fprintf (dump_file, "FSM jump-thread path not considered: "
1140 "the number of previously recorded FSM paths to thread "
1141 "exceeds PARAM_MAX_FSM_THREAD_PATHS.\n");
1142 continue;
1145 /* Add BBI to the path. */
1146 vec_safe_push (path, bbi);
1147 ++path_length;
1149 int n_insns = 0;
1150 gimple_stmt_iterator gsi;
1151 int j;
1152 loop_p loop = (*path)[0]->loop_father;
1153 bool path_crosses_loops = false;
1155 /* Count the number of instructions on the path: as these instructions
1156 will have to be duplicated, we will not record the path if there are
1157 too many instructions on the path. Also check that all the blocks in
1158 the path belong to a single loop. */
1159 for (j = 1; j < path_length - 1; j++)
1161 basic_block bb = (*path)[j];
1163 if (bb->loop_father != loop)
1165 path_crosses_loops = true;
1166 break;
1169 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1171 gimple stmt = gsi_stmt (gsi);
1172 /* Do not count empty statements and labels. */
1173 if (gimple_code (stmt) != GIMPLE_NOP
1174 && gimple_code (stmt) != GIMPLE_LABEL
1175 && !is_gimple_debug (stmt))
1176 ++n_insns;
1180 if (path_crosses_loops)
1182 if (dump_file && (dump_flags & TDF_DETAILS))
1183 fprintf (dump_file, "FSM jump-thread path not considered: "
1184 "the path crosses loops.\n");
1185 path->pop ();
1186 continue;
1189 if (n_insns >= PARAM_VALUE (PARAM_MAX_FSM_THREAD_PATH_INSNS))
1191 if (dump_file && (dump_flags & TDF_DETAILS))
1192 fprintf (dump_file, "FSM jump-thread path not considered: "
1193 "the number of instructions on the path "
1194 "exceeds PARAM_MAX_FSM_THREAD_PATH_INSNS.\n");
1195 path->pop ();
1196 continue;
1199 vec<jump_thread_edge *> *jump_thread_path
1200 = new vec<jump_thread_edge *> ();
1202 /* Record the edges between the blocks in PATH. */
1203 for (j = 0; j < path_length - 1; j++)
1205 edge e = find_edge ((*path)[path_length - j - 1],
1206 (*path)[path_length - j - 2]);
1207 gcc_assert (e);
1208 jump_thread_edge *x = new jump_thread_edge (e, EDGE_FSM_THREAD);
1209 jump_thread_path->safe_push (x);
1212 /* Add the edge taken when the control variable has value ARG. */
1213 edge taken_edge = find_taken_edge ((*path)[0], arg);
1214 jump_thread_edge *x
1215 = new jump_thread_edge (taken_edge, EDGE_NO_COPY_SRC_BLOCK);
1216 jump_thread_path->safe_push (x);
1218 register_jump_thread (jump_thread_path);
1219 --max_threaded_paths;
1221 /* Remove BBI from the path. */
1222 path->pop ();
1225 /* Remove all the nodes that we added from NEXT_PATH. */
1226 if (next_path_length)
1227 vec_safe_truncate (path, (path->length () - next_path_length));
1230 /* We are exiting E->src, see if E->dest ends with a conditional
1231 jump which has a known value when reached via E.
1233 E->dest can have arbitrary side effects which, if threading is
1234 successful, will be maintained.
1236 Special care is necessary if E is a back edge in the CFG as we
1237 may have already recorded equivalences for E->dest into our
1238 various tables, including the result of the conditional at
1239 the end of E->dest. Threading opportunities are severely
1240 limited in that case to avoid short-circuiting the loop
1241 incorrectly.
1243 DUMMY_COND is a shared cond_expr used by condition simplification as scratch,
1244 to avoid allocating memory.
1246 HANDLE_DOMINATING_ASSERTS is true if we should try to replace operands of
1247 the simplified condition with left-hand sides of ASSERT_EXPRs they are
1248 used in.
1250 STACK is used to undo temporary equivalences created during the walk of
1251 E->dest.
1253 SIMPLIFY is a pass-specific function used to simplify statements.
1255 Our caller is responsible for restoring the state of the expression
1256 and const_and_copies stacks.
1258 Positive return value is success. Zero return value is failure, but
1259 the block can still be duplicated as a joiner in a jump thread path,
1260 negative indicates the block should not be duplicated and thus is not
1261 suitable for a joiner in a jump threading path. */
1263 static int
1264 thread_through_normal_block (edge e,
1265 gcond *dummy_cond,
1266 bool handle_dominating_asserts,
1267 vec<tree> *stack,
1268 tree (*simplify) (gimple, gimple),
1269 vec<jump_thread_edge *> *path,
1270 bitmap visited,
1271 bool *backedge_seen_p)
1273 /* If we have traversed a backedge, then we do not want to look
1274 at certain expressions in the table that can not be relied upon.
1275 Luckily the only code that looked at those expressions is the
1276 SIMPLIFY callback, which we replace if we can no longer use it. */
1277 if (*backedge_seen_p)
1278 simplify = dummy_simplify;
1280 /* PHIs create temporary equivalences.
1281 Note that if we found a PHI that made the block non-threadable, then
1282 we need to bubble that up to our caller in the same manner we do
1283 when we prematurely stop processing statements below. */
1284 if (!record_temporary_equivalences_from_phis (e, stack))
1285 return -1;
1287 /* Now walk each statement recording any context sensitive
1288 temporary equivalences we can detect. */
1289 gimple stmt
1290 = record_temporary_equivalences_from_stmts_at_dest (e, stack, simplify,
1291 *backedge_seen_p);
1293 /* There's two reasons STMT might be null, and distinguishing
1294 between them is important.
1296 First the block may not have had any statements. For example, it
1297 might have some PHIs and unconditionally transfer control elsewhere.
1298 Such blocks are suitable for jump threading, particularly as a
1299 joiner block.
1301 The second reason would be if we did not process all the statements
1302 in the block (because there were too many to make duplicating the
1303 block profitable. If we did not look at all the statements, then
1304 we may not have invalidated everything needing invalidation. Thus
1305 we must signal to our caller that this block is not suitable for
1306 use as a joiner in a threading path. */
1307 if (!stmt)
1309 /* First case. The statement simply doesn't have any instructions, but
1310 does have PHIs. */
1311 if (gsi_end_p (gsi_start_nondebug_bb (e->dest))
1312 && !gsi_end_p (gsi_start_phis (e->dest)))
1313 return 0;
1315 /* Second case. */
1316 return -1;
1319 /* If we stopped at a COND_EXPR or SWITCH_EXPR, see if we know which arm
1320 will be taken. */
1321 if (gimple_code (stmt) == GIMPLE_COND
1322 || gimple_code (stmt) == GIMPLE_GOTO
1323 || gimple_code (stmt) == GIMPLE_SWITCH)
1325 tree cond;
1327 /* Extract and simplify the condition. */
1328 cond = simplify_control_stmt_condition (e, stmt, dummy_cond, simplify,
1329 handle_dominating_asserts);
1331 if (!cond)
1332 return 0;
1334 if (is_gimple_min_invariant (cond))
1336 edge taken_edge = find_taken_edge (e->dest, cond);
1337 basic_block dest = (taken_edge ? taken_edge->dest : NULL);
1339 /* DEST could be NULL for a computed jump to an absolute
1340 address. */
1341 if (dest == NULL
1342 || dest == e->dest
1343 || bitmap_bit_p (visited, dest->index))
1344 return 0;
1346 /* Only push the EDGE_START_JUMP_THREAD marker if this is
1347 first edge on the path. */
1348 if (path->length () == 0)
1350 jump_thread_edge *x
1351 = new jump_thread_edge (e, EDGE_START_JUMP_THREAD);
1352 path->safe_push (x);
1353 *backedge_seen_p |= ((e->flags & EDGE_DFS_BACK) != 0);
1356 jump_thread_edge *x
1357 = new jump_thread_edge (taken_edge, EDGE_COPY_SRC_BLOCK);
1358 path->safe_push (x);
1359 *backedge_seen_p |= ((taken_edge->flags & EDGE_DFS_BACK) != 0);
1360 if (*backedge_seen_p)
1361 simplify = dummy_simplify;
1363 /* See if we can thread through DEST as well, this helps capture
1364 secondary effects of threading without having to re-run DOM or
1365 VRP.
1367 We don't want to thread back to a block we have already
1368 visited. This may be overly conservative. */
1369 bitmap_set_bit (visited, dest->index);
1370 bitmap_set_bit (visited, e->dest->index);
1371 thread_around_empty_blocks (taken_edge,
1372 dummy_cond,
1373 handle_dominating_asserts,
1374 simplify,
1375 visited,
1376 path,
1377 backedge_seen_p);
1378 return 1;
1381 if (!flag_expensive_optimizations
1382 || optimize_function_for_size_p (cfun)
1383 || TREE_CODE (cond) != SSA_NAME
1384 || e->dest->loop_father != e->src->loop_father
1385 || loop_depth (e->dest->loop_father) == 0)
1386 return 0;
1388 /* When COND cannot be simplified, try to find paths from a control
1389 statement back through the PHI nodes which would affect that control
1390 statement. */
1391 vec<basic_block, va_gc> *bb_path;
1392 vec_alloc (bb_path, n_basic_blocks_for_fn (cfun));
1393 vec_safe_push (bb_path, e->dest);
1394 hash_set<basic_block> *visited_bbs = new hash_set<basic_block>;
1396 max_threaded_paths = PARAM_VALUE (PARAM_MAX_FSM_THREAD_PATHS);
1397 fsm_find_control_statement_thread_paths (cond, visited_bbs, bb_path,
1398 false);
1400 delete visited_bbs;
1401 vec_free (bb_path);
1403 return 0;
1406 /* We are exiting E->src, see if E->dest ends with a conditional
1407 jump which has a known value when reached via E.
1409 Special care is necessary if E is a back edge in the CFG as we
1410 may have already recorded equivalences for E->dest into our
1411 various tables, including the result of the conditional at
1412 the end of E->dest. Threading opportunities are severely
1413 limited in that case to avoid short-circuiting the loop
1414 incorrectly.
1416 Note it is quite common for the first block inside a loop to
1417 end with a conditional which is either always true or always
1418 false when reached via the loop backedge. Thus we do not want
1419 to blindly disable threading across a loop backedge.
1421 DUMMY_COND is a shared cond_expr used by condition simplification as scratch,
1422 to avoid allocating memory.
1424 HANDLE_DOMINATING_ASSERTS is true if we should try to replace operands of
1425 the simplified condition with left-hand sides of ASSERT_EXPRs they are
1426 used in.
1428 STACK is used to undo temporary equivalences created during the walk of
1429 E->dest.
1431 SIMPLIFY is a pass-specific function used to simplify statements. */
1433 void
1434 thread_across_edge (gcond *dummy_cond,
1435 edge e,
1436 bool handle_dominating_asserts,
1437 vec<tree> *stack,
1438 tree (*simplify) (gimple, gimple))
1440 bitmap visited = BITMAP_ALLOC (NULL);
1441 bool backedge_seen;
1443 stmt_count = 0;
1445 vec<jump_thread_edge *> *path = new vec<jump_thread_edge *> ();
1446 bitmap_clear (visited);
1447 bitmap_set_bit (visited, e->src->index);
1448 bitmap_set_bit (visited, e->dest->index);
1449 backedge_seen = ((e->flags & EDGE_DFS_BACK) != 0);
1450 if (backedge_seen)
1451 simplify = dummy_simplify;
1453 int threaded = thread_through_normal_block (e, dummy_cond,
1454 handle_dominating_asserts,
1455 stack, simplify, path,
1456 visited, &backedge_seen);
1457 if (threaded > 0)
1459 propagate_threaded_block_debug_into (path->last ()->e->dest,
1460 e->dest);
1461 remove_temporary_equivalences (stack);
1462 BITMAP_FREE (visited);
1463 register_jump_thread (path);
1464 return;
1466 else
1468 /* Negative and zero return values indicate no threading was possible,
1469 thus there should be no edges on the thread path and no need to walk
1470 through the vector entries. */
1471 gcc_assert (path->length () == 0);
1472 path->release ();
1473 delete path;
1475 /* A negative status indicates the target block was deemed too big to
1476 duplicate. Just quit now rather than trying to use the block as
1477 a joiner in a jump threading path.
1479 This prevents unnecessary code growth, but more importantly if we
1480 do not look at all the statements in the block, then we may have
1481 missed some invalidations if we had traversed a backedge! */
1482 if (threaded < 0)
1484 BITMAP_FREE (visited);
1485 remove_temporary_equivalences (stack);
1486 return;
1490 /* We were unable to determine what out edge from E->dest is taken. However,
1491 we might still be able to thread through successors of E->dest. This
1492 often occurs when E->dest is a joiner block which then fans back out
1493 based on redundant tests.
1495 If so, we'll copy E->dest and redirect the appropriate predecessor to
1496 the copy. Within the copy of E->dest, we'll thread one or more edges
1497 to points deeper in the CFG.
1499 This is a stopgap until we have a more structured approach to path
1500 isolation. */
1502 edge taken_edge;
1503 edge_iterator ei;
1504 bool found;
1506 /* If E->dest has abnormal outgoing edges, then there's no guarantee
1507 we can safely redirect any of the edges. Just punt those cases. */
1508 FOR_EACH_EDGE (taken_edge, ei, e->dest->succs)
1509 if (taken_edge->flags & EDGE_ABNORMAL)
1511 remove_temporary_equivalences (stack);
1512 BITMAP_FREE (visited);
1513 return;
1516 /* Look at each successor of E->dest to see if we can thread through it. */
1517 FOR_EACH_EDGE (taken_edge, ei, e->dest->succs)
1519 /* Push a fresh marker so we can unwind the equivalences created
1520 for each of E->dest's successors. */
1521 stack->safe_push (NULL_TREE);
1523 /* Avoid threading to any block we have already visited. */
1524 bitmap_clear (visited);
1525 bitmap_set_bit (visited, e->src->index);
1526 bitmap_set_bit (visited, e->dest->index);
1527 bitmap_set_bit (visited, taken_edge->dest->index);
1528 vec<jump_thread_edge *> *path = new vec<jump_thread_edge *> ();
1530 /* Record whether or not we were able to thread through a successor
1531 of E->dest. */
1532 jump_thread_edge *x = new jump_thread_edge (e, EDGE_START_JUMP_THREAD);
1533 path->safe_push (x);
1535 x = new jump_thread_edge (taken_edge, EDGE_COPY_SRC_JOINER_BLOCK);
1536 path->safe_push (x);
1537 found = false;
1538 backedge_seen = ((e->flags & EDGE_DFS_BACK) != 0);
1539 backedge_seen |= ((taken_edge->flags & EDGE_DFS_BACK) != 0);
1540 if (backedge_seen)
1541 simplify = dummy_simplify;
1542 found = thread_around_empty_blocks (taken_edge,
1543 dummy_cond,
1544 handle_dominating_asserts,
1545 simplify,
1546 visited,
1547 path,
1548 &backedge_seen);
1550 if (backedge_seen)
1551 simplify = dummy_simplify;
1553 if (!found)
1554 found = thread_through_normal_block (path->last ()->e, dummy_cond,
1555 handle_dominating_asserts,
1556 stack, simplify, path, visited,
1557 &backedge_seen) > 0;
1559 /* If we were able to thread through a successor of E->dest, then
1560 record the jump threading opportunity. */
1561 if (found)
1563 propagate_threaded_block_debug_into (path->last ()->e->dest,
1564 taken_edge->dest);
1565 register_jump_thread (path);
1567 else
1569 delete_jump_thread_path (path);
1572 /* And unwind the equivalence table. */
1573 remove_temporary_equivalences (stack);
1575 BITMAP_FREE (visited);
1578 remove_temporary_equivalences (stack);