re PR tree-optimization/61515 (Extremely long compile time for generated code)
[gcc.git] / gcc / tree-ssa-threadedge.c
1 /* SSA Jump Threading
2 Copyright (C) 2005-2014 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 "tree.h"
26 #include "flags.h"
27 #include "tm_p.h"
28 #include "predict.h"
29 #include "vec.h"
30 #include "hashtab.h"
31 #include "hash-set.h"
32 #include "machmode.h"
33 #include "hard-reg-set.h"
34 #include "input.h"
35 #include "function.h"
36 #include "dominance.h"
37 #include "basic-block.h"
38 #include "cfgloop.h"
39 #include "timevar.h"
40 #include "dumpfile.h"
41 #include "tree-ssa-alias.h"
42 #include "internal-fn.h"
43 #include "gimple-expr.h"
44 #include "is-a.h"
45 #include "gimple.h"
46 #include "gimple-iterator.h"
47 #include "gimple-ssa.h"
48 #include "tree-cfg.h"
49 #include "tree-phinodes.h"
50 #include "ssa-iterators.h"
51 #include "stringpool.h"
52 #include "tree-ssanames.h"
53 #include "tree-ssa-propagate.h"
54 #include "tree-ssa-threadupdate.h"
55 #include "langhooks.h"
56 #include "params.h"
57 #include "tree-ssa-threadedge.h"
58 #include "builtins.h"
59
60 /* To avoid code explosion due to jump threading, we limit the
61 number of statements we are going to copy. This variable
62 holds the number of statements currently seen that we'll have
63 to copy as part of the jump threading process. */
64 static int stmt_count;
65
66 /* Array to record value-handles per SSA_NAME. */
67 vec<tree> ssa_name_values;
68
69 /* Set the value for the SSA name NAME to VALUE. */
70
71 void
72 set_ssa_name_value (tree name, tree value)
73 {
74 if (SSA_NAME_VERSION (name) >= ssa_name_values.length ())
75 ssa_name_values.safe_grow_cleared (SSA_NAME_VERSION (name) + 1);
76 if (value && TREE_OVERFLOW_P (value))
77 value = drop_tree_overflow (value);
78 ssa_name_values[SSA_NAME_VERSION (name)] = value;
79 }
80
81 /* Initialize the per SSA_NAME value-handles array. Returns it. */
82 void
83 threadedge_initialize_values (void)
84 {
85 gcc_assert (!ssa_name_values.exists ());
86 ssa_name_values.create (num_ssa_names);
87 }
88
89 /* Free the per SSA_NAME value-handle array. */
90 void
91 threadedge_finalize_values (void)
92 {
93 ssa_name_values.release ();
94 }
95
96 /* Return TRUE if we may be able to thread an incoming edge into
97 BB to an outgoing edge from BB. Return FALSE otherwise. */
98
99 bool
100 potentially_threadable_block (basic_block bb)
101 {
102 gimple_stmt_iterator gsi;
103
104 /* If BB has a single successor or a single predecessor, then
105 there is no threading opportunity. */
106 if (single_succ_p (bb) || single_pred_p (bb))
107 return false;
108
109 /* If BB does not end with a conditional, switch or computed goto,
110 then there is no threading opportunity. */
111 gsi = gsi_last_bb (bb);
112 if (gsi_end_p (gsi)
113 || ! gsi_stmt (gsi)
114 || (gimple_code (gsi_stmt (gsi)) != GIMPLE_COND
115 && gimple_code (gsi_stmt (gsi)) != GIMPLE_GOTO
116 && gimple_code (gsi_stmt (gsi)) != GIMPLE_SWITCH))
117 return false;
118
119 return true;
120 }
121
122 /* Return the LHS of any ASSERT_EXPR where OP appears as the first
123 argument to the ASSERT_EXPR and in which the ASSERT_EXPR dominates
124 BB. If no such ASSERT_EXPR is found, return OP. */
125
126 static tree
127 lhs_of_dominating_assert (tree op, basic_block bb, gimple stmt)
128 {
129 imm_use_iterator imm_iter;
130 gimple use_stmt;
131 use_operand_p use_p;
132
133 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, op)
134 {
135 use_stmt = USE_STMT (use_p);
136 if (use_stmt != stmt
137 && gimple_assign_single_p (use_stmt)
138 && TREE_CODE (gimple_assign_rhs1 (use_stmt)) == ASSERT_EXPR
139 && TREE_OPERAND (gimple_assign_rhs1 (use_stmt), 0) == op
140 && dominated_by_p (CDI_DOMINATORS, bb, gimple_bb (use_stmt)))
141 {
142 return gimple_assign_lhs (use_stmt);
143 }
144 }
145 return op;
146 }
147
148 /* We record temporary equivalences created by PHI nodes or
149 statements within the target block. Doing so allows us to
150 identify more jump threading opportunities, even in blocks
151 with side effects.
152
153 We keep track of those temporary equivalences in a stack
154 structure so that we can unwind them when we're done processing
155 a particular edge. This routine handles unwinding the data
156 structures. */
157
158 static void
159 remove_temporary_equivalences (vec<tree> *stack)
160 {
161 while (stack->length () > 0)
162 {
163 tree prev_value, dest;
164
165 dest = stack->pop ();
166
167 /* A NULL value indicates we should stop unwinding, otherwise
168 pop off the next entry as they're recorded in pairs. */
169 if (dest == NULL)
170 break;
171
172 prev_value = stack->pop ();
173 set_ssa_name_value (dest, prev_value);
174 }
175 }
176
177 /* Record a temporary equivalence, saving enough information so that
178 we can restore the state of recorded equivalences when we're
179 done processing the current edge. */
180
181 static void
182 record_temporary_equivalence (tree x, tree y, vec<tree> *stack)
183 {
184 tree prev_x = SSA_NAME_VALUE (x);
185
186 /* Y may be NULL if we are invalidating entries in the table. */
187 if (y && TREE_CODE (y) == SSA_NAME)
188 {
189 tree tmp = SSA_NAME_VALUE (y);
190 y = tmp ? tmp : y;
191 }
192
193 set_ssa_name_value (x, y);
194 stack->reserve (2);
195 stack->quick_push (prev_x);
196 stack->quick_push (x);
197 }
198
199 /* Record temporary equivalences created by PHIs at the target of the
200 edge E. Record unwind information for the equivalences onto STACK.
201
202 If a PHI which prevents threading is encountered, then return FALSE
203 indicating we should not thread this edge, else return TRUE.
204
205 If SRC_MAP/DST_MAP exist, then mark the source and destination SSA_NAMEs
206 of any equivalences recorded. We use this to make invalidation after
207 traversing back edges less painful. */
208
209 static bool
210 record_temporary_equivalences_from_phis (edge e, vec<tree> *stack)
211 {
212 gimple_stmt_iterator gsi;
213
214 /* Each PHI creates a temporary equivalence, record them.
215 These are context sensitive equivalences and will be removed
216 later. */
217 for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
218 {
219 gimple phi = gsi_stmt (gsi);
220 tree src = PHI_ARG_DEF_FROM_EDGE (phi, e);
221 tree dst = gimple_phi_result (phi);
222
223 /* If the desired argument is not the same as this PHI's result
224 and it is set by a PHI in E->dest, then we can not thread
225 through E->dest. */
226 if (src != dst
227 && TREE_CODE (src) == SSA_NAME
228 && gimple_code (SSA_NAME_DEF_STMT (src)) == GIMPLE_PHI
229 && gimple_bb (SSA_NAME_DEF_STMT (src)) == e->dest)
230 return false;
231
232 /* We consider any non-virtual PHI as a statement since it
233 count result in a constant assignment or copy operation. */
234 if (!virtual_operand_p (dst))
235 stmt_count++;
236
237 record_temporary_equivalence (dst, src, stack);
238 }
239 return true;
240 }
241
242 /* Fold the RHS of an assignment statement and return it as a tree.
243 May return NULL_TREE if no simplification is possible. */
244
245 static tree
246 fold_assignment_stmt (gimple stmt)
247 {
248 enum tree_code subcode = gimple_assign_rhs_code (stmt);
249
250 switch (get_gimple_rhs_class (subcode))
251 {
252 case GIMPLE_SINGLE_RHS:
253 return fold (gimple_assign_rhs1 (stmt));
254
255 case GIMPLE_UNARY_RHS:
256 {
257 tree lhs = gimple_assign_lhs (stmt);
258 tree op0 = gimple_assign_rhs1 (stmt);
259 return fold_unary (subcode, TREE_TYPE (lhs), op0);
260 }
261
262 case GIMPLE_BINARY_RHS:
263 {
264 tree lhs = gimple_assign_lhs (stmt);
265 tree op0 = gimple_assign_rhs1 (stmt);
266 tree op1 = gimple_assign_rhs2 (stmt);
267 return fold_binary (subcode, TREE_TYPE (lhs), op0, op1);
268 }
269
270 case GIMPLE_TERNARY_RHS:
271 {
272 tree lhs = gimple_assign_lhs (stmt);
273 tree op0 = gimple_assign_rhs1 (stmt);
274 tree op1 = gimple_assign_rhs2 (stmt);
275 tree op2 = gimple_assign_rhs3 (stmt);
276
277 /* Sadly, we have to handle conditional assignments specially
278 here, because fold expects all the operands of an expression
279 to be folded before the expression itself is folded, but we
280 can't just substitute the folded condition here. */
281 if (gimple_assign_rhs_code (stmt) == COND_EXPR)
282 op0 = fold (op0);
283
284 return fold_ternary (subcode, TREE_TYPE (lhs), op0, op1, op2);
285 }
286
287 default:
288 gcc_unreachable ();
289 }
290 }
291
292 /* A new value has been assigned to LHS. If necessary, invalidate any
293 equivalences that are no longer valid. This includes invaliding
294 LHS and any objects that are currently equivalent to LHS.
295
296 Finding the objects that are currently marked as equivalent to LHS
297 is a bit tricky. We could walk the ssa names and see if any have
298 SSA_NAME_VALUE that is the same as LHS. That's expensive.
299
300 However, it's far more efficient to look at the unwinding stack as
301 that will have all context sensitive equivalences which are the only
302 ones that we really have to worry about here. */
303 static void
304 invalidate_equivalences (tree lhs, vec<tree> *stack)
305 {
306
307 /* The stack is an unwinding stack. If the current element is NULL
308 then it's a "stop unwinding" marker. Else the current marker is
309 the SSA_NAME with an equivalence and the prior entry in the stack
310 is what the current element is equivalent to. */
311 for (int i = stack->length() - 1; i >= 0; i--)
312 {
313 /* Ignore the stop unwinding markers. */
314 if ((*stack)[i] == NULL)
315 continue;
316
317 /* We want to check the current value of stack[i] to see if
318 it matches LHS. If so, then invalidate. */
319 if (SSA_NAME_VALUE ((*stack)[i]) == lhs)
320 record_temporary_equivalence ((*stack)[i], NULL_TREE, stack);
321
322 /* Remember, we're dealing with two elements in this case. */
323 i--;
324 }
325
326 /* And invalidate any known value for LHS itself. */
327 if (SSA_NAME_VALUE (lhs))
328 record_temporary_equivalence (lhs, NULL_TREE, stack);
329 }
330
331 /* Try to simplify each statement in E->dest, ultimately leading to
332 a simplification of the COND_EXPR at the end of E->dest.
333
334 Record unwind information for temporary equivalences onto STACK.
335
336 Use SIMPLIFY (a pointer to a callback function) to further simplify
337 statements using pass specific information.
338
339 We might consider marking just those statements which ultimately
340 feed the COND_EXPR. It's not clear if the overhead of bookkeeping
341 would be recovered by trying to simplify fewer statements.
342
343 If we are able to simplify a statement into the form
344 SSA_NAME = (SSA_NAME | gimple invariant), then we can record
345 a context sensitive equivalence which may help us simplify
346 later statements in E->dest. */
347
348 static gimple
349 record_temporary_equivalences_from_stmts_at_dest (edge e,
350 vec<tree> *stack,
351 tree (*simplify) (gimple,
352 gimple),
353 bool backedge_seen)
354 {
355 gimple stmt = NULL;
356 gimple_stmt_iterator gsi;
357 int max_stmt_count;
358
359 max_stmt_count = PARAM_VALUE (PARAM_MAX_JUMP_THREAD_DUPLICATION_STMTS);
360
361 /* Walk through each statement in the block recording equivalences
362 we discover. Note any equivalences we discover are context
363 sensitive (ie, are dependent on traversing E) and must be unwound
364 when we're finished processing E. */
365 for (gsi = gsi_start_bb (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
366 {
367 tree cached_lhs = NULL;
368
369 stmt = gsi_stmt (gsi);
370
371 /* Ignore empty statements and labels. */
372 if (gimple_code (stmt) == GIMPLE_NOP
373 || gimple_code (stmt) == GIMPLE_LABEL
374 || is_gimple_debug (stmt))
375 continue;
376
377 /* If the statement has volatile operands, then we assume we
378 can not thread through this block. This is overly
379 conservative in some ways. */
380 if (gimple_code (stmt) == GIMPLE_ASM && gimple_asm_volatile_p (stmt))
381 return NULL;
382
383 /* If duplicating this block is going to cause too much code
384 expansion, then do not thread through this block. */
385 stmt_count++;
386 if (stmt_count > max_stmt_count)
387 return NULL;
388
389 /* If this is not a statement that sets an SSA_NAME to a new
390 value, then do not try to simplify this statement as it will
391 not simplify in any way that is helpful for jump threading. */
392 if ((gimple_code (stmt) != GIMPLE_ASSIGN
393 || TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME)
394 && (gimple_code (stmt) != GIMPLE_CALL
395 || gimple_call_lhs (stmt) == NULL_TREE
396 || TREE_CODE (gimple_call_lhs (stmt)) != SSA_NAME))
397 {
398 /* STMT might still have DEFS and we need to invalidate any known
399 equivalences for them.
400
401 Consider if STMT is a GIMPLE_ASM with one or more outputs that
402 feeds a conditional inside a loop. We might derive an equivalence
403 due to the conditional. */
404 tree op;
405 ssa_op_iter iter;
406
407 if (backedge_seen)
408 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF)
409 invalidate_equivalences (op, stack);
410
411 continue;
412 }
413
414 /* The result of __builtin_object_size depends on all the arguments
415 of a phi node. Temporarily using only one edge produces invalid
416 results. For example
417
418 if (x < 6)
419 goto l;
420 else
421 goto l;
422
423 l:
424 r = PHI <&w[2].a[1](2), &a.a[6](3)>
425 __builtin_object_size (r, 0)
426
427 The result of __builtin_object_size is defined to be the maximum of
428 remaining bytes. If we use only one edge on the phi, the result will
429 change to be the remaining bytes for the corresponding phi argument.
430
431 Similarly for __builtin_constant_p:
432
433 r = PHI <1(2), 2(3)>
434 __builtin_constant_p (r)
435
436 Both PHI arguments are constant, but x ? 1 : 2 is still not
437 constant. */
438
439 if (is_gimple_call (stmt))
440 {
441 tree fndecl = gimple_call_fndecl (stmt);
442 if (fndecl
443 && (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_OBJECT_SIZE
444 || DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CONSTANT_P))
445 {
446 if (backedge_seen)
447 {
448 tree lhs = gimple_get_lhs (stmt);
449 invalidate_equivalences (lhs, stack);
450 }
451 continue;
452 }
453 }
454
455 /* At this point we have a statement which assigns an RHS to an
456 SSA_VAR on the LHS. We want to try and simplify this statement
457 to expose more context sensitive equivalences which in turn may
458 allow us to simplify the condition at the end of the loop.
459
460 Handle simple copy operations as well as implied copies from
461 ASSERT_EXPRs. */
462 if (gimple_assign_single_p (stmt)
463 && TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME)
464 cached_lhs = gimple_assign_rhs1 (stmt);
465 else if (gimple_assign_single_p (stmt)
466 && TREE_CODE (gimple_assign_rhs1 (stmt)) == ASSERT_EXPR)
467 cached_lhs = TREE_OPERAND (gimple_assign_rhs1 (stmt), 0);
468 else
469 {
470 /* A statement that is not a trivial copy or ASSERT_EXPR.
471 We're going to temporarily copy propagate the operands
472 and see if that allows us to simplify this statement. */
473 tree *copy;
474 ssa_op_iter iter;
475 use_operand_p use_p;
476 unsigned int num, i = 0;
477
478 num = NUM_SSA_OPERANDS (stmt, (SSA_OP_USE | SSA_OP_VUSE));
479 copy = XCNEWVEC (tree, num);
480
481 /* Make a copy of the uses & vuses into USES_COPY, then cprop into
482 the operands. */
483 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE | SSA_OP_VUSE)
484 {
485 tree tmp = NULL;
486 tree use = USE_FROM_PTR (use_p);
487
488 copy[i++] = use;
489 if (TREE_CODE (use) == SSA_NAME)
490 tmp = SSA_NAME_VALUE (use);
491 if (tmp)
492 SET_USE (use_p, tmp);
493 }
494
495 /* Try to fold/lookup the new expression. Inserting the
496 expression into the hash table is unlikely to help. */
497 if (is_gimple_call (stmt))
498 cached_lhs = fold_call_stmt (stmt, false);
499 else
500 cached_lhs = fold_assignment_stmt (stmt);
501
502 if (!cached_lhs
503 || (TREE_CODE (cached_lhs) != SSA_NAME
504 && !is_gimple_min_invariant (cached_lhs)))
505 cached_lhs = (*simplify) (stmt, stmt);
506
507 /* Restore the statement's original uses/defs. */
508 i = 0;
509 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE | SSA_OP_VUSE)
510 SET_USE (use_p, copy[i++]);
511
512 free (copy);
513 }
514
515 /* Record the context sensitive equivalence if we were able
516 to simplify this statement.
517
518 If we have traversed a backedge at some point during threading,
519 then always enter something here. Either a real equivalence,
520 or a NULL_TREE equivalence which is effectively invalidation of
521 prior equivalences. */
522 if (cached_lhs
523 && (TREE_CODE (cached_lhs) == SSA_NAME
524 || is_gimple_min_invariant (cached_lhs)))
525 record_temporary_equivalence (gimple_get_lhs (stmt), cached_lhs, stack);
526 else if (backedge_seen)
527 invalidate_equivalences (gimple_get_lhs (stmt), stack);
528 }
529 return stmt;
530 }
531
532 /* Once we have passed a backedge in the CFG when threading, we do not want to
533 utilize edge equivalences for simplification purpose. They are no longer
534 necessarily valid. We use this callback rather than the ones provided by
535 DOM/VRP to achieve that effect. */
536 static tree
537 dummy_simplify (gimple stmt1 ATTRIBUTE_UNUSED, gimple stmt2 ATTRIBUTE_UNUSED)
538 {
539 return NULL_TREE;
540 }
541
542 /* Simplify the control statement at the end of the block E->dest.
543
544 To avoid allocating memory unnecessarily, a scratch GIMPLE_COND
545 is available to use/clobber in DUMMY_COND.
546
547 Use SIMPLIFY (a pointer to a callback function) to further simplify
548 a condition using pass specific information.
549
550 Return the simplified condition or NULL if simplification could
551 not be performed. */
552
553 static tree
554 simplify_control_stmt_condition (edge e,
555 gimple stmt,
556 gimple dummy_cond,
557 tree (*simplify) (gimple, gimple),
558 bool handle_dominating_asserts)
559 {
560 tree cond, cached_lhs;
561 enum gimple_code code = gimple_code (stmt);
562
563 /* For comparisons, we have to update both operands, then try
564 to simplify the comparison. */
565 if (code == GIMPLE_COND)
566 {
567 tree op0, op1;
568 enum tree_code cond_code;
569
570 op0 = gimple_cond_lhs (stmt);
571 op1 = gimple_cond_rhs (stmt);
572 cond_code = gimple_cond_code (stmt);
573
574 /* Get the current value of both operands. */
575 if (TREE_CODE (op0) == SSA_NAME)
576 {
577 for (int i = 0; i < 2; i++)
578 {
579 if (TREE_CODE (op0) == SSA_NAME
580 && SSA_NAME_VALUE (op0))
581 op0 = SSA_NAME_VALUE (op0);
582 else
583 break;
584 }
585 }
586
587 if (TREE_CODE (op1) == SSA_NAME)
588 {
589 for (int i = 0; i < 2; i++)
590 {
591 if (TREE_CODE (op1) == SSA_NAME
592 && SSA_NAME_VALUE (op1))
593 op1 = SSA_NAME_VALUE (op1);
594 else
595 break;
596 }
597 }
598
599 if (handle_dominating_asserts)
600 {
601 /* Now see if the operand was consumed by an ASSERT_EXPR
602 which dominates E->src. If so, we want to replace the
603 operand with the LHS of the ASSERT_EXPR. */
604 if (TREE_CODE (op0) == SSA_NAME)
605 op0 = lhs_of_dominating_assert (op0, e->src, stmt);
606
607 if (TREE_CODE (op1) == SSA_NAME)
608 op1 = lhs_of_dominating_assert (op1, e->src, stmt);
609 }
610
611 /* We may need to canonicalize the comparison. For
612 example, op0 might be a constant while op1 is an
613 SSA_NAME. Failure to canonicalize will cause us to
614 miss threading opportunities. */
615 if (tree_swap_operands_p (op0, op1, false))
616 {
617 tree tmp;
618 cond_code = swap_tree_comparison (cond_code);
619 tmp = op0;
620 op0 = op1;
621 op1 = tmp;
622 }
623
624 /* Stuff the operator and operands into our dummy conditional
625 expression. */
626 gimple_cond_set_code (dummy_cond, cond_code);
627 gimple_cond_set_lhs (dummy_cond, op0);
628 gimple_cond_set_rhs (dummy_cond, op1);
629
630 /* We absolutely do not care about any type conversions
631 we only care about a zero/nonzero value. */
632 fold_defer_overflow_warnings ();
633
634 cached_lhs = fold_binary (cond_code, boolean_type_node, op0, op1);
635 if (cached_lhs)
636 while (CONVERT_EXPR_P (cached_lhs))
637 cached_lhs = TREE_OPERAND (cached_lhs, 0);
638
639 fold_undefer_overflow_warnings ((cached_lhs
640 && is_gimple_min_invariant (cached_lhs)),
641 stmt, WARN_STRICT_OVERFLOW_CONDITIONAL);
642
643 /* If we have not simplified the condition down to an invariant,
644 then use the pass specific callback to simplify the condition. */
645 if (!cached_lhs
646 || !is_gimple_min_invariant (cached_lhs))
647 cached_lhs = (*simplify) (dummy_cond, stmt);
648
649 return cached_lhs;
650 }
651
652 if (code == GIMPLE_SWITCH)
653 cond = gimple_switch_index (stmt);
654 else if (code == GIMPLE_GOTO)
655 cond = gimple_goto_dest (stmt);
656 else
657 gcc_unreachable ();
658
659 /* We can have conditionals which just test the state of a variable
660 rather than use a relational operator. These are simpler to handle. */
661 if (TREE_CODE (cond) == SSA_NAME)
662 {
663 cached_lhs = cond;
664
665 /* Get the variable's current value from the equivalence chains.
666
667 It is possible to get loops in the SSA_NAME_VALUE chains
668 (consider threading the backedge of a loop where we have
669 a loop invariant SSA_NAME used in the condition. */
670 if (cached_lhs)
671 {
672 for (int i = 0; i < 2; i++)
673 {
674 if (TREE_CODE (cached_lhs) == SSA_NAME
675 && SSA_NAME_VALUE (cached_lhs))
676 cached_lhs = SSA_NAME_VALUE (cached_lhs);
677 else
678 break;
679 }
680 }
681
682 /* If we're dominated by a suitable ASSERT_EXPR, then
683 update CACHED_LHS appropriately. */
684 if (handle_dominating_asserts && TREE_CODE (cached_lhs) == SSA_NAME)
685 cached_lhs = lhs_of_dominating_assert (cached_lhs, e->src, stmt);
686
687 /* If we haven't simplified to an invariant yet, then use the
688 pass specific callback to try and simplify it further. */
689 if (cached_lhs && ! is_gimple_min_invariant (cached_lhs))
690 cached_lhs = (*simplify) (stmt, stmt);
691 }
692 else
693 cached_lhs = NULL;
694
695 return cached_lhs;
696 }
697
698 /* Copy debug stmts from DEST's chain of single predecessors up to
699 SRC, so that we don't lose the bindings as PHI nodes are introduced
700 when DEST gains new predecessors. */
701 void
702 propagate_threaded_block_debug_into (basic_block dest, basic_block src)
703 {
704 if (!MAY_HAVE_DEBUG_STMTS)
705 return;
706
707 if (!single_pred_p (dest))
708 return;
709
710 gcc_checking_assert (dest != src);
711
712 gimple_stmt_iterator gsi = gsi_after_labels (dest);
713 int i = 0;
714 const int alloc_count = 16; // ?? Should this be a PARAM?
715
716 /* Estimate the number of debug vars overridden in the beginning of
717 DEST, to tell how many we're going to need to begin with. */
718 for (gimple_stmt_iterator si = gsi;
719 i * 4 <= alloc_count * 3 && !gsi_end_p (si); gsi_next (&si))
720 {
721 gimple stmt = gsi_stmt (si);
722 if (!is_gimple_debug (stmt))
723 break;
724 i++;
725 }
726
727 auto_vec<tree, alloc_count> fewvars;
728 hash_set<tree> *vars = NULL;
729
730 /* If we're already starting with 3/4 of alloc_count, go for a
731 hash_set, otherwise start with an unordered stack-allocated
732 VEC. */
733 if (i * 4 > alloc_count * 3)
734 vars = new hash_set<tree>;
735
736 /* Now go through the initial debug stmts in DEST again, this time
737 actually inserting in VARS or FEWVARS. Don't bother checking for
738 duplicates in FEWVARS. */
739 for (gimple_stmt_iterator si = gsi; !gsi_end_p (si); gsi_next (&si))
740 {
741 gimple stmt = gsi_stmt (si);
742 if (!is_gimple_debug (stmt))
743 break;
744
745 tree var;
746
747 if (gimple_debug_bind_p (stmt))
748 var = gimple_debug_bind_get_var (stmt);
749 else if (gimple_debug_source_bind_p (stmt))
750 var = gimple_debug_source_bind_get_var (stmt);
751 else
752 gcc_unreachable ();
753
754 if (vars)
755 vars->add (var);
756 else
757 fewvars.quick_push (var);
758 }
759
760 basic_block bb = dest;
761
762 do
763 {
764 bb = single_pred (bb);
765 for (gimple_stmt_iterator si = gsi_last_bb (bb);
766 !gsi_end_p (si); gsi_prev (&si))
767 {
768 gimple stmt = gsi_stmt (si);
769 if (!is_gimple_debug (stmt))
770 continue;
771
772 tree var;
773
774 if (gimple_debug_bind_p (stmt))
775 var = gimple_debug_bind_get_var (stmt);
776 else if (gimple_debug_source_bind_p (stmt))
777 var = gimple_debug_source_bind_get_var (stmt);
778 else
779 gcc_unreachable ();
780
781 /* Discard debug bind overlaps. ??? Unlike stmts from src,
782 copied into a new block that will precede BB, debug bind
783 stmts in bypassed BBs may actually be discarded if
784 they're overwritten by subsequent debug bind stmts, which
785 might be a problem once we introduce stmt frontier notes
786 or somesuch. Adding `&& bb == src' to the condition
787 below will preserve all potentially relevant debug
788 notes. */
789 if (vars && vars->add (var))
790 continue;
791 else if (!vars)
792 {
793 int i = fewvars.length ();
794 while (i--)
795 if (fewvars[i] == var)
796 break;
797 if (i >= 0)
798 continue;
799
800 if (fewvars.length () < (unsigned) alloc_count)
801 fewvars.quick_push (var);
802 else
803 {
804 vars = new hash_set<tree>;
805 for (i = 0; i < alloc_count; i++)
806 vars->add (fewvars[i]);
807 fewvars.release ();
808 vars->add (var);
809 }
810 }
811
812 stmt = gimple_copy (stmt);
813 /* ??? Should we drop the location of the copy to denote
814 they're artificial bindings? */
815 gsi_insert_before (&gsi, stmt, GSI_NEW_STMT);
816 }
817 }
818 while (bb != src && single_pred_p (bb));
819
820 if (vars)
821 delete vars;
822 else if (fewvars.exists ())
823 fewvars.release ();
824 }
825
826 /* See if TAKEN_EDGE->dest is a threadable block with no side effecs (ie, it
827 need not be duplicated as part of the CFG/SSA updating process).
828
829 If it is threadable, add it to PATH and VISITED and recurse, ultimately
830 returning TRUE from the toplevel call. Otherwise do nothing and
831 return false.
832
833 DUMMY_COND, HANDLE_DOMINATING_ASSERTS and SIMPLIFY are used to
834 try and simplify the condition at the end of TAKEN_EDGE->dest. */
835 static bool
836 thread_around_empty_blocks (edge taken_edge,
837 gimple dummy_cond,
838 bool handle_dominating_asserts,
839 tree (*simplify) (gimple, gimple),
840 bitmap visited,
841 vec<jump_thread_edge *> *path,
842 bool *backedge_seen_p)
843 {
844 basic_block bb = taken_edge->dest;
845 gimple_stmt_iterator gsi;
846 gimple stmt;
847 tree cond;
848
849 /* The key property of these blocks is that they need not be duplicated
850 when threading. Thus they can not have visible side effects such
851 as PHI nodes. */
852 if (!gsi_end_p (gsi_start_phis (bb)))
853 return false;
854
855 /* Skip over DEBUG statements at the start of the block. */
856 gsi = gsi_start_nondebug_bb (bb);
857
858 /* If the block has no statements, but does have a single successor, then
859 it's just a forwarding block and we can thread through it trivially.
860
861 However, note that just threading through empty blocks with single
862 successors is not inherently profitable. For the jump thread to
863 be profitable, we must avoid a runtime conditional.
864
865 By taking the return value from the recursive call, we get the
866 desired effect of returning TRUE when we found a profitable jump
867 threading opportunity and FALSE otherwise.
868
869 This is particularly important when this routine is called after
870 processing a joiner block. Returning TRUE too aggressively in
871 that case results in pointless duplication of the joiner block. */
872 if (gsi_end_p (gsi))
873 {
874 if (single_succ_p (bb))
875 {
876 taken_edge = single_succ_edge (bb);
877 if (!bitmap_bit_p (visited, taken_edge->dest->index))
878 {
879 jump_thread_edge *x
880 = new jump_thread_edge (taken_edge, EDGE_NO_COPY_SRC_BLOCK);
881 path->safe_push (x);
882 bitmap_set_bit (visited, taken_edge->dest->index);
883 *backedge_seen_p |= ((taken_edge->flags & EDGE_DFS_BACK) != 0);
884 if (*backedge_seen_p)
885 simplify = dummy_simplify;
886 return thread_around_empty_blocks (taken_edge,
887 dummy_cond,
888 handle_dominating_asserts,
889 simplify,
890 visited,
891 path,
892 backedge_seen_p);
893 }
894 }
895
896 /* We have a block with no statements, but multiple successors? */
897 return false;
898 }
899
900 /* The only real statements this block can have are a control
901 flow altering statement. Anything else stops the thread. */
902 stmt = gsi_stmt (gsi);
903 if (gimple_code (stmt) != GIMPLE_COND
904 && gimple_code (stmt) != GIMPLE_GOTO
905 && gimple_code (stmt) != GIMPLE_SWITCH)
906 return false;
907
908 /* If we have traversed a backedge, then we do not want to look
909 at certain expressions in the table that can not be relied upon.
910 Luckily the only code that looked at those expressions is the
911 SIMPLIFY callback, which we replace if we can no longer use it. */
912 if (*backedge_seen_p)
913 simplify = dummy_simplify;
914
915 /* Extract and simplify the condition. */
916 cond = simplify_control_stmt_condition (taken_edge, stmt, dummy_cond,
917 simplify, handle_dominating_asserts);
918
919 /* If the condition can be statically computed and we have not already
920 visited the destination edge, then add the taken edge to our thread
921 path. */
922 if (cond && is_gimple_min_invariant (cond))
923 {
924 taken_edge = find_taken_edge (bb, cond);
925
926 if (bitmap_bit_p (visited, taken_edge->dest->index))
927 return false;
928 bitmap_set_bit (visited, taken_edge->dest->index);
929
930 jump_thread_edge *x
931 = new jump_thread_edge (taken_edge, EDGE_NO_COPY_SRC_BLOCK);
932 path->safe_push (x);
933 *backedge_seen_p |= ((taken_edge->flags & EDGE_DFS_BACK) != 0);
934 if (*backedge_seen_p)
935 simplify = dummy_simplify;
936
937 thread_around_empty_blocks (taken_edge,
938 dummy_cond,
939 handle_dominating_asserts,
940 simplify,
941 visited,
942 path,
943 backedge_seen_p);
944 return true;
945 }
946
947 return false;
948 }
949
950 /* We are exiting E->src, see if E->dest ends with a conditional
951 jump which has a known value when reached via E.
952
953 E->dest can have arbitrary side effects which, if threading is
954 successful, will be maintained.
955
956 Special care is necessary if E is a back edge in the CFG as we
957 may have already recorded equivalences for E->dest into our
958 various tables, including the result of the conditional at
959 the end of E->dest. Threading opportunities are severely
960 limited in that case to avoid short-circuiting the loop
961 incorrectly.
962
963 DUMMY_COND is a shared cond_expr used by condition simplification as scratch,
964 to avoid allocating memory.
965
966 HANDLE_DOMINATING_ASSERTS is true if we should try to replace operands of
967 the simplified condition with left-hand sides of ASSERT_EXPRs they are
968 used in.
969
970 STACK is used to undo temporary equivalences created during the walk of
971 E->dest.
972
973 SIMPLIFY is a pass-specific function used to simplify statements.
974
975 Our caller is responsible for restoring the state of the expression
976 and const_and_copies stacks.
977
978 Positive return value is success. Zero return value is failure, but
979 the block can still be duplicated as a joiner in a jump thread path,
980 negative indicates the block should not be duplicated and thus is not
981 suitable for a joiner in a jump threading path. */
982
983 static int
984 thread_through_normal_block (edge e,
985 gimple dummy_cond,
986 bool handle_dominating_asserts,
987 vec<tree> *stack,
988 tree (*simplify) (gimple, gimple),
989 vec<jump_thread_edge *> *path,
990 bitmap visited,
991 bool *backedge_seen_p)
992 {
993 /* If we have traversed a backedge, then we do not want to look
994 at certain expressions in the table that can not be relied upon.
995 Luckily the only code that looked at those expressions is the
996 SIMPLIFY callback, which we replace if we can no longer use it. */
997 if (*backedge_seen_p)
998 simplify = dummy_simplify;
999
1000 /* PHIs create temporary equivalences.
1001 Note that if we found a PHI that made the block non-threadable, then
1002 we need to bubble that up to our caller in the same manner we do
1003 when we prematurely stop processing statements below. */
1004 if (!record_temporary_equivalences_from_phis (e, stack))
1005 return -1;
1006
1007 /* Now walk each statement recording any context sensitive
1008 temporary equivalences we can detect. */
1009 gimple stmt
1010 = record_temporary_equivalences_from_stmts_at_dest (e, stack, simplify,
1011 *backedge_seen_p);
1012
1013 /* If we didn't look at all the statements, the most likely reason is
1014 there were too many and thus duplicating this block is not profitable.
1015
1016 Also note if we do not look at all the statements, then we may not
1017 have invalidated equivalences that are no longer valid if we threaded
1018 around a loop. Thus we must signal to our caller that this block
1019 is not suitable for use as a joiner in a threading path. */
1020 if (!stmt)
1021 return -1;
1022
1023 /* If we stopped at a COND_EXPR or SWITCH_EXPR, see if we know which arm
1024 will be taken. */
1025 if (gimple_code (stmt) == GIMPLE_COND
1026 || gimple_code (stmt) == GIMPLE_GOTO
1027 || gimple_code (stmt) == GIMPLE_SWITCH)
1028 {
1029 tree cond;
1030
1031 /* Extract and simplify the condition. */
1032 cond = simplify_control_stmt_condition (e, stmt, dummy_cond, simplify,
1033 handle_dominating_asserts);
1034
1035 if (cond && is_gimple_min_invariant (cond))
1036 {
1037 edge taken_edge = find_taken_edge (e->dest, cond);
1038 basic_block dest = (taken_edge ? taken_edge->dest : NULL);
1039
1040 /* DEST could be NULL for a computed jump to an absolute
1041 address. */
1042 if (dest == NULL
1043 || dest == e->dest
1044 || bitmap_bit_p (visited, dest->index))
1045 return 0;
1046
1047 /* Only push the EDGE_START_JUMP_THREAD marker if this is
1048 first edge on the path. */
1049 if (path->length () == 0)
1050 {
1051 jump_thread_edge *x
1052 = new jump_thread_edge (e, EDGE_START_JUMP_THREAD);
1053 path->safe_push (x);
1054 *backedge_seen_p |= ((e->flags & EDGE_DFS_BACK) != 0);
1055 }
1056
1057 jump_thread_edge *x
1058 = new jump_thread_edge (taken_edge, EDGE_COPY_SRC_BLOCK);
1059 path->safe_push (x);
1060 *backedge_seen_p |= ((taken_edge->flags & EDGE_DFS_BACK) != 0);
1061 if (*backedge_seen_p)
1062 simplify = dummy_simplify;
1063
1064 /* See if we can thread through DEST as well, this helps capture
1065 secondary effects of threading without having to re-run DOM or
1066 VRP.
1067
1068 We don't want to thread back to a block we have already
1069 visited. This may be overly conservative. */
1070 bitmap_set_bit (visited, dest->index);
1071 bitmap_set_bit (visited, e->dest->index);
1072 thread_around_empty_blocks (taken_edge,
1073 dummy_cond,
1074 handle_dominating_asserts,
1075 simplify,
1076 visited,
1077 path,
1078 backedge_seen_p);
1079 return 1;
1080 }
1081 }
1082 return 0;
1083 }
1084
1085 /* We are exiting E->src, see if E->dest ends with a conditional
1086 jump which has a known value when reached via E.
1087
1088 Special care is necessary if E is a back edge in the CFG as we
1089 may have already recorded equivalences for E->dest into our
1090 various tables, including the result of the conditional at
1091 the end of E->dest. Threading opportunities are severely
1092 limited in that case to avoid short-circuiting the loop
1093 incorrectly.
1094
1095 Note it is quite common for the first block inside a loop to
1096 end with a conditional which is either always true or always
1097 false when reached via the loop backedge. Thus we do not want
1098 to blindly disable threading across a loop backedge.
1099
1100 DUMMY_COND is a shared cond_expr used by condition simplification as scratch,
1101 to avoid allocating memory.
1102
1103 HANDLE_DOMINATING_ASSERTS is true if we should try to replace operands of
1104 the simplified condition with left-hand sides of ASSERT_EXPRs they are
1105 used in.
1106
1107 STACK is used to undo temporary equivalences created during the walk of
1108 E->dest.
1109
1110 SIMPLIFY is a pass-specific function used to simplify statements. */
1111
1112 void
1113 thread_across_edge (gimple dummy_cond,
1114 edge e,
1115 bool handle_dominating_asserts,
1116 vec<tree> *stack,
1117 tree (*simplify) (gimple, gimple))
1118 {
1119 bitmap visited = BITMAP_ALLOC (NULL);
1120 bool backedge_seen;
1121
1122 stmt_count = 0;
1123
1124 vec<jump_thread_edge *> *path = new vec<jump_thread_edge *> ();
1125 bitmap_clear (visited);
1126 bitmap_set_bit (visited, e->src->index);
1127 bitmap_set_bit (visited, e->dest->index);
1128 backedge_seen = ((e->flags & EDGE_DFS_BACK) != 0);
1129 if (backedge_seen)
1130 simplify = dummy_simplify;
1131
1132 int threaded = thread_through_normal_block (e, dummy_cond,
1133 handle_dominating_asserts,
1134 stack, simplify, path,
1135 visited, &backedge_seen);
1136 if (threaded > 0)
1137 {
1138 propagate_threaded_block_debug_into (path->last ()->e->dest,
1139 e->dest);
1140 remove_temporary_equivalences (stack);
1141 BITMAP_FREE (visited);
1142 register_jump_thread (path);
1143 return;
1144 }
1145 else
1146 {
1147 /* Negative and zero return values indicate no threading was possible,
1148 thus there should be no edges on the thread path and no need to walk
1149 through the vector entries. */
1150 gcc_assert (path->length () == 0);
1151 path->release ();
1152
1153 /* A negative status indicates the target block was deemed too big to
1154 duplicate. Just quit now rather than trying to use the block as
1155 a joiner in a jump threading path.
1156
1157 This prevents unnecessary code growth, but more importantly if we
1158 do not look at all the statements in the block, then we may have
1159 missed some invalidations if we had traversed a backedge! */
1160 if (threaded < 0)
1161 {
1162 BITMAP_FREE (visited);
1163 remove_temporary_equivalences (stack);
1164 return;
1165 }
1166 }
1167
1168 /* We were unable to determine what out edge from E->dest is taken. However,
1169 we might still be able to thread through successors of E->dest. This
1170 often occurs when E->dest is a joiner block which then fans back out
1171 based on redundant tests.
1172
1173 If so, we'll copy E->dest and redirect the appropriate predecessor to
1174 the copy. Within the copy of E->dest, we'll thread one or more edges
1175 to points deeper in the CFG.
1176
1177 This is a stopgap until we have a more structured approach to path
1178 isolation. */
1179 {
1180 edge taken_edge;
1181 edge_iterator ei;
1182 bool found;
1183
1184 /* If E->dest has abnormal outgoing edges, then there's no guarantee
1185 we can safely redirect any of the edges. Just punt those cases. */
1186 FOR_EACH_EDGE (taken_edge, ei, e->dest->succs)
1187 if (taken_edge->flags & EDGE_ABNORMAL)
1188 {
1189 remove_temporary_equivalences (stack);
1190 BITMAP_FREE (visited);
1191 return;
1192 }
1193
1194 /* Look at each successor of E->dest to see if we can thread through it. */
1195 FOR_EACH_EDGE (taken_edge, ei, e->dest->succs)
1196 {
1197 /* Push a fresh marker so we can unwind the equivalences created
1198 for each of E->dest's successors. */
1199 stack->safe_push (NULL_TREE);
1200
1201 /* Avoid threading to any block we have already visited. */
1202 bitmap_clear (visited);
1203 bitmap_set_bit (visited, e->src->index);
1204 bitmap_set_bit (visited, e->dest->index);
1205 bitmap_set_bit (visited, taken_edge->dest->index);
1206 vec<jump_thread_edge *> *path = new vec<jump_thread_edge *> ();
1207
1208 /* Record whether or not we were able to thread through a successor
1209 of E->dest. */
1210 jump_thread_edge *x = new jump_thread_edge (e, EDGE_START_JUMP_THREAD);
1211 path->safe_push (x);
1212
1213 x = new jump_thread_edge (taken_edge, EDGE_COPY_SRC_JOINER_BLOCK);
1214 path->safe_push (x);
1215 found = false;
1216 backedge_seen = ((e->flags & EDGE_DFS_BACK) != 0);
1217 backedge_seen |= ((taken_edge->flags & EDGE_DFS_BACK) != 0);
1218 if (backedge_seen)
1219 simplify = dummy_simplify;
1220 found = thread_around_empty_blocks (taken_edge,
1221 dummy_cond,
1222 handle_dominating_asserts,
1223 simplify,
1224 visited,
1225 path,
1226 &backedge_seen);
1227
1228 if (backedge_seen)
1229 simplify = dummy_simplify;
1230
1231 if (!found)
1232 found = thread_through_normal_block (path->last ()->e, dummy_cond,
1233 handle_dominating_asserts,
1234 stack, simplify, path, visited,
1235 &backedge_seen) > 0;
1236
1237 /* If we were able to thread through a successor of E->dest, then
1238 record the jump threading opportunity. */
1239 if (found)
1240 {
1241 propagate_threaded_block_debug_into (path->last ()->e->dest,
1242 taken_edge->dest);
1243 register_jump_thread (path);
1244 }
1245 else
1246 {
1247 delete_jump_thread_path (path);
1248 }
1249
1250 /* And unwind the equivalence table. */
1251 remove_temporary_equivalences (stack);
1252 }
1253 BITMAP_FREE (visited);
1254 }
1255
1256 remove_temporary_equivalences (stack);
1257 }