re PR tree-optimization/64823 (false "may be used uninitialized", missed jump threading)
[gcc.git] / gcc / tree-ssa-threadedge.c
1 /* SSA Jump Threading
2 Copyright (C) 2005-2015 Free Software Foundation, Inc.
3 Contributed by Jeff Law <law@redhat.com>
4
5 This file is part of GCC.
6
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.
11
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.
16
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/>. */
20
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"
68
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;
74
75 /* Array to record value-handles per SSA_NAME. */
76 vec<tree> ssa_name_values;
77
78 /* Set the value for the SSA name NAME to VALUE. */
79
80 void
81 set_ssa_name_value (tree name, tree value)
82 {
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;
88 }
89
90 /* Initialize the per SSA_NAME value-handles array. Returns it. */
91 void
92 threadedge_initialize_values (void)
93 {
94 gcc_assert (!ssa_name_values.exists ());
95 ssa_name_values.create (num_ssa_names);
96 }
97
98 /* Free the per SSA_NAME value-handle array. */
99 void
100 threadedge_finalize_values (void)
101 {
102 ssa_name_values.release ();
103 }
104
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. */
107
108 bool
109 potentially_threadable_block (basic_block bb)
110 {
111 gimple_stmt_iterator gsi;
112
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;
121
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;
126
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;
136
137 return true;
138 }
139
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. */
143
144 static tree
145 lhs_of_dominating_assert (tree op, basic_block bb, gimple stmt)
146 {
147 imm_use_iterator imm_iter;
148 gimple use_stmt;
149 use_operand_p use_p;
150
151 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, op)
152 {
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)))
159 {
160 return gimple_assign_lhs (use_stmt);
161 }
162 }
163 return op;
164 }
165
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.
170
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. */
175
176 static void
177 remove_temporary_equivalences (vec<tree> *stack)
178 {
179 while (stack->length () > 0)
180 {
181 tree prev_value, dest;
182
183 dest = stack->pop ();
184
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;
189
190 prev_value = stack->pop ();
191 set_ssa_name_value (dest, prev_value);
192 }
193 }
194
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. */
198
199 static void
200 record_temporary_equivalence (tree x, tree y, vec<tree> *stack)
201 {
202 tree prev_x = SSA_NAME_VALUE (x);
203
204 /* Y may be NULL if we are invalidating entries in the table. */
205 if (y && TREE_CODE (y) == SSA_NAME)
206 {
207 tree tmp = SSA_NAME_VALUE (y);
208 y = tmp ? tmp : y;
209 }
210
211 set_ssa_name_value (x, y);
212 stack->reserve (2);
213 stack->quick_push (prev_x);
214 stack->quick_push (x);
215 }
216
217 /* Record temporary equivalences created by PHIs at the target of the
218 edge E. Record unwind information for the equivalences onto STACK.
219
220 If a PHI which prevents threading is encountered, then return FALSE
221 indicating we should not thread this edge, else return TRUE.
222
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. */
226
227 static bool
228 record_temporary_equivalences_from_phis (edge e, vec<tree> *stack)
229 {
230 gphi_iterator gsi;
231
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))
236 {
237 gphi *phi = gsi.phi ();
238 tree src = PHI_ARG_DEF_FROM_EDGE (phi, e);
239 tree dst = gimple_phi_result (phi);
240
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;
249
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++;
254
255 record_temporary_equivalence (dst, src, stack);
256 }
257 return true;
258 }
259
260 /* Fold the RHS of an assignment statement and return it as a tree.
261 May return NULL_TREE if no simplification is possible. */
262
263 static tree
264 fold_assignment_stmt (gimple stmt)
265 {
266 enum tree_code subcode = gimple_assign_rhs_code (stmt);
267
268 switch (get_gimple_rhs_class (subcode))
269 {
270 case GIMPLE_SINGLE_RHS:
271 return fold (gimple_assign_rhs1 (stmt));
272
273 case GIMPLE_UNARY_RHS:
274 {
275 tree lhs = gimple_assign_lhs (stmt);
276 tree op0 = gimple_assign_rhs1 (stmt);
277 return fold_unary (subcode, TREE_TYPE (lhs), op0);
278 }
279
280 case GIMPLE_BINARY_RHS:
281 {
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);
286 }
287
288 case GIMPLE_TERNARY_RHS:
289 {
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);
294
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);
301
302 return fold_ternary (subcode, TREE_TYPE (lhs), op0, op1, op2);
303 }
304
305 default:
306 gcc_unreachable ();
307 }
308 }
309
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.
313
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.
317
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)
323 {
324
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--)
330 {
331 /* Ignore the stop unwinding markers. */
332 if ((*stack)[i] == NULL)
333 continue;
334
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);
339
340 /* Remember, we're dealing with two elements in this case. */
341 i--;
342 }
343
344 /* And invalidate any known value for LHS itself. */
345 if (SSA_NAME_VALUE (lhs))
346 record_temporary_equivalence (lhs, NULL_TREE, stack);
347 }
348
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.
351
352 Record unwind information for temporary equivalences onto STACK.
353
354 Use SIMPLIFY (a pointer to a callback function) to further simplify
355 statements using pass specific information.
356
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.
360
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. */
365
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)
372 {
373 gimple stmt = NULL;
374 gimple_stmt_iterator gsi;
375 int max_stmt_count;
376
377 max_stmt_count = PARAM_VALUE (PARAM_MAX_JUMP_THREAD_DUPLICATION_STMTS);
378
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))
384 {
385 tree cached_lhs = NULL;
386
387 stmt = gsi_stmt (gsi);
388
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;
394
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;
401
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;
407
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))
416 {
417 /* STMT might still have DEFS and we need to invalidate any known
418 equivalences for them.
419
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;
425
426 if (backedge_seen)
427 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF)
428 invalidate_equivalences (op, stack);
429
430 continue;
431 }
432
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
436
437 if (x < 6)
438 goto l;
439 else
440 goto l;
441
442 l:
443 r = PHI <&w[2].a[1](2), &a.a[6](3)>
444 __builtin_object_size (r, 0)
445
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.
449
450 Similarly for __builtin_constant_p:
451
452 r = PHI <1(2), 2(3)>
453 __builtin_constant_p (r)
454
455 Both PHI arguments are constant, but x ? 1 : 2 is still not
456 constant. */
457
458 if (is_gimple_call (stmt))
459 {
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))
464 {
465 if (backedge_seen)
466 {
467 tree lhs = gimple_get_lhs (stmt);
468 invalidate_equivalences (lhs, stack);
469 }
470 continue;
471 }
472 }
473
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.
478
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
488 {
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;
496
497 num = NUM_SSA_OPERANDS (stmt, (SSA_OP_USE | SSA_OP_VUSE));
498 copy = XCNEWVEC (tree, num);
499
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)
503 {
504 tree tmp = NULL;
505 tree use = USE_FROM_PTR (use_p);
506
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);
512 }
513
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);
520
521 if (!cached_lhs
522 || (TREE_CODE (cached_lhs) != SSA_NAME
523 && !is_gimple_min_invariant (cached_lhs)))
524 cached_lhs = (*simplify) (stmt, stmt);
525
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++]);
530
531 free (copy);
532 }
533
534 /* Record the context sensitive equivalence if we were able
535 to simplify this statement.
536
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);
547 }
548 return stmt;
549 }
550
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)
557 {
558 return NULL_TREE;
559 }
560
561 /* Simplify the control statement at the end of the block E->dest.
562
563 To avoid allocating memory unnecessarily, a scratch GIMPLE_COND
564 is available to use/clobber in DUMMY_COND.
565
566 Use SIMPLIFY (a pointer to a callback function) to further simplify
567 a condition using pass specific information.
568
569 Return the simplified condition or NULL if simplification could
570 not be performed. */
571
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)
578 {
579 tree cond, cached_lhs;
580 enum gimple_code code = gimple_code (stmt);
581
582 /* For comparisons, we have to update both operands, then try
583 to simplify the comparison. */
584 if (code == GIMPLE_COND)
585 {
586 tree op0, op1;
587 enum tree_code cond_code;
588
589 op0 = gimple_cond_lhs (stmt);
590 op1 = gimple_cond_rhs (stmt);
591 cond_code = gimple_cond_code (stmt);
592
593 /* Get the current value of both operands. */
594 if (TREE_CODE (op0) == SSA_NAME)
595 {
596 for (int i = 0; i < 2; i++)
597 {
598 if (TREE_CODE (op0) == SSA_NAME
599 && SSA_NAME_VALUE (op0))
600 op0 = SSA_NAME_VALUE (op0);
601 else
602 break;
603 }
604 }
605
606 if (TREE_CODE (op1) == SSA_NAME)
607 {
608 for (int i = 0; i < 2; i++)
609 {
610 if (TREE_CODE (op1) == SSA_NAME
611 && SSA_NAME_VALUE (op1))
612 op1 = SSA_NAME_VALUE (op1);
613 else
614 break;
615 }
616 }
617
618 if (handle_dominating_asserts)
619 {
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);
625
626 if (TREE_CODE (op1) == SSA_NAME)
627 op1 = lhs_of_dominating_assert (op1, e->src, stmt);
628 }
629
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))
635 {
636 tree tmp;
637 cond_code = swap_tree_comparison (cond_code);
638 tmp = op0;
639 op0 = op1;
640 op1 = tmp;
641 }
642
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);
648
649 /* We absolutely do not care about any type conversions
650 we only care about a zero/nonzero value. */
651 fold_defer_overflow_warnings ();
652
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);
657
658 fold_undefer_overflow_warnings ((cached_lhs
659 && is_gimple_min_invariant (cached_lhs)),
660 stmt, WARN_STRICT_OVERFLOW_CONDITIONAL);
661
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);
667
668 return cached_lhs;
669 }
670
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 ();
677
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)
681 {
682 tree original_lhs = cond;
683 cached_lhs = cond;
684
685 /* Get the variable's current value from the equivalence chains.
686
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)
691 {
692 for (int i = 0; i < 2; i++)
693 {
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;
699 }
700 }
701
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);
706
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);
711
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;
717 }
718 else
719 cached_lhs = NULL;
720
721 return cached_lhs;
722 }
723
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)
729 {
730 if (!MAY_HAVE_DEBUG_STMTS)
731 return;
732
733 if (!single_pred_p (dest))
734 return;
735
736 gcc_checking_assert (dest != src);
737
738 gimple_stmt_iterator gsi = gsi_after_labels (dest);
739 int i = 0;
740 const int alloc_count = 16; // ?? Should this be a PARAM?
741
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))
746 {
747 gimple stmt = gsi_stmt (si);
748 if (!is_gimple_debug (stmt))
749 break;
750 i++;
751 }
752
753 auto_vec<tree, alloc_count> fewvars;
754 hash_set<tree> *vars = NULL;
755
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>;
761
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))
766 {
767 gimple stmt = gsi_stmt (si);
768 if (!is_gimple_debug (stmt))
769 break;
770
771 tree var;
772
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 ();
779
780 if (vars)
781 vars->add (var);
782 else
783 fewvars.quick_push (var);
784 }
785
786 basic_block bb = dest;
787
788 do
789 {
790 bb = single_pred (bb);
791 for (gimple_stmt_iterator si = gsi_last_bb (bb);
792 !gsi_end_p (si); gsi_prev (&si))
793 {
794 gimple stmt = gsi_stmt (si);
795 if (!is_gimple_debug (stmt))
796 continue;
797
798 tree var;
799
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 ();
806
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)
818 {
819 int i = fewvars.length ();
820 while (i--)
821 if (fewvars[i] == var)
822 break;
823 if (i >= 0)
824 continue;
825
826 if (fewvars.length () < (unsigned) alloc_count)
827 fewvars.quick_push (var);
828 else
829 {
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);
835 }
836 }
837
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);
842 }
843 }
844 while (bb != src && single_pred_p (bb));
845
846 if (vars)
847 delete vars;
848 else if (fewvars.exists ())
849 fewvars.release ();
850 }
851
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).
854
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.
858
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)
869 {
870 basic_block bb = taken_edge->dest;
871 gimple_stmt_iterator gsi;
872 gimple stmt;
873 tree cond;
874
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;
880
881 /* Skip over DEBUG statements at the start of the block. */
882 gsi = gsi_start_nondebug_bb (bb);
883
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.
886
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.
890
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.
894
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))
899 {
900 if (single_succ_p (bb))
901 {
902 taken_edge = single_succ_edge (bb);
903 if (!bitmap_bit_p (visited, taken_edge->dest->index))
904 {
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);
919 }
920 }
921
922 /* We have a block with no statements, but multiple successors? */
923 return false;
924 }
925
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;
933
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;
940
941 /* Extract and simplify the condition. */
942 cond = simplify_control_stmt_condition (taken_edge, stmt, dummy_cond,
943 simplify, handle_dominating_asserts);
944
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))
949 {
950 taken_edge = find_taken_edge (bb, cond);
951
952 if (bitmap_bit_p (visited, taken_edge->dest->index))
953 return false;
954 bitmap_set_bit (visited, taken_edge->dest->index);
955
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;
962
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;
971 }
972
973 return false;
974 }
975
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. */
980
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)
985 {
986 if (loop != start_bb->loop_father)
987 return false;
988
989 if (start_bb == end_bb)
990 {
991 vec_safe_push (path, start_bb);
992 return true;
993 }
994
995 if (!visited_bbs->add (start_bb))
996 {
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))
1001 {
1002 vec_safe_push (path, start_bb);
1003 return true;
1004 }
1005 }
1006
1007 return false;
1008 }
1009
1010 static int max_threaded_paths;
1011
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. */
1015
1016 static void
1017 fsm_find_control_statement_thread_paths (tree expr,
1018 hash_set<gimple> *visited_phis,
1019 vec<basic_block, va_gc> *&path,
1020 bool seen_loop_phi)
1021 {
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);
1025
1026 if (var == NULL || var_bb == NULL)
1027 return;
1028
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;
1035
1036 /* Avoid infinite recursion. */
1037 if (visited_phis->add (def_stmt))
1038 return;
1039
1040 gphi *phi = as_a <gphi *> (def_stmt);
1041 int next_path_length = 0;
1042 basic_block last_bb_in_path = path->last ();
1043
1044 if (loop_containing_stmt (phi)->header == gimple_bb (phi))
1045 {
1046 /* Do not walk through more than one loop PHI node. */
1047 if (seen_loop_phi)
1048 return;
1049 seen_loop_phi = true;
1050 }
1051
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)
1056 {
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));
1062
1063 FOR_EACH_EDGE (e, ei, last_bb_in_path->preds)
1064 {
1065 hash_set<basic_block> *visited_bbs = new hash_set<basic_block>;
1066
1067 if (fsm_find_thread_path (var_bb, e->src, next_path, visited_bbs,
1068 e->src->loop_father))
1069 ++e_count;
1070
1071 delete visited_bbs;
1072
1073 /* If there is more than one path, stop. */
1074 if (e_count > 1)
1075 {
1076 vec_free (next_path);
1077 return;
1078 }
1079 }
1080
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)
1084 {
1085 vec_free (next_path);
1086 return;
1087 }
1088
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);
1093 }
1094
1095 gcc_assert (path->last () == var_bb);
1096
1097 /* Iterate over the arguments of PHI. */
1098 unsigned int i;
1099 for (i = 0; i < gimple_phi_num_args (phi); i++)
1100 {
1101 tree arg = gimple_phi_arg_def (phi, i);
1102 basic_block bbi = gimple_phi_arg_edge (phi, i)->src;
1103
1104 /* Skip edges pointing outside the current loop. */
1105 if (!arg || var_bb->loop_father != bbi->loop_father)
1106 continue;
1107
1108 if (TREE_CODE (arg) == SSA_NAME)
1109 {
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_phis, path,
1113 seen_loop_phi);
1114
1115 path->pop ();
1116 continue;
1117 }
1118
1119 if (TREE_CODE (arg) != INTEGER_CST)
1120 continue;
1121
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;
1126
1127 if (path_length > PARAM_VALUE (PARAM_MAX_FSM_THREAD_LENGTH))
1128 {
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;
1134 }
1135
1136 if (max_threaded_paths <= 0)
1137 {
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;
1143 }
1144
1145 /* Add BBI to the path. */
1146 vec_safe_push (path, bbi);
1147 ++path_length;
1148
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;
1154
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++)
1160 {
1161 basic_block bb = (*path)[j];
1162
1163 if (bb->loop_father != loop)
1164 {
1165 path_crosses_loops = true;
1166 break;
1167 }
1168
1169 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1170 {
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;
1177 }
1178 }
1179
1180 if (path_crosses_loops)
1181 {
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;
1187 }
1188
1189 if (n_insns >= PARAM_VALUE (PARAM_MAX_FSM_THREAD_PATH_INSNS))
1190 {
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;
1197 }
1198
1199 vec<jump_thread_edge *> *jump_thread_path
1200 = new vec<jump_thread_edge *> ();
1201
1202 /* Record the edges between the blocks in PATH. */
1203 for (j = 0; j < path_length - 1; j++)
1204 {
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);
1210 }
1211
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);
1217
1218 register_jump_thread (jump_thread_path);
1219 --max_threaded_paths;
1220
1221 /* Remove BBI from the path. */
1222 path->pop ();
1223 }
1224
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));
1228 }
1229
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.
1232
1233 E->dest can have arbitrary side effects which, if threading is
1234 successful, will be maintained.
1235
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.
1242
1243 DUMMY_COND is a shared cond_expr used by condition simplification as scratch,
1244 to avoid allocating memory.
1245
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.
1249
1250 STACK is used to undo temporary equivalences created during the walk of
1251 E->dest.
1252
1253 SIMPLIFY is a pass-specific function used to simplify statements.
1254
1255 Our caller is responsible for restoring the state of the expression
1256 and const_and_copies stacks.
1257
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. */
1262
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)
1272 {
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;
1279
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;
1286
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);
1292
1293 /* There's two reasons STMT might be null, and distinguishing
1294 between them is important.
1295
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.
1300
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)
1308 {
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;
1314
1315 /* Second case. */
1316 return -1;
1317 }
1318
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)
1324 {
1325 tree cond;
1326
1327 /* Extract and simplify the condition. */
1328 cond = simplify_control_stmt_condition (e, stmt, dummy_cond, simplify,
1329 handle_dominating_asserts);
1330
1331 if (!cond)
1332 return 0;
1333
1334 if (is_gimple_min_invariant (cond))
1335 {
1336 edge taken_edge = find_taken_edge (e->dest, cond);
1337 basic_block dest = (taken_edge ? taken_edge->dest : NULL);
1338
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;
1345
1346 /* Only push the EDGE_START_JUMP_THREAD marker if this is
1347 first edge on the path. */
1348 if (path->length () == 0)
1349 {
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);
1354 }
1355
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;
1362
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.
1366
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;
1379 }
1380
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;
1387
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<gimple> *visited_phis = new hash_set<gimple>;
1395
1396 max_threaded_paths = PARAM_VALUE (PARAM_MAX_FSM_THREAD_PATHS);
1397 fsm_find_control_statement_thread_paths (cond, visited_phis, bb_path,
1398 false);
1399
1400 delete visited_phis;
1401 vec_free (bb_path);
1402 }
1403 return 0;
1404 }
1405
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.
1408
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.
1415
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.
1420
1421 DUMMY_COND is a shared cond_expr used by condition simplification as scratch,
1422 to avoid allocating memory.
1423
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.
1427
1428 STACK is used to undo temporary equivalences created during the walk of
1429 E->dest.
1430
1431 SIMPLIFY is a pass-specific function used to simplify statements. */
1432
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))
1439 {
1440 bitmap visited = BITMAP_ALLOC (NULL);
1441 bool backedge_seen;
1442
1443 stmt_count = 0;
1444
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;
1452
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)
1458 {
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;
1465 }
1466 else
1467 {
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;
1474
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.
1478
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)
1483 {
1484 BITMAP_FREE (visited);
1485 remove_temporary_equivalences (stack);
1486 return;
1487 }
1488 }
1489
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.
1494
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.
1498
1499 This is a stopgap until we have a more structured approach to path
1500 isolation. */
1501 {
1502 edge taken_edge;
1503 edge_iterator ei;
1504 bool found;
1505
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)
1510 {
1511 remove_temporary_equivalences (stack);
1512 BITMAP_FREE (visited);
1513 return;
1514 }
1515
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)
1518 {
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);
1522
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 *> ();
1529
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);
1534
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);
1549
1550 if (backedge_seen)
1551 simplify = dummy_simplify;
1552
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;
1558
1559 /* If we were able to thread through a successor of E->dest, then
1560 record the jump threading opportunity. */
1561 if (found)
1562 {
1563 propagate_threaded_block_debug_into (path->last ()->e->dest,
1564 taken_edge->dest);
1565 register_jump_thread (path);
1566 }
1567 else
1568 {
1569 delete_jump_thread_path (path);
1570 }
1571
1572 /* And unwind the equivalence table. */
1573 remove_temporary_equivalences (stack);
1574 }
1575 BITMAP_FREE (visited);
1576 }
1577
1578 remove_temporary_equivalences (stack);
1579 }