Index declspecs.locations by ds_typedef rather than ds_thread.
[gcc.git] / gcc / tree-ssa-dom.c
1 /* SSA Dominator optimizations for trees
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
3 Free Software Foundation, Inc.
4 Contributed by Diego Novillo <dnovillo@redhat.com>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "flags.h"
28 #include "tm_p.h"
29 #include "basic-block.h"
30 #include "cfgloop.h"
31 #include "function.h"
32 #include "gimple-pretty-print.h"
33 #include "tree-flow.h"
34 #include "domwalk.h"
35 #include "tree-pass.h"
36 #include "tree-ssa-propagate.h"
37 #include "langhooks.h"
38 #include "params.h"
39
40 /* This file implements optimizations on the dominator tree. */
41
42 /* Representation of a "naked" right-hand-side expression, to be used
43 in recording available expressions in the expression hash table. */
44
45 enum expr_kind
46 {
47 EXPR_SINGLE,
48 EXPR_UNARY,
49 EXPR_BINARY,
50 EXPR_TERNARY,
51 EXPR_CALL,
52 EXPR_PHI
53 };
54
55 struct hashable_expr
56 {
57 tree type;
58 enum expr_kind kind;
59 union {
60 struct { tree rhs; } single;
61 struct { enum tree_code op; tree opnd; } unary;
62 struct { enum tree_code op; tree opnd0, opnd1; } binary;
63 struct { enum tree_code op; tree opnd0, opnd1, opnd2; } ternary;
64 struct { gimple fn_from; bool pure; size_t nargs; tree *args; } call;
65 struct { size_t nargs; tree *args; } phi;
66 } ops;
67 };
68
69 /* Structure for recording known values of a conditional expression
70 at the exits from its block. */
71
72 typedef struct cond_equivalence_s
73 {
74 struct hashable_expr cond;
75 tree value;
76 } cond_equivalence;
77
78 DEF_VEC_O(cond_equivalence);
79 DEF_VEC_ALLOC_O(cond_equivalence,heap);
80
81 /* Structure for recording edge equivalences as well as any pending
82 edge redirections during the dominator optimizer.
83
84 Computing and storing the edge equivalences instead of creating
85 them on-demand can save significant amounts of time, particularly
86 for pathological cases involving switch statements.
87
88 These structures live for a single iteration of the dominator
89 optimizer in the edge's AUX field. At the end of an iteration we
90 free each of these structures and update the AUX field to point
91 to any requested redirection target (the code for updating the
92 CFG and SSA graph for edge redirection expects redirection edge
93 targets to be in the AUX field for each edge. */
94
95 struct edge_info
96 {
97 /* If this edge creates a simple equivalence, the LHS and RHS of
98 the equivalence will be stored here. */
99 tree lhs;
100 tree rhs;
101
102 /* Traversing an edge may also indicate one or more particular conditions
103 are true or false. */
104 VEC(cond_equivalence, heap) *cond_equivalences;
105 };
106
107 /* Hash table with expressions made available during the renaming process.
108 When an assignment of the form X_i = EXPR is found, the statement is
109 stored in this table. If the same expression EXPR is later found on the
110 RHS of another statement, it is replaced with X_i (thus performing
111 global redundancy elimination). Similarly as we pass through conditionals
112 we record the conditional itself as having either a true or false value
113 in this table. */
114 static htab_t avail_exprs;
115
116 /* Stack of available expressions in AVAIL_EXPRs. Each block pushes any
117 expressions it enters into the hash table along with a marker entry
118 (null). When we finish processing the block, we pop off entries and
119 remove the expressions from the global hash table until we hit the
120 marker. */
121 typedef struct expr_hash_elt * expr_hash_elt_t;
122 DEF_VEC_P(expr_hash_elt_t);
123 DEF_VEC_ALLOC_P(expr_hash_elt_t,heap);
124
125 static VEC(expr_hash_elt_t,heap) *avail_exprs_stack;
126
127 /* Structure for entries in the expression hash table. */
128
129 struct expr_hash_elt
130 {
131 /* The value (lhs) of this expression. */
132 tree lhs;
133
134 /* The expression (rhs) we want to record. */
135 struct hashable_expr expr;
136
137 /* The stmt pointer if this element corresponds to a statement. */
138 gimple stmt;
139
140 /* The hash value for RHS. */
141 hashval_t hash;
142
143 /* A unique stamp, typically the address of the hash
144 element itself, used in removing entries from the table. */
145 struct expr_hash_elt *stamp;
146 };
147
148 /* Stack of dest,src pairs that need to be restored during finalization.
149
150 A NULL entry is used to mark the end of pairs which need to be
151 restored during finalization of this block. */
152 static VEC(tree,heap) *const_and_copies_stack;
153
154 /* Track whether or not we have changed the control flow graph. */
155 static bool cfg_altered;
156
157 /* Bitmap of blocks that have had EH statements cleaned. We should
158 remove their dead edges eventually. */
159 static bitmap need_eh_cleanup;
160
161 /* Statistics for dominator optimizations. */
162 struct opt_stats_d
163 {
164 long num_stmts;
165 long num_exprs_considered;
166 long num_re;
167 long num_const_prop;
168 long num_copy_prop;
169 };
170
171 static struct opt_stats_d opt_stats;
172
173 /* Local functions. */
174 static void optimize_stmt (basic_block, gimple_stmt_iterator);
175 static tree lookup_avail_expr (gimple, bool);
176 static hashval_t avail_expr_hash (const void *);
177 static hashval_t real_avail_expr_hash (const void *);
178 static int avail_expr_eq (const void *, const void *);
179 static void htab_statistics (FILE *, htab_t);
180 static void record_cond (cond_equivalence *);
181 static void record_const_or_copy (tree, tree);
182 static void record_equality (tree, tree);
183 static void record_equivalences_from_phis (basic_block);
184 static void record_equivalences_from_incoming_edge (basic_block);
185 static void eliminate_redundant_computations (gimple_stmt_iterator *);
186 static void record_equivalences_from_stmt (gimple, int);
187 static void dom_thread_across_edge (struct dom_walk_data *, edge);
188 static void dom_opt_leave_block (struct dom_walk_data *, basic_block);
189 static void dom_opt_enter_block (struct dom_walk_data *, basic_block);
190 static void remove_local_expressions_from_table (void);
191 static void restore_vars_to_original_value (void);
192 static edge single_incoming_edge_ignoring_loop_edges (basic_block);
193
194
195 /* Given a statement STMT, initialize the hash table element pointed to
196 by ELEMENT. */
197
198 static void
199 initialize_hash_element (gimple stmt, tree lhs,
200 struct expr_hash_elt *element)
201 {
202 enum gimple_code code = gimple_code (stmt);
203 struct hashable_expr *expr = &element->expr;
204
205 if (code == GIMPLE_ASSIGN)
206 {
207 enum tree_code subcode = gimple_assign_rhs_code (stmt);
208
209 switch (get_gimple_rhs_class (subcode))
210 {
211 case GIMPLE_SINGLE_RHS:
212 expr->kind = EXPR_SINGLE;
213 expr->type = TREE_TYPE (gimple_assign_rhs1 (stmt));
214 expr->ops.single.rhs = gimple_assign_rhs1 (stmt);
215 break;
216 case GIMPLE_UNARY_RHS:
217 expr->kind = EXPR_UNARY;
218 expr->type = TREE_TYPE (gimple_assign_lhs (stmt));
219 expr->ops.unary.op = subcode;
220 expr->ops.unary.opnd = gimple_assign_rhs1 (stmt);
221 break;
222 case GIMPLE_BINARY_RHS:
223 expr->kind = EXPR_BINARY;
224 expr->type = TREE_TYPE (gimple_assign_lhs (stmt));
225 expr->ops.binary.op = subcode;
226 expr->ops.binary.opnd0 = gimple_assign_rhs1 (stmt);
227 expr->ops.binary.opnd1 = gimple_assign_rhs2 (stmt);
228 break;
229 case GIMPLE_TERNARY_RHS:
230 expr->kind = EXPR_TERNARY;
231 expr->type = TREE_TYPE (gimple_assign_lhs (stmt));
232 expr->ops.ternary.op = subcode;
233 expr->ops.ternary.opnd0 = gimple_assign_rhs1 (stmt);
234 expr->ops.ternary.opnd1 = gimple_assign_rhs2 (stmt);
235 expr->ops.ternary.opnd2 = gimple_assign_rhs3 (stmt);
236 break;
237 default:
238 gcc_unreachable ();
239 }
240 }
241 else if (code == GIMPLE_COND)
242 {
243 expr->type = boolean_type_node;
244 expr->kind = EXPR_BINARY;
245 expr->ops.binary.op = gimple_cond_code (stmt);
246 expr->ops.binary.opnd0 = gimple_cond_lhs (stmt);
247 expr->ops.binary.opnd1 = gimple_cond_rhs (stmt);
248 }
249 else if (code == GIMPLE_CALL)
250 {
251 size_t nargs = gimple_call_num_args (stmt);
252 size_t i;
253
254 gcc_assert (gimple_call_lhs (stmt));
255
256 expr->type = TREE_TYPE (gimple_call_lhs (stmt));
257 expr->kind = EXPR_CALL;
258 expr->ops.call.fn_from = stmt;
259
260 if (gimple_call_flags (stmt) & (ECF_CONST | ECF_PURE))
261 expr->ops.call.pure = true;
262 else
263 expr->ops.call.pure = false;
264
265 expr->ops.call.nargs = nargs;
266 expr->ops.call.args = XCNEWVEC (tree, nargs);
267 for (i = 0; i < nargs; i++)
268 expr->ops.call.args[i] = gimple_call_arg (stmt, i);
269 }
270 else if (code == GIMPLE_SWITCH)
271 {
272 expr->type = TREE_TYPE (gimple_switch_index (stmt));
273 expr->kind = EXPR_SINGLE;
274 expr->ops.single.rhs = gimple_switch_index (stmt);
275 }
276 else if (code == GIMPLE_GOTO)
277 {
278 expr->type = TREE_TYPE (gimple_goto_dest (stmt));
279 expr->kind = EXPR_SINGLE;
280 expr->ops.single.rhs = gimple_goto_dest (stmt);
281 }
282 else if (code == GIMPLE_PHI)
283 {
284 size_t nargs = gimple_phi_num_args (stmt);
285 size_t i;
286
287 expr->type = TREE_TYPE (gimple_phi_result (stmt));
288 expr->kind = EXPR_PHI;
289 expr->ops.phi.nargs = nargs;
290 expr->ops.phi.args = XCNEWVEC (tree, nargs);
291
292 for (i = 0; i < nargs; i++)
293 expr->ops.phi.args[i] = gimple_phi_arg_def (stmt, i);
294 }
295 else
296 gcc_unreachable ();
297
298 element->lhs = lhs;
299 element->stmt = stmt;
300 element->hash = avail_expr_hash (element);
301 element->stamp = element;
302 }
303
304 /* Given a conditional expression COND as a tree, initialize
305 a hashable_expr expression EXPR. The conditional must be a
306 comparison or logical negation. A constant or a variable is
307 not permitted. */
308
309 static void
310 initialize_expr_from_cond (tree cond, struct hashable_expr *expr)
311 {
312 expr->type = boolean_type_node;
313
314 if (COMPARISON_CLASS_P (cond))
315 {
316 expr->kind = EXPR_BINARY;
317 expr->ops.binary.op = TREE_CODE (cond);
318 expr->ops.binary.opnd0 = TREE_OPERAND (cond, 0);
319 expr->ops.binary.opnd1 = TREE_OPERAND (cond, 1);
320 }
321 else if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
322 {
323 expr->kind = EXPR_UNARY;
324 expr->ops.unary.op = TRUTH_NOT_EXPR;
325 expr->ops.unary.opnd = TREE_OPERAND (cond, 0);
326 }
327 else
328 gcc_unreachable ();
329 }
330
331 /* Given a hashable_expr expression EXPR and an LHS,
332 initialize the hash table element pointed to by ELEMENT. */
333
334 static void
335 initialize_hash_element_from_expr (struct hashable_expr *expr,
336 tree lhs,
337 struct expr_hash_elt *element)
338 {
339 element->expr = *expr;
340 element->lhs = lhs;
341 element->stmt = NULL;
342 element->hash = avail_expr_hash (element);
343 element->stamp = element;
344 }
345
346 /* Compare two hashable_expr structures for equivalence.
347 They are considered equivalent when the the expressions
348 they denote must necessarily be equal. The logic is intended
349 to follow that of operand_equal_p in fold-const.c */
350
351 static bool
352 hashable_expr_equal_p (const struct hashable_expr *expr0,
353 const struct hashable_expr *expr1)
354 {
355 tree type0 = expr0->type;
356 tree type1 = expr1->type;
357
358 /* If either type is NULL, there is nothing to check. */
359 if ((type0 == NULL_TREE) ^ (type1 == NULL_TREE))
360 return false;
361
362 /* If both types don't have the same signedness, precision, and mode,
363 then we can't consider them equal. */
364 if (type0 != type1
365 && (TREE_CODE (type0) == ERROR_MARK
366 || TREE_CODE (type1) == ERROR_MARK
367 || TYPE_UNSIGNED (type0) != TYPE_UNSIGNED (type1)
368 || TYPE_PRECISION (type0) != TYPE_PRECISION (type1)
369 || TYPE_MODE (type0) != TYPE_MODE (type1)))
370 return false;
371
372 if (expr0->kind != expr1->kind)
373 return false;
374
375 switch (expr0->kind)
376 {
377 case EXPR_SINGLE:
378 return operand_equal_p (expr0->ops.single.rhs,
379 expr1->ops.single.rhs, 0);
380
381 case EXPR_UNARY:
382 if (expr0->ops.unary.op != expr1->ops.unary.op)
383 return false;
384
385 if ((CONVERT_EXPR_CODE_P (expr0->ops.unary.op)
386 || expr0->ops.unary.op == NON_LVALUE_EXPR)
387 && TYPE_UNSIGNED (expr0->type) != TYPE_UNSIGNED (expr1->type))
388 return false;
389
390 return operand_equal_p (expr0->ops.unary.opnd,
391 expr1->ops.unary.opnd, 0);
392
393 case EXPR_BINARY:
394 if (expr0->ops.binary.op != expr1->ops.binary.op)
395 return false;
396
397 if (operand_equal_p (expr0->ops.binary.opnd0,
398 expr1->ops.binary.opnd0, 0)
399 && operand_equal_p (expr0->ops.binary.opnd1,
400 expr1->ops.binary.opnd1, 0))
401 return true;
402
403 /* For commutative ops, allow the other order. */
404 return (commutative_tree_code (expr0->ops.binary.op)
405 && operand_equal_p (expr0->ops.binary.opnd0,
406 expr1->ops.binary.opnd1, 0)
407 && operand_equal_p (expr0->ops.binary.opnd1,
408 expr1->ops.binary.opnd0, 0));
409
410 case EXPR_TERNARY:
411 if (expr0->ops.ternary.op != expr1->ops.ternary.op
412 || !operand_equal_p (expr0->ops.ternary.opnd2,
413 expr1->ops.ternary.opnd2, 0))
414 return false;
415
416 if (operand_equal_p (expr0->ops.ternary.opnd0,
417 expr1->ops.ternary.opnd0, 0)
418 && operand_equal_p (expr0->ops.ternary.opnd1,
419 expr1->ops.ternary.opnd1, 0))
420 return true;
421
422 /* For commutative ops, allow the other order. */
423 return (commutative_ternary_tree_code (expr0->ops.ternary.op)
424 && operand_equal_p (expr0->ops.ternary.opnd0,
425 expr1->ops.ternary.opnd1, 0)
426 && operand_equal_p (expr0->ops.ternary.opnd1,
427 expr1->ops.ternary.opnd0, 0));
428
429 case EXPR_CALL:
430 {
431 size_t i;
432
433 /* If the calls are to different functions, then they
434 clearly cannot be equal. */
435 if (!gimple_call_same_target_p (expr0->ops.call.fn_from,
436 expr1->ops.call.fn_from))
437 return false;
438
439 if (! expr0->ops.call.pure)
440 return false;
441
442 if (expr0->ops.call.nargs != expr1->ops.call.nargs)
443 return false;
444
445 for (i = 0; i < expr0->ops.call.nargs; i++)
446 if (! operand_equal_p (expr0->ops.call.args[i],
447 expr1->ops.call.args[i], 0))
448 return false;
449
450 return true;
451 }
452
453 case EXPR_PHI:
454 {
455 size_t i;
456
457 if (expr0->ops.phi.nargs != expr1->ops.phi.nargs)
458 return false;
459
460 for (i = 0; i < expr0->ops.phi.nargs; i++)
461 if (! operand_equal_p (expr0->ops.phi.args[i],
462 expr1->ops.phi.args[i], 0))
463 return false;
464
465 return true;
466 }
467
468 default:
469 gcc_unreachable ();
470 }
471 }
472
473 /* Compute a hash value for a hashable_expr value EXPR and a
474 previously accumulated hash value VAL. If two hashable_expr
475 values compare equal with hashable_expr_equal_p, they must
476 hash to the same value, given an identical value of VAL.
477 The logic is intended to follow iterative_hash_expr in tree.c. */
478
479 static hashval_t
480 iterative_hash_hashable_expr (const struct hashable_expr *expr, hashval_t val)
481 {
482 switch (expr->kind)
483 {
484 case EXPR_SINGLE:
485 val = iterative_hash_expr (expr->ops.single.rhs, val);
486 break;
487
488 case EXPR_UNARY:
489 val = iterative_hash_object (expr->ops.unary.op, val);
490
491 /* Make sure to include signedness in the hash computation.
492 Don't hash the type, that can lead to having nodes which
493 compare equal according to operand_equal_p, but which
494 have different hash codes. */
495 if (CONVERT_EXPR_CODE_P (expr->ops.unary.op)
496 || expr->ops.unary.op == NON_LVALUE_EXPR)
497 val += TYPE_UNSIGNED (expr->type);
498
499 val = iterative_hash_expr (expr->ops.unary.opnd, val);
500 break;
501
502 case EXPR_BINARY:
503 val = iterative_hash_object (expr->ops.binary.op, val);
504 if (commutative_tree_code (expr->ops.binary.op))
505 val = iterative_hash_exprs_commutative (expr->ops.binary.opnd0,
506 expr->ops.binary.opnd1, val);
507 else
508 {
509 val = iterative_hash_expr (expr->ops.binary.opnd0, val);
510 val = iterative_hash_expr (expr->ops.binary.opnd1, val);
511 }
512 break;
513
514 case EXPR_TERNARY:
515 val = iterative_hash_object (expr->ops.ternary.op, val);
516 if (commutative_ternary_tree_code (expr->ops.ternary.op))
517 val = iterative_hash_exprs_commutative (expr->ops.ternary.opnd0,
518 expr->ops.ternary.opnd1, val);
519 else
520 {
521 val = iterative_hash_expr (expr->ops.ternary.opnd0, val);
522 val = iterative_hash_expr (expr->ops.ternary.opnd1, val);
523 }
524 val = iterative_hash_expr (expr->ops.ternary.opnd2, val);
525 break;
526
527 case EXPR_CALL:
528 {
529 size_t i;
530 enum tree_code code = CALL_EXPR;
531 gimple fn_from;
532
533 val = iterative_hash_object (code, val);
534 fn_from = expr->ops.call.fn_from;
535 if (gimple_call_internal_p (fn_from))
536 val = iterative_hash_hashval_t
537 ((hashval_t) gimple_call_internal_fn (fn_from), val);
538 else
539 val = iterative_hash_expr (gimple_call_fn (fn_from), val);
540 for (i = 0; i < expr->ops.call.nargs; i++)
541 val = iterative_hash_expr (expr->ops.call.args[i], val);
542 }
543 break;
544
545 case EXPR_PHI:
546 {
547 size_t i;
548
549 for (i = 0; i < expr->ops.phi.nargs; i++)
550 val = iterative_hash_expr (expr->ops.phi.args[i], val);
551 }
552 break;
553
554 default:
555 gcc_unreachable ();
556 }
557
558 return val;
559 }
560
561 /* Print a diagnostic dump of an expression hash table entry. */
562
563 static void
564 print_expr_hash_elt (FILE * stream, const struct expr_hash_elt *element)
565 {
566 if (element->stmt)
567 fprintf (stream, "STMT ");
568 else
569 fprintf (stream, "COND ");
570
571 if (element->lhs)
572 {
573 print_generic_expr (stream, element->lhs, 0);
574 fprintf (stream, " = ");
575 }
576
577 switch (element->expr.kind)
578 {
579 case EXPR_SINGLE:
580 print_generic_expr (stream, element->expr.ops.single.rhs, 0);
581 break;
582
583 case EXPR_UNARY:
584 fprintf (stream, "%s ", tree_code_name[element->expr.ops.unary.op]);
585 print_generic_expr (stream, element->expr.ops.unary.opnd, 0);
586 break;
587
588 case EXPR_BINARY:
589 print_generic_expr (stream, element->expr.ops.binary.opnd0, 0);
590 fprintf (stream, " %s ", tree_code_name[element->expr.ops.binary.op]);
591 print_generic_expr (stream, element->expr.ops.binary.opnd1, 0);
592 break;
593
594 case EXPR_TERNARY:
595 fprintf (stream, " %s <", tree_code_name[element->expr.ops.ternary.op]);
596 print_generic_expr (stream, element->expr.ops.ternary.opnd0, 0);
597 fputs (", ", stream);
598 print_generic_expr (stream, element->expr.ops.ternary.opnd1, 0);
599 fputs (", ", stream);
600 print_generic_expr (stream, element->expr.ops.ternary.opnd2, 0);
601 fputs (">", stream);
602 break;
603
604 case EXPR_CALL:
605 {
606 size_t i;
607 size_t nargs = element->expr.ops.call.nargs;
608 gimple fn_from;
609
610 fn_from = element->expr.ops.call.fn_from;
611 if (gimple_call_internal_p (fn_from))
612 fputs (internal_fn_name (gimple_call_internal_fn (fn_from)),
613 stream);
614 else
615 print_generic_expr (stream, gimple_call_fn (fn_from), 0);
616 fprintf (stream, " (");
617 for (i = 0; i < nargs; i++)
618 {
619 print_generic_expr (stream, element->expr.ops.call.args[i], 0);
620 if (i + 1 < nargs)
621 fprintf (stream, ", ");
622 }
623 fprintf (stream, ")");
624 }
625 break;
626
627 case EXPR_PHI:
628 {
629 size_t i;
630 size_t nargs = element->expr.ops.phi.nargs;
631
632 fprintf (stream, "PHI <");
633 for (i = 0; i < nargs; i++)
634 {
635 print_generic_expr (stream, element->expr.ops.phi.args[i], 0);
636 if (i + 1 < nargs)
637 fprintf (stream, ", ");
638 }
639 fprintf (stream, ">");
640 }
641 break;
642 }
643 fprintf (stream, "\n");
644
645 if (element->stmt)
646 {
647 fprintf (stream, " ");
648 print_gimple_stmt (stream, element->stmt, 0, 0);
649 }
650 }
651
652 /* Delete variable sized pieces of the expr_hash_elt ELEMENT. */
653
654 static void
655 free_expr_hash_elt_contents (struct expr_hash_elt *element)
656 {
657 if (element->expr.kind == EXPR_CALL)
658 free (element->expr.ops.call.args);
659 else if (element->expr.kind == EXPR_PHI)
660 free (element->expr.ops.phi.args);
661 }
662
663 /* Delete an expr_hash_elt and reclaim its storage. */
664
665 static void
666 free_expr_hash_elt (void *elt)
667 {
668 struct expr_hash_elt *element = ((struct expr_hash_elt *)elt);
669 free_expr_hash_elt_contents (element);
670 free (element);
671 }
672
673 /* Allocate an EDGE_INFO for edge E and attach it to E.
674 Return the new EDGE_INFO structure. */
675
676 static struct edge_info *
677 allocate_edge_info (edge e)
678 {
679 struct edge_info *edge_info;
680
681 edge_info = XCNEW (struct edge_info);
682
683 e->aux = edge_info;
684 return edge_info;
685 }
686
687 /* Free all EDGE_INFO structures associated with edges in the CFG.
688 If a particular edge can be threaded, copy the redirection
689 target from the EDGE_INFO structure into the edge's AUX field
690 as required by code to update the CFG and SSA graph for
691 jump threading. */
692
693 static void
694 free_all_edge_infos (void)
695 {
696 basic_block bb;
697 edge_iterator ei;
698 edge e;
699
700 FOR_EACH_BB (bb)
701 {
702 FOR_EACH_EDGE (e, ei, bb->preds)
703 {
704 struct edge_info *edge_info = (struct edge_info *) e->aux;
705
706 if (edge_info)
707 {
708 if (edge_info->cond_equivalences)
709 VEC_free (cond_equivalence, heap, edge_info->cond_equivalences);
710 free (edge_info);
711 e->aux = NULL;
712 }
713 }
714 }
715 }
716
717 /* Jump threading, redundancy elimination and const/copy propagation.
718
719 This pass may expose new symbols that need to be renamed into SSA. For
720 every new symbol exposed, its corresponding bit will be set in
721 VARS_TO_RENAME. */
722
723 static unsigned int
724 tree_ssa_dominator_optimize (void)
725 {
726 struct dom_walk_data walk_data;
727
728 memset (&opt_stats, 0, sizeof (opt_stats));
729
730 /* Create our hash tables. */
731 avail_exprs = htab_create (1024, real_avail_expr_hash, avail_expr_eq, free_expr_hash_elt);
732 avail_exprs_stack = VEC_alloc (expr_hash_elt_t, heap, 20);
733 const_and_copies_stack = VEC_alloc (tree, heap, 20);
734 need_eh_cleanup = BITMAP_ALLOC (NULL);
735
736 /* Setup callbacks for the generic dominator tree walker. */
737 walk_data.dom_direction = CDI_DOMINATORS;
738 walk_data.initialize_block_local_data = NULL;
739 walk_data.before_dom_children = dom_opt_enter_block;
740 walk_data.after_dom_children = dom_opt_leave_block;
741 /* Right now we only attach a dummy COND_EXPR to the global data pointer.
742 When we attach more stuff we'll need to fill this out with a real
743 structure. */
744 walk_data.global_data = NULL;
745 walk_data.block_local_data_size = 0;
746
747 /* Now initialize the dominator walker. */
748 init_walk_dominator_tree (&walk_data);
749
750 calculate_dominance_info (CDI_DOMINATORS);
751 cfg_altered = false;
752
753 /* We need to know loop structures in order to avoid destroying them
754 in jump threading. Note that we still can e.g. thread through loop
755 headers to an exit edge, or through loop header to the loop body, assuming
756 that we update the loop info. */
757 loop_optimizer_init (LOOPS_HAVE_SIMPLE_LATCHES);
758
759 /* Initialize the value-handle array. */
760 threadedge_initialize_values ();
761
762 /* We need accurate information regarding back edges in the CFG
763 for jump threading; this may include back edges that are not part of
764 a single loop. */
765 mark_dfs_back_edges ();
766
767 /* Recursively walk the dominator tree optimizing statements. */
768 walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
769
770 {
771 gimple_stmt_iterator gsi;
772 basic_block bb;
773 FOR_EACH_BB (bb)
774 {
775 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
776 update_stmt_if_modified (gsi_stmt (gsi));
777 }
778 }
779
780 /* If we exposed any new variables, go ahead and put them into
781 SSA form now, before we handle jump threading. This simplifies
782 interactions between rewriting of _DECL nodes into SSA form
783 and rewriting SSA_NAME nodes into SSA form after block
784 duplication and CFG manipulation. */
785 update_ssa (TODO_update_ssa);
786
787 free_all_edge_infos ();
788
789 /* Thread jumps, creating duplicate blocks as needed. */
790 cfg_altered |= thread_through_all_blocks (first_pass_instance);
791
792 if (cfg_altered)
793 free_dominance_info (CDI_DOMINATORS);
794
795 /* Removal of statements may make some EH edges dead. Purge
796 such edges from the CFG as needed. */
797 if (!bitmap_empty_p (need_eh_cleanup))
798 {
799 unsigned i;
800 bitmap_iterator bi;
801
802 /* Jump threading may have created forwarder blocks from blocks
803 needing EH cleanup; the new successor of these blocks, which
804 has inherited from the original block, needs the cleanup. */
805 EXECUTE_IF_SET_IN_BITMAP (need_eh_cleanup, 0, i, bi)
806 {
807 basic_block bb = BASIC_BLOCK (i);
808 if (bb
809 && single_succ_p (bb)
810 && (single_succ_edge (bb)->flags & EDGE_EH) == 0)
811 {
812 bitmap_clear_bit (need_eh_cleanup, i);
813 bitmap_set_bit (need_eh_cleanup, single_succ (bb)->index);
814 }
815 }
816
817 gimple_purge_all_dead_eh_edges (need_eh_cleanup);
818 bitmap_clear (need_eh_cleanup);
819 }
820
821 statistics_counter_event (cfun, "Redundant expressions eliminated",
822 opt_stats.num_re);
823 statistics_counter_event (cfun, "Constants propagated",
824 opt_stats.num_const_prop);
825 statistics_counter_event (cfun, "Copies propagated",
826 opt_stats.num_copy_prop);
827
828 /* Debugging dumps. */
829 if (dump_file && (dump_flags & TDF_STATS))
830 dump_dominator_optimization_stats (dump_file);
831
832 loop_optimizer_finalize ();
833
834 /* Delete our main hashtable. */
835 htab_delete (avail_exprs);
836
837 /* And finalize the dominator walker. */
838 fini_walk_dominator_tree (&walk_data);
839
840 /* Free asserted bitmaps and stacks. */
841 BITMAP_FREE (need_eh_cleanup);
842
843 VEC_free (expr_hash_elt_t, heap, avail_exprs_stack);
844 VEC_free (tree, heap, const_and_copies_stack);
845
846 /* Free the value-handle array. */
847 threadedge_finalize_values ();
848 ssa_name_values = NULL;
849
850 return 0;
851 }
852
853 static bool
854 gate_dominator (void)
855 {
856 return flag_tree_dom != 0;
857 }
858
859 struct gimple_opt_pass pass_dominator =
860 {
861 {
862 GIMPLE_PASS,
863 "dom", /* name */
864 OPTGROUP_NONE, /* optinfo_flags */
865 gate_dominator, /* gate */
866 tree_ssa_dominator_optimize, /* execute */
867 NULL, /* sub */
868 NULL, /* next */
869 0, /* static_pass_number */
870 TV_TREE_SSA_DOMINATOR_OPTS, /* tv_id */
871 PROP_cfg | PROP_ssa, /* properties_required */
872 0, /* properties_provided */
873 0, /* properties_destroyed */
874 0, /* todo_flags_start */
875 TODO_cleanup_cfg
876 | TODO_update_ssa
877 | TODO_verify_ssa
878 | TODO_verify_flow /* todo_flags_finish */
879 }
880 };
881
882
883 /* Given a conditional statement CONDSTMT, convert the
884 condition to a canonical form. */
885
886 static void
887 canonicalize_comparison (gimple condstmt)
888 {
889 tree op0;
890 tree op1;
891 enum tree_code code;
892
893 gcc_assert (gimple_code (condstmt) == GIMPLE_COND);
894
895 op0 = gimple_cond_lhs (condstmt);
896 op1 = gimple_cond_rhs (condstmt);
897
898 code = gimple_cond_code (condstmt);
899
900 /* If it would be profitable to swap the operands, then do so to
901 canonicalize the statement, enabling better optimization.
902
903 By placing canonicalization of such expressions here we
904 transparently keep statements in canonical form, even
905 when the statement is modified. */
906 if (tree_swap_operands_p (op0, op1, false))
907 {
908 /* For relationals we need to swap the operands
909 and change the code. */
910 if (code == LT_EXPR
911 || code == GT_EXPR
912 || code == LE_EXPR
913 || code == GE_EXPR)
914 {
915 code = swap_tree_comparison (code);
916
917 gimple_cond_set_code (condstmt, code);
918 gimple_cond_set_lhs (condstmt, op1);
919 gimple_cond_set_rhs (condstmt, op0);
920
921 update_stmt (condstmt);
922 }
923 }
924 }
925
926 /* Initialize local stacks for this optimizer and record equivalences
927 upon entry to BB. Equivalences can come from the edge traversed to
928 reach BB or they may come from PHI nodes at the start of BB. */
929
930 /* Remove all the expressions in LOCALS from TABLE, stopping when there are
931 LIMIT entries left in LOCALs. */
932
933 static void
934 remove_local_expressions_from_table (void)
935 {
936 /* Remove all the expressions made available in this block. */
937 while (VEC_length (expr_hash_elt_t, avail_exprs_stack) > 0)
938 {
939 expr_hash_elt_t victim = VEC_pop (expr_hash_elt_t, avail_exprs_stack);
940 void **slot;
941
942 if (victim == NULL)
943 break;
944
945 /* This must precede the actual removal from the hash table,
946 as ELEMENT and the table entry may share a call argument
947 vector which will be freed during removal. */
948 if (dump_file && (dump_flags & TDF_DETAILS))
949 {
950 fprintf (dump_file, "<<<< ");
951 print_expr_hash_elt (dump_file, victim);
952 }
953
954 slot = htab_find_slot_with_hash (avail_exprs,
955 victim, victim->hash, NO_INSERT);
956 gcc_assert (slot && *slot == (void *) victim);
957 htab_clear_slot (avail_exprs, slot);
958 }
959 }
960
961 /* Use the source/dest pairs in CONST_AND_COPIES_STACK to restore
962 CONST_AND_COPIES to its original state, stopping when we hit a
963 NULL marker. */
964
965 static void
966 restore_vars_to_original_value (void)
967 {
968 while (VEC_length (tree, const_and_copies_stack) > 0)
969 {
970 tree prev_value, dest;
971
972 dest = VEC_pop (tree, const_and_copies_stack);
973
974 if (dest == NULL)
975 break;
976
977 if (dump_file && (dump_flags & TDF_DETAILS))
978 {
979 fprintf (dump_file, "<<<< COPY ");
980 print_generic_expr (dump_file, dest, 0);
981 fprintf (dump_file, " = ");
982 print_generic_expr (dump_file, SSA_NAME_VALUE (dest), 0);
983 fprintf (dump_file, "\n");
984 }
985
986 prev_value = VEC_pop (tree, const_and_copies_stack);
987 set_ssa_name_value (dest, prev_value);
988 }
989 }
990
991 /* A trivial wrapper so that we can present the generic jump
992 threading code with a simple API for simplifying statements. */
993 static tree
994 simplify_stmt_for_jump_threading (gimple stmt,
995 gimple within_stmt ATTRIBUTE_UNUSED)
996 {
997 return lookup_avail_expr (stmt, false);
998 }
999
1000 /* Wrapper for common code to attempt to thread an edge. For example,
1001 it handles lazily building the dummy condition and the bookkeeping
1002 when jump threading is successful. */
1003
1004 static void
1005 dom_thread_across_edge (struct dom_walk_data *walk_data, edge e)
1006 {
1007 if (! walk_data->global_data)
1008 {
1009 gimple dummy_cond =
1010 gimple_build_cond (NE_EXPR,
1011 integer_zero_node, integer_zero_node,
1012 NULL, NULL);
1013 walk_data->global_data = dummy_cond;
1014 }
1015
1016 thread_across_edge ((gimple) walk_data->global_data, e, false,
1017 &const_and_copies_stack,
1018 simplify_stmt_for_jump_threading);
1019 }
1020
1021 /* PHI nodes can create equivalences too.
1022
1023 Ignoring any alternatives which are the same as the result, if
1024 all the alternatives are equal, then the PHI node creates an
1025 equivalence. */
1026
1027 static void
1028 record_equivalences_from_phis (basic_block bb)
1029 {
1030 gimple_stmt_iterator gsi;
1031
1032 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1033 {
1034 gimple phi = gsi_stmt (gsi);
1035
1036 tree lhs = gimple_phi_result (phi);
1037 tree rhs = NULL;
1038 size_t i;
1039
1040 for (i = 0; i < gimple_phi_num_args (phi); i++)
1041 {
1042 tree t = gimple_phi_arg_def (phi, i);
1043
1044 /* Ignore alternatives which are the same as our LHS. Since
1045 LHS is a PHI_RESULT, it is known to be a SSA_NAME, so we
1046 can simply compare pointers. */
1047 if (lhs == t)
1048 continue;
1049
1050 /* If we have not processed an alternative yet, then set
1051 RHS to this alternative. */
1052 if (rhs == NULL)
1053 rhs = t;
1054 /* If we have processed an alternative (stored in RHS), then
1055 see if it is equal to this one. If it isn't, then stop
1056 the search. */
1057 else if (! operand_equal_for_phi_arg_p (rhs, t))
1058 break;
1059 }
1060
1061 /* If we had no interesting alternatives, then all the RHS alternatives
1062 must have been the same as LHS. */
1063 if (!rhs)
1064 rhs = lhs;
1065
1066 /* If we managed to iterate through each PHI alternative without
1067 breaking out of the loop, then we have a PHI which may create
1068 a useful equivalence. We do not need to record unwind data for
1069 this, since this is a true assignment and not an equivalence
1070 inferred from a comparison. All uses of this ssa name are dominated
1071 by this assignment, so unwinding just costs time and space. */
1072 if (i == gimple_phi_num_args (phi) && may_propagate_copy (lhs, rhs))
1073 set_ssa_name_value (lhs, rhs);
1074 }
1075 }
1076
1077 /* Ignoring loop backedges, if BB has precisely one incoming edge then
1078 return that edge. Otherwise return NULL. */
1079 static edge
1080 single_incoming_edge_ignoring_loop_edges (basic_block bb)
1081 {
1082 edge retval = NULL;
1083 edge e;
1084 edge_iterator ei;
1085
1086 FOR_EACH_EDGE (e, ei, bb->preds)
1087 {
1088 /* A loop back edge can be identified by the destination of
1089 the edge dominating the source of the edge. */
1090 if (dominated_by_p (CDI_DOMINATORS, e->src, e->dest))
1091 continue;
1092
1093 /* If we have already seen a non-loop edge, then we must have
1094 multiple incoming non-loop edges and thus we return NULL. */
1095 if (retval)
1096 return NULL;
1097
1098 /* This is the first non-loop incoming edge we have found. Record
1099 it. */
1100 retval = e;
1101 }
1102
1103 return retval;
1104 }
1105
1106 /* Record any equivalences created by the incoming edge to BB. If BB
1107 has more than one incoming edge, then no equivalence is created. */
1108
1109 static void
1110 record_equivalences_from_incoming_edge (basic_block bb)
1111 {
1112 edge e;
1113 basic_block parent;
1114 struct edge_info *edge_info;
1115
1116 /* If our parent block ended with a control statement, then we may be
1117 able to record some equivalences based on which outgoing edge from
1118 the parent was followed. */
1119 parent = get_immediate_dominator (CDI_DOMINATORS, bb);
1120
1121 e = single_incoming_edge_ignoring_loop_edges (bb);
1122
1123 /* If we had a single incoming edge from our parent block, then enter
1124 any data associated with the edge into our tables. */
1125 if (e && e->src == parent)
1126 {
1127 unsigned int i;
1128
1129 edge_info = (struct edge_info *) e->aux;
1130
1131 if (edge_info)
1132 {
1133 tree lhs = edge_info->lhs;
1134 tree rhs = edge_info->rhs;
1135 cond_equivalence *eq;
1136
1137 if (lhs)
1138 record_equality (lhs, rhs);
1139
1140 for (i = 0; VEC_iterate (cond_equivalence,
1141 edge_info->cond_equivalences, i, eq); ++i)
1142 record_cond (eq);
1143 }
1144 }
1145 }
1146
1147 /* Dump SSA statistics on FILE. */
1148
1149 void
1150 dump_dominator_optimization_stats (FILE *file)
1151 {
1152 fprintf (file, "Total number of statements: %6ld\n\n",
1153 opt_stats.num_stmts);
1154 fprintf (file, "Exprs considered for dominator optimizations: %6ld\n",
1155 opt_stats.num_exprs_considered);
1156
1157 fprintf (file, "\nHash table statistics:\n");
1158
1159 fprintf (file, " avail_exprs: ");
1160 htab_statistics (file, avail_exprs);
1161 }
1162
1163
1164 /* Dump SSA statistics on stderr. */
1165
1166 DEBUG_FUNCTION void
1167 debug_dominator_optimization_stats (void)
1168 {
1169 dump_dominator_optimization_stats (stderr);
1170 }
1171
1172
1173 /* Dump statistics for the hash table HTAB. */
1174
1175 static void
1176 htab_statistics (FILE *file, htab_t htab)
1177 {
1178 fprintf (file, "size %ld, %ld elements, %f collision/search ratio\n",
1179 (long) htab_size (htab),
1180 (long) htab_elements (htab),
1181 htab_collisions (htab));
1182 }
1183
1184
1185 /* Enter condition equivalence into the expression hash table.
1186 This indicates that a conditional expression has a known
1187 boolean value. */
1188
1189 static void
1190 record_cond (cond_equivalence *p)
1191 {
1192 struct expr_hash_elt *element = XCNEW (struct expr_hash_elt);
1193 void **slot;
1194
1195 initialize_hash_element_from_expr (&p->cond, p->value, element);
1196
1197 slot = htab_find_slot_with_hash (avail_exprs, (void *)element,
1198 element->hash, INSERT);
1199 if (*slot == NULL)
1200 {
1201 *slot = (void *) element;
1202
1203 if (dump_file && (dump_flags & TDF_DETAILS))
1204 {
1205 fprintf (dump_file, "1>>> ");
1206 print_expr_hash_elt (dump_file, element);
1207 }
1208
1209 VEC_safe_push (expr_hash_elt_t, heap, avail_exprs_stack, element);
1210 }
1211 else
1212 free_expr_hash_elt (element);
1213 }
1214
1215 /* Build a cond_equivalence record indicating that the comparison
1216 CODE holds between operands OP0 and OP1 and push it to **P. */
1217
1218 static void
1219 build_and_record_new_cond (enum tree_code code,
1220 tree op0, tree op1,
1221 VEC(cond_equivalence, heap) **p)
1222 {
1223 cond_equivalence c;
1224 struct hashable_expr *cond = &c.cond;
1225
1226 gcc_assert (TREE_CODE_CLASS (code) == tcc_comparison);
1227
1228 cond->type = boolean_type_node;
1229 cond->kind = EXPR_BINARY;
1230 cond->ops.binary.op = code;
1231 cond->ops.binary.opnd0 = op0;
1232 cond->ops.binary.opnd1 = op1;
1233
1234 c.value = boolean_true_node;
1235 VEC_safe_push (cond_equivalence, heap, *p, c);
1236 }
1237
1238 /* Record that COND is true and INVERTED is false into the edge information
1239 structure. Also record that any conditions dominated by COND are true
1240 as well.
1241
1242 For example, if a < b is true, then a <= b must also be true. */
1243
1244 static void
1245 record_conditions (struct edge_info *edge_info, tree cond, tree inverted)
1246 {
1247 tree op0, op1;
1248 cond_equivalence c;
1249
1250 if (!COMPARISON_CLASS_P (cond))
1251 return;
1252
1253 op0 = TREE_OPERAND (cond, 0);
1254 op1 = TREE_OPERAND (cond, 1);
1255
1256 switch (TREE_CODE (cond))
1257 {
1258 case LT_EXPR:
1259 case GT_EXPR:
1260 if (FLOAT_TYPE_P (TREE_TYPE (op0)))
1261 {
1262 build_and_record_new_cond (ORDERED_EXPR, op0, op1,
1263 &edge_info->cond_equivalences);
1264 build_and_record_new_cond (LTGT_EXPR, op0, op1,
1265 &edge_info->cond_equivalences);
1266 }
1267
1268 build_and_record_new_cond ((TREE_CODE (cond) == LT_EXPR
1269 ? LE_EXPR : GE_EXPR),
1270 op0, op1, &edge_info->cond_equivalences);
1271 build_and_record_new_cond (NE_EXPR, op0, op1,
1272 &edge_info->cond_equivalences);
1273 break;
1274
1275 case GE_EXPR:
1276 case LE_EXPR:
1277 if (FLOAT_TYPE_P (TREE_TYPE (op0)))
1278 {
1279 build_and_record_new_cond (ORDERED_EXPR, op0, op1,
1280 &edge_info->cond_equivalences);
1281 }
1282 break;
1283
1284 case EQ_EXPR:
1285 if (FLOAT_TYPE_P (TREE_TYPE (op0)))
1286 {
1287 build_and_record_new_cond (ORDERED_EXPR, op0, op1,
1288 &edge_info->cond_equivalences);
1289 }
1290 build_and_record_new_cond (LE_EXPR, op0, op1,
1291 &edge_info->cond_equivalences);
1292 build_and_record_new_cond (GE_EXPR, op0, op1,
1293 &edge_info->cond_equivalences);
1294 break;
1295
1296 case UNORDERED_EXPR:
1297 build_and_record_new_cond (NE_EXPR, op0, op1,
1298 &edge_info->cond_equivalences);
1299 build_and_record_new_cond (UNLE_EXPR, op0, op1,
1300 &edge_info->cond_equivalences);
1301 build_and_record_new_cond (UNGE_EXPR, op0, op1,
1302 &edge_info->cond_equivalences);
1303 build_and_record_new_cond (UNEQ_EXPR, op0, op1,
1304 &edge_info->cond_equivalences);
1305 build_and_record_new_cond (UNLT_EXPR, op0, op1,
1306 &edge_info->cond_equivalences);
1307 build_and_record_new_cond (UNGT_EXPR, op0, op1,
1308 &edge_info->cond_equivalences);
1309 break;
1310
1311 case UNLT_EXPR:
1312 case UNGT_EXPR:
1313 build_and_record_new_cond ((TREE_CODE (cond) == UNLT_EXPR
1314 ? UNLE_EXPR : UNGE_EXPR),
1315 op0, op1, &edge_info->cond_equivalences);
1316 build_and_record_new_cond (NE_EXPR, op0, op1,
1317 &edge_info->cond_equivalences);
1318 break;
1319
1320 case UNEQ_EXPR:
1321 build_and_record_new_cond (UNLE_EXPR, op0, op1,
1322 &edge_info->cond_equivalences);
1323 build_and_record_new_cond (UNGE_EXPR, op0, op1,
1324 &edge_info->cond_equivalences);
1325 break;
1326
1327 case LTGT_EXPR:
1328 build_and_record_new_cond (NE_EXPR, op0, op1,
1329 &edge_info->cond_equivalences);
1330 build_and_record_new_cond (ORDERED_EXPR, op0, op1,
1331 &edge_info->cond_equivalences);
1332 break;
1333
1334 default:
1335 break;
1336 }
1337
1338 /* Now store the original true and false conditions into the first
1339 two slots. */
1340 initialize_expr_from_cond (cond, &c.cond);
1341 c.value = boolean_true_node;
1342 VEC_safe_push (cond_equivalence, heap, edge_info->cond_equivalences, c);
1343
1344 /* It is possible for INVERTED to be the negation of a comparison,
1345 and not a valid RHS or GIMPLE_COND condition. This happens because
1346 invert_truthvalue may return such an expression when asked to invert
1347 a floating-point comparison. These comparisons are not assumed to
1348 obey the trichotomy law. */
1349 initialize_expr_from_cond (inverted, &c.cond);
1350 c.value = boolean_false_node;
1351 VEC_safe_push (cond_equivalence, heap, edge_info->cond_equivalences, c);
1352 }
1353
1354 /* A helper function for record_const_or_copy and record_equality.
1355 Do the work of recording the value and undo info. */
1356
1357 static void
1358 record_const_or_copy_1 (tree x, tree y, tree prev_x)
1359 {
1360 set_ssa_name_value (x, y);
1361
1362 if (dump_file && (dump_flags & TDF_DETAILS))
1363 {
1364 fprintf (dump_file, "0>>> COPY ");
1365 print_generic_expr (dump_file, x, 0);
1366 fprintf (dump_file, " = ");
1367 print_generic_expr (dump_file, y, 0);
1368 fprintf (dump_file, "\n");
1369 }
1370
1371 VEC_reserve (tree, heap, const_and_copies_stack, 2);
1372 VEC_quick_push (tree, const_and_copies_stack, prev_x);
1373 VEC_quick_push (tree, const_and_copies_stack, x);
1374 }
1375
1376 /* Return the loop depth of the basic block of the defining statement of X.
1377 This number should not be treated as absolutely correct because the loop
1378 information may not be completely up-to-date when dom runs. However, it
1379 will be relatively correct, and as more passes are taught to keep loop info
1380 up to date, the result will become more and more accurate. */
1381
1382 int
1383 loop_depth_of_name (tree x)
1384 {
1385 gimple defstmt;
1386 basic_block defbb;
1387
1388 /* If it's not an SSA_NAME, we have no clue where the definition is. */
1389 if (TREE_CODE (x) != SSA_NAME)
1390 return 0;
1391
1392 /* Otherwise return the loop depth of the defining statement's bb.
1393 Note that there may not actually be a bb for this statement, if the
1394 ssa_name is live on entry. */
1395 defstmt = SSA_NAME_DEF_STMT (x);
1396 defbb = gimple_bb (defstmt);
1397 if (!defbb)
1398 return 0;
1399
1400 return bb_loop_depth (defbb);
1401 }
1402
1403 /* Record that X is equal to Y in const_and_copies. Record undo
1404 information in the block-local vector. */
1405
1406 static void
1407 record_const_or_copy (tree x, tree y)
1408 {
1409 tree prev_x = SSA_NAME_VALUE (x);
1410
1411 gcc_assert (TREE_CODE (x) == SSA_NAME);
1412
1413 if (TREE_CODE (y) == SSA_NAME)
1414 {
1415 tree tmp = SSA_NAME_VALUE (y);
1416 if (tmp)
1417 y = tmp;
1418 }
1419
1420 record_const_or_copy_1 (x, y, prev_x);
1421 }
1422
1423 /* Similarly, but assume that X and Y are the two operands of an EQ_EXPR.
1424 This constrains the cases in which we may treat this as assignment. */
1425
1426 static void
1427 record_equality (tree x, tree y)
1428 {
1429 tree prev_x = NULL, prev_y = NULL;
1430
1431 if (TREE_CODE (x) == SSA_NAME)
1432 prev_x = SSA_NAME_VALUE (x);
1433 if (TREE_CODE (y) == SSA_NAME)
1434 prev_y = SSA_NAME_VALUE (y);
1435
1436 /* If one of the previous values is invariant, or invariant in more loops
1437 (by depth), then use that.
1438 Otherwise it doesn't matter which value we choose, just so
1439 long as we canonicalize on one value. */
1440 if (is_gimple_min_invariant (y))
1441 ;
1442 else if (is_gimple_min_invariant (x)
1443 || (loop_depth_of_name (x) <= loop_depth_of_name (y)))
1444 prev_x = x, x = y, y = prev_x, prev_x = prev_y;
1445 else if (prev_x && is_gimple_min_invariant (prev_x))
1446 x = y, y = prev_x, prev_x = prev_y;
1447 else if (prev_y)
1448 y = prev_y;
1449
1450 /* After the swapping, we must have one SSA_NAME. */
1451 if (TREE_CODE (x) != SSA_NAME)
1452 return;
1453
1454 /* For IEEE, -0.0 == 0.0, so we don't necessarily know the sign of a
1455 variable compared against zero. If we're honoring signed zeros,
1456 then we cannot record this value unless we know that the value is
1457 nonzero. */
1458 if (HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (x)))
1459 && (TREE_CODE (y) != REAL_CST
1460 || REAL_VALUES_EQUAL (dconst0, TREE_REAL_CST (y))))
1461 return;
1462
1463 record_const_or_copy_1 (x, y, prev_x);
1464 }
1465
1466 /* Returns true when STMT is a simple iv increment. It detects the
1467 following situation:
1468
1469 i_1 = phi (..., i_2)
1470 i_2 = i_1 +/- ... */
1471
1472 bool
1473 simple_iv_increment_p (gimple stmt)
1474 {
1475 enum tree_code code;
1476 tree lhs, preinc;
1477 gimple phi;
1478 size_t i;
1479
1480 if (gimple_code (stmt) != GIMPLE_ASSIGN)
1481 return false;
1482
1483 lhs = gimple_assign_lhs (stmt);
1484 if (TREE_CODE (lhs) != SSA_NAME)
1485 return false;
1486
1487 code = gimple_assign_rhs_code (stmt);
1488 if (code != PLUS_EXPR
1489 && code != MINUS_EXPR
1490 && code != POINTER_PLUS_EXPR)
1491 return false;
1492
1493 preinc = gimple_assign_rhs1 (stmt);
1494 if (TREE_CODE (preinc) != SSA_NAME)
1495 return false;
1496
1497 phi = SSA_NAME_DEF_STMT (preinc);
1498 if (gimple_code (phi) != GIMPLE_PHI)
1499 return false;
1500
1501 for (i = 0; i < gimple_phi_num_args (phi); i++)
1502 if (gimple_phi_arg_def (phi, i) == lhs)
1503 return true;
1504
1505 return false;
1506 }
1507
1508 /* CONST_AND_COPIES is a table which maps an SSA_NAME to the current
1509 known value for that SSA_NAME (or NULL if no value is known).
1510
1511 Propagate values from CONST_AND_COPIES into the PHI nodes of the
1512 successors of BB. */
1513
1514 static void
1515 cprop_into_successor_phis (basic_block bb)
1516 {
1517 edge e;
1518 edge_iterator ei;
1519
1520 FOR_EACH_EDGE (e, ei, bb->succs)
1521 {
1522 int indx;
1523 gimple_stmt_iterator gsi;
1524
1525 /* If this is an abnormal edge, then we do not want to copy propagate
1526 into the PHI alternative associated with this edge. */
1527 if (e->flags & EDGE_ABNORMAL)
1528 continue;
1529
1530 gsi = gsi_start_phis (e->dest);
1531 if (gsi_end_p (gsi))
1532 continue;
1533
1534 indx = e->dest_idx;
1535 for ( ; !gsi_end_p (gsi); gsi_next (&gsi))
1536 {
1537 tree new_val;
1538 use_operand_p orig_p;
1539 tree orig_val;
1540 gimple phi = gsi_stmt (gsi);
1541
1542 /* The alternative may be associated with a constant, so verify
1543 it is an SSA_NAME before doing anything with it. */
1544 orig_p = gimple_phi_arg_imm_use_ptr (phi, indx);
1545 orig_val = get_use_from_ptr (orig_p);
1546 if (TREE_CODE (orig_val) != SSA_NAME)
1547 continue;
1548
1549 /* If we have *ORIG_P in our constant/copy table, then replace
1550 ORIG_P with its value in our constant/copy table. */
1551 new_val = SSA_NAME_VALUE (orig_val);
1552 if (new_val
1553 && new_val != orig_val
1554 && (TREE_CODE (new_val) == SSA_NAME
1555 || is_gimple_min_invariant (new_val))
1556 && may_propagate_copy (orig_val, new_val))
1557 propagate_value (orig_p, new_val);
1558 }
1559 }
1560 }
1561
1562 /* We have finished optimizing BB, record any information implied by
1563 taking a specific outgoing edge from BB. */
1564
1565 static void
1566 record_edge_info (basic_block bb)
1567 {
1568 gimple_stmt_iterator gsi = gsi_last_bb (bb);
1569 struct edge_info *edge_info;
1570
1571 if (! gsi_end_p (gsi))
1572 {
1573 gimple stmt = gsi_stmt (gsi);
1574 location_t loc = gimple_location (stmt);
1575
1576 if (gimple_code (stmt) == GIMPLE_SWITCH)
1577 {
1578 tree index = gimple_switch_index (stmt);
1579
1580 if (TREE_CODE (index) == SSA_NAME)
1581 {
1582 int i;
1583 int n_labels = gimple_switch_num_labels (stmt);
1584 tree *info = XCNEWVEC (tree, last_basic_block);
1585 edge e;
1586 edge_iterator ei;
1587
1588 for (i = 0; i < n_labels; i++)
1589 {
1590 tree label = gimple_switch_label (stmt, i);
1591 basic_block target_bb = label_to_block (CASE_LABEL (label));
1592 if (CASE_HIGH (label)
1593 || !CASE_LOW (label)
1594 || info[target_bb->index])
1595 info[target_bb->index] = error_mark_node;
1596 else
1597 info[target_bb->index] = label;
1598 }
1599
1600 FOR_EACH_EDGE (e, ei, bb->succs)
1601 {
1602 basic_block target_bb = e->dest;
1603 tree label = info[target_bb->index];
1604
1605 if (label != NULL && label != error_mark_node)
1606 {
1607 tree x = fold_convert_loc (loc, TREE_TYPE (index),
1608 CASE_LOW (label));
1609 edge_info = allocate_edge_info (e);
1610 edge_info->lhs = index;
1611 edge_info->rhs = x;
1612 }
1613 }
1614 free (info);
1615 }
1616 }
1617
1618 /* A COND_EXPR may create equivalences too. */
1619 if (gimple_code (stmt) == GIMPLE_COND)
1620 {
1621 edge true_edge;
1622 edge false_edge;
1623
1624 tree op0 = gimple_cond_lhs (stmt);
1625 tree op1 = gimple_cond_rhs (stmt);
1626 enum tree_code code = gimple_cond_code (stmt);
1627
1628 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
1629
1630 /* Special case comparing booleans against a constant as we
1631 know the value of OP0 on both arms of the branch. i.e., we
1632 can record an equivalence for OP0 rather than COND. */
1633 if ((code == EQ_EXPR || code == NE_EXPR)
1634 && TREE_CODE (op0) == SSA_NAME
1635 && TREE_CODE (TREE_TYPE (op0)) == BOOLEAN_TYPE
1636 && is_gimple_min_invariant (op1))
1637 {
1638 if (code == EQ_EXPR)
1639 {
1640 edge_info = allocate_edge_info (true_edge);
1641 edge_info->lhs = op0;
1642 edge_info->rhs = (integer_zerop (op1)
1643 ? boolean_false_node
1644 : boolean_true_node);
1645
1646 edge_info = allocate_edge_info (false_edge);
1647 edge_info->lhs = op0;
1648 edge_info->rhs = (integer_zerop (op1)
1649 ? boolean_true_node
1650 : boolean_false_node);
1651 }
1652 else
1653 {
1654 edge_info = allocate_edge_info (true_edge);
1655 edge_info->lhs = op0;
1656 edge_info->rhs = (integer_zerop (op1)
1657 ? boolean_true_node
1658 : boolean_false_node);
1659
1660 edge_info = allocate_edge_info (false_edge);
1661 edge_info->lhs = op0;
1662 edge_info->rhs = (integer_zerop (op1)
1663 ? boolean_false_node
1664 : boolean_true_node);
1665 }
1666 }
1667 else if (is_gimple_min_invariant (op0)
1668 && (TREE_CODE (op1) == SSA_NAME
1669 || is_gimple_min_invariant (op1)))
1670 {
1671 tree cond = build2 (code, boolean_type_node, op0, op1);
1672 tree inverted = invert_truthvalue_loc (loc, cond);
1673 bool can_infer_simple_equiv
1674 = !(HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op0)))
1675 && real_zerop (op0));
1676 struct edge_info *edge_info;
1677
1678 edge_info = allocate_edge_info (true_edge);
1679 record_conditions (edge_info, cond, inverted);
1680
1681 if (can_infer_simple_equiv && code == EQ_EXPR)
1682 {
1683 edge_info->lhs = op1;
1684 edge_info->rhs = op0;
1685 }
1686
1687 edge_info = allocate_edge_info (false_edge);
1688 record_conditions (edge_info, inverted, cond);
1689
1690 if (can_infer_simple_equiv && TREE_CODE (inverted) == EQ_EXPR)
1691 {
1692 edge_info->lhs = op1;
1693 edge_info->rhs = op0;
1694 }
1695 }
1696
1697 else if (TREE_CODE (op0) == SSA_NAME
1698 && (TREE_CODE (op1) == SSA_NAME
1699 || is_gimple_min_invariant (op1)))
1700 {
1701 tree cond = build2 (code, boolean_type_node, op0, op1);
1702 tree inverted = invert_truthvalue_loc (loc, cond);
1703 bool can_infer_simple_equiv
1704 = !(HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op1)))
1705 && (TREE_CODE (op1) == SSA_NAME || real_zerop (op1)));
1706 struct edge_info *edge_info;
1707
1708 edge_info = allocate_edge_info (true_edge);
1709 record_conditions (edge_info, cond, inverted);
1710
1711 if (can_infer_simple_equiv && code == EQ_EXPR)
1712 {
1713 edge_info->lhs = op0;
1714 edge_info->rhs = op1;
1715 }
1716
1717 edge_info = allocate_edge_info (false_edge);
1718 record_conditions (edge_info, inverted, cond);
1719
1720 if (can_infer_simple_equiv && TREE_CODE (inverted) == EQ_EXPR)
1721 {
1722 edge_info->lhs = op0;
1723 edge_info->rhs = op1;
1724 }
1725 }
1726 }
1727
1728 /* ??? TRUTH_NOT_EXPR can create an equivalence too. */
1729 }
1730 }
1731
1732 static void
1733 dom_opt_enter_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
1734 basic_block bb)
1735 {
1736 gimple_stmt_iterator gsi;
1737
1738 if (dump_file && (dump_flags & TDF_DETAILS))
1739 fprintf (dump_file, "\n\nOptimizing block #%d\n\n", bb->index);
1740
1741 /* Push a marker on the stacks of local information so that we know how
1742 far to unwind when we finalize this block. */
1743 VEC_safe_push (expr_hash_elt_t, heap, avail_exprs_stack,
1744 (expr_hash_elt_t)NULL);
1745 VEC_safe_push (tree, heap, const_and_copies_stack, NULL_TREE);
1746
1747 record_equivalences_from_incoming_edge (bb);
1748
1749 /* PHI nodes can create equivalences too. */
1750 record_equivalences_from_phis (bb);
1751
1752 /* Create equivalences from redundant PHIs. PHIs are only truly
1753 redundant when they exist in the same block, so push another
1754 marker and unwind right afterwards. */
1755 VEC_safe_push (expr_hash_elt_t, heap, avail_exprs_stack,
1756 (expr_hash_elt_t)NULL);
1757 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1758 eliminate_redundant_computations (&gsi);
1759 remove_local_expressions_from_table ();
1760
1761 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1762 optimize_stmt (bb, gsi);
1763
1764 /* Now prepare to process dominated blocks. */
1765 record_edge_info (bb);
1766 cprop_into_successor_phis (bb);
1767 }
1768
1769 /* We have finished processing the dominator children of BB, perform
1770 any finalization actions in preparation for leaving this node in
1771 the dominator tree. */
1772
1773 static void
1774 dom_opt_leave_block (struct dom_walk_data *walk_data, basic_block bb)
1775 {
1776 gimple last;
1777
1778 /* If we have an outgoing edge to a block with multiple incoming and
1779 outgoing edges, then we may be able to thread the edge, i.e., we
1780 may be able to statically determine which of the outgoing edges
1781 will be traversed when the incoming edge from BB is traversed. */
1782 if (single_succ_p (bb)
1783 && (single_succ_edge (bb)->flags & EDGE_ABNORMAL) == 0
1784 && potentially_threadable_block (single_succ (bb)))
1785 {
1786 /* Push a marker on the stack, which thread_across_edge expects
1787 and will remove. */
1788 VEC_safe_push (tree, heap, const_and_copies_stack, NULL_TREE);
1789 dom_thread_across_edge (walk_data, single_succ_edge (bb));
1790 }
1791 else if ((last = last_stmt (bb))
1792 && gimple_code (last) == GIMPLE_COND
1793 && EDGE_COUNT (bb->succs) == 2
1794 && (EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL) == 0
1795 && (EDGE_SUCC (bb, 1)->flags & EDGE_ABNORMAL) == 0)
1796 {
1797 edge true_edge, false_edge;
1798
1799 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
1800
1801 /* Only try to thread the edge if it reaches a target block with
1802 more than one predecessor and more than one successor. */
1803 if (potentially_threadable_block (true_edge->dest))
1804 {
1805 struct edge_info *edge_info;
1806 unsigned int i;
1807
1808 /* Push a marker onto the available expression stack so that we
1809 unwind any expressions related to the TRUE arm before processing
1810 the false arm below. */
1811 VEC_safe_push (expr_hash_elt_t, heap, avail_exprs_stack,
1812 (expr_hash_elt_t)NULL);
1813 VEC_safe_push (tree, heap, const_and_copies_stack, NULL_TREE);
1814
1815 edge_info = (struct edge_info *) true_edge->aux;
1816
1817 /* If we have info associated with this edge, record it into
1818 our equivalence tables. */
1819 if (edge_info)
1820 {
1821 cond_equivalence *eq;
1822 tree lhs = edge_info->lhs;
1823 tree rhs = edge_info->rhs;
1824
1825 /* If we have a simple NAME = VALUE equivalence, record it. */
1826 if (lhs && TREE_CODE (lhs) == SSA_NAME)
1827 record_const_or_copy (lhs, rhs);
1828
1829 /* If we have 0 = COND or 1 = COND equivalences, record them
1830 into our expression hash tables. */
1831 for (i = 0; VEC_iterate (cond_equivalence,
1832 edge_info->cond_equivalences, i, eq); ++i)
1833 record_cond (eq);
1834 }
1835
1836 dom_thread_across_edge (walk_data, true_edge);
1837
1838 /* And restore the various tables to their state before
1839 we threaded this edge. */
1840 remove_local_expressions_from_table ();
1841 }
1842
1843 /* Similarly for the ELSE arm. */
1844 if (potentially_threadable_block (false_edge->dest))
1845 {
1846 struct edge_info *edge_info;
1847 unsigned int i;
1848
1849 VEC_safe_push (tree, heap, const_and_copies_stack, NULL_TREE);
1850 edge_info = (struct edge_info *) false_edge->aux;
1851
1852 /* If we have info associated with this edge, record it into
1853 our equivalence tables. */
1854 if (edge_info)
1855 {
1856 cond_equivalence *eq;
1857 tree lhs = edge_info->lhs;
1858 tree rhs = edge_info->rhs;
1859
1860 /* If we have a simple NAME = VALUE equivalence, record it. */
1861 if (lhs && TREE_CODE (lhs) == SSA_NAME)
1862 record_const_or_copy (lhs, rhs);
1863
1864 /* If we have 0 = COND or 1 = COND equivalences, record them
1865 into our expression hash tables. */
1866 for (i = 0; VEC_iterate (cond_equivalence,
1867 edge_info->cond_equivalences, i, eq); ++i)
1868 record_cond (eq);
1869 }
1870
1871 /* Now thread the edge. */
1872 dom_thread_across_edge (walk_data, false_edge);
1873
1874 /* No need to remove local expressions from our tables
1875 or restore vars to their original value as that will
1876 be done immediately below. */
1877 }
1878 }
1879
1880 remove_local_expressions_from_table ();
1881 restore_vars_to_original_value ();
1882 }
1883
1884 /* Search for redundant computations in STMT. If any are found, then
1885 replace them with the variable holding the result of the computation.
1886
1887 If safe, record this expression into the available expression hash
1888 table. */
1889
1890 static void
1891 eliminate_redundant_computations (gimple_stmt_iterator* gsi)
1892 {
1893 tree expr_type;
1894 tree cached_lhs;
1895 tree def;
1896 bool insert = true;
1897 bool assigns_var_p = false;
1898
1899 gimple stmt = gsi_stmt (*gsi);
1900
1901 if (gimple_code (stmt) == GIMPLE_PHI)
1902 def = gimple_phi_result (stmt);
1903 else
1904 def = gimple_get_lhs (stmt);
1905
1906 /* Certain expressions on the RHS can be optimized away, but can not
1907 themselves be entered into the hash tables. */
1908 if (! def
1909 || TREE_CODE (def) != SSA_NAME
1910 || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def)
1911 || gimple_vdef (stmt)
1912 /* Do not record equivalences for increments of ivs. This would create
1913 overlapping live ranges for a very questionable gain. */
1914 || simple_iv_increment_p (stmt))
1915 insert = false;
1916
1917 /* Check if the expression has been computed before. */
1918 cached_lhs = lookup_avail_expr (stmt, insert);
1919
1920 opt_stats.num_exprs_considered++;
1921
1922 /* Get the type of the expression we are trying to optimize. */
1923 if (is_gimple_assign (stmt))
1924 {
1925 expr_type = TREE_TYPE (gimple_assign_lhs (stmt));
1926 assigns_var_p = true;
1927 }
1928 else if (gimple_code (stmt) == GIMPLE_COND)
1929 expr_type = boolean_type_node;
1930 else if (is_gimple_call (stmt))
1931 {
1932 gcc_assert (gimple_call_lhs (stmt));
1933 expr_type = TREE_TYPE (gimple_call_lhs (stmt));
1934 assigns_var_p = true;
1935 }
1936 else if (gimple_code (stmt) == GIMPLE_SWITCH)
1937 expr_type = TREE_TYPE (gimple_switch_index (stmt));
1938 else if (gimple_code (stmt) == GIMPLE_PHI)
1939 /* We can't propagate into a phi, so the logic below doesn't apply.
1940 Instead record an equivalence between the cached LHS and the
1941 PHI result of this statement, provided they are in the same block.
1942 This should be sufficient to kill the redundant phi. */
1943 {
1944 if (def && cached_lhs)
1945 record_const_or_copy (def, cached_lhs);
1946 return;
1947 }
1948 else
1949 gcc_unreachable ();
1950
1951 if (!cached_lhs)
1952 return;
1953
1954 /* It is safe to ignore types here since we have already done
1955 type checking in the hashing and equality routines. In fact
1956 type checking here merely gets in the way of constant
1957 propagation. Also, make sure that it is safe to propagate
1958 CACHED_LHS into the expression in STMT. */
1959 if ((TREE_CODE (cached_lhs) != SSA_NAME
1960 && (assigns_var_p
1961 || useless_type_conversion_p (expr_type, TREE_TYPE (cached_lhs))))
1962 || may_propagate_copy_into_stmt (stmt, cached_lhs))
1963 {
1964 gcc_checking_assert (TREE_CODE (cached_lhs) == SSA_NAME
1965 || is_gimple_min_invariant (cached_lhs));
1966
1967 if (dump_file && (dump_flags & TDF_DETAILS))
1968 {
1969 fprintf (dump_file, " Replaced redundant expr '");
1970 print_gimple_expr (dump_file, stmt, 0, dump_flags);
1971 fprintf (dump_file, "' with '");
1972 print_generic_expr (dump_file, cached_lhs, dump_flags);
1973 fprintf (dump_file, "'\n");
1974 }
1975
1976 opt_stats.num_re++;
1977
1978 if (assigns_var_p
1979 && !useless_type_conversion_p (expr_type, TREE_TYPE (cached_lhs)))
1980 cached_lhs = fold_convert (expr_type, cached_lhs);
1981
1982 propagate_tree_value_into_stmt (gsi, cached_lhs);
1983
1984 /* Since it is always necessary to mark the result as modified,
1985 perhaps we should move this into propagate_tree_value_into_stmt
1986 itself. */
1987 gimple_set_modified (gsi_stmt (*gsi), true);
1988 }
1989 }
1990
1991 /* STMT, a GIMPLE_ASSIGN, may create certain equivalences, in either
1992 the available expressions table or the const_and_copies table.
1993 Detect and record those equivalences. */
1994 /* We handle only very simple copy equivalences here. The heavy
1995 lifing is done by eliminate_redundant_computations. */
1996
1997 static void
1998 record_equivalences_from_stmt (gimple stmt, int may_optimize_p)
1999 {
2000 tree lhs;
2001 enum tree_code lhs_code;
2002
2003 gcc_assert (is_gimple_assign (stmt));
2004
2005 lhs = gimple_assign_lhs (stmt);
2006 lhs_code = TREE_CODE (lhs);
2007
2008 if (lhs_code == SSA_NAME
2009 && gimple_assign_single_p (stmt))
2010 {
2011 tree rhs = gimple_assign_rhs1 (stmt);
2012
2013 /* If the RHS of the assignment is a constant or another variable that
2014 may be propagated, register it in the CONST_AND_COPIES table. We
2015 do not need to record unwind data for this, since this is a true
2016 assignment and not an equivalence inferred from a comparison. All
2017 uses of this ssa name are dominated by this assignment, so unwinding
2018 just costs time and space. */
2019 if (may_optimize_p
2020 && (TREE_CODE (rhs) == SSA_NAME
2021 || is_gimple_min_invariant (rhs)))
2022 {
2023 if (dump_file && (dump_flags & TDF_DETAILS))
2024 {
2025 fprintf (dump_file, "==== ASGN ");
2026 print_generic_expr (dump_file, lhs, 0);
2027 fprintf (dump_file, " = ");
2028 print_generic_expr (dump_file, rhs, 0);
2029 fprintf (dump_file, "\n");
2030 }
2031
2032 set_ssa_name_value (lhs, rhs);
2033 }
2034 }
2035
2036 /* A memory store, even an aliased store, creates a useful
2037 equivalence. By exchanging the LHS and RHS, creating suitable
2038 vops and recording the result in the available expression table,
2039 we may be able to expose more redundant loads. */
2040 if (!gimple_has_volatile_ops (stmt)
2041 && gimple_references_memory_p (stmt)
2042 && gimple_assign_single_p (stmt)
2043 && (TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
2044 || is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))
2045 && !is_gimple_reg (lhs))
2046 {
2047 tree rhs = gimple_assign_rhs1 (stmt);
2048 gimple new_stmt;
2049
2050 /* Build a new statement with the RHS and LHS exchanged. */
2051 if (TREE_CODE (rhs) == SSA_NAME)
2052 {
2053 /* NOTE tuples. The call to gimple_build_assign below replaced
2054 a call to build_gimple_modify_stmt, which did not set the
2055 SSA_NAME_DEF_STMT on the LHS of the assignment. Doing so
2056 may cause an SSA validation failure, as the LHS may be a
2057 default-initialized name and should have no definition. I'm
2058 a bit dubious of this, as the artificial statement that we
2059 generate here may in fact be ill-formed, but it is simply
2060 used as an internal device in this pass, and never becomes
2061 part of the CFG. */
2062 gimple defstmt = SSA_NAME_DEF_STMT (rhs);
2063 new_stmt = gimple_build_assign (rhs, lhs);
2064 SSA_NAME_DEF_STMT (rhs) = defstmt;
2065 }
2066 else
2067 new_stmt = gimple_build_assign (rhs, lhs);
2068
2069 gimple_set_vuse (new_stmt, gimple_vdef (stmt));
2070
2071 /* Finally enter the statement into the available expression
2072 table. */
2073 lookup_avail_expr (new_stmt, true);
2074 }
2075 }
2076
2077 /* Replace *OP_P in STMT with any known equivalent value for *OP_P from
2078 CONST_AND_COPIES. */
2079
2080 static void
2081 cprop_operand (gimple stmt, use_operand_p op_p)
2082 {
2083 tree val;
2084 tree op = USE_FROM_PTR (op_p);
2085
2086 /* If the operand has a known constant value or it is known to be a
2087 copy of some other variable, use the value or copy stored in
2088 CONST_AND_COPIES. */
2089 val = SSA_NAME_VALUE (op);
2090 if (val && val != op)
2091 {
2092 /* Do not replace hard register operands in asm statements. */
2093 if (gimple_code (stmt) == GIMPLE_ASM
2094 && !may_propagate_copy_into_asm (op))
2095 return;
2096
2097 /* Certain operands are not allowed to be copy propagated due
2098 to their interaction with exception handling and some GCC
2099 extensions. */
2100 if (!may_propagate_copy (op, val))
2101 return;
2102
2103 /* Do not propagate addresses that point to volatiles into memory
2104 stmts without volatile operands. */
2105 if (POINTER_TYPE_P (TREE_TYPE (val))
2106 && TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (val)))
2107 && gimple_has_mem_ops (stmt)
2108 && !gimple_has_volatile_ops (stmt))
2109 return;
2110
2111 /* Do not propagate copies if the propagated value is at a deeper loop
2112 depth than the propagatee. Otherwise, this may move loop variant
2113 variables outside of their loops and prevent coalescing
2114 opportunities. If the value was loop invariant, it will be hoisted
2115 by LICM and exposed for copy propagation. */
2116 if (loop_depth_of_name (val) > loop_depth_of_name (op))
2117 return;
2118
2119 /* Do not propagate copies into simple IV increment statements.
2120 See PR23821 for how this can disturb IV analysis. */
2121 if (TREE_CODE (val) != INTEGER_CST
2122 && simple_iv_increment_p (stmt))
2123 return;
2124
2125 /* Dump details. */
2126 if (dump_file && (dump_flags & TDF_DETAILS))
2127 {
2128 fprintf (dump_file, " Replaced '");
2129 print_generic_expr (dump_file, op, dump_flags);
2130 fprintf (dump_file, "' with %s '",
2131 (TREE_CODE (val) != SSA_NAME ? "constant" : "variable"));
2132 print_generic_expr (dump_file, val, dump_flags);
2133 fprintf (dump_file, "'\n");
2134 }
2135
2136 if (TREE_CODE (val) != SSA_NAME)
2137 opt_stats.num_const_prop++;
2138 else
2139 opt_stats.num_copy_prop++;
2140
2141 propagate_value (op_p, val);
2142
2143 /* And note that we modified this statement. This is now
2144 safe, even if we changed virtual operands since we will
2145 rescan the statement and rewrite its operands again. */
2146 gimple_set_modified (stmt, true);
2147 }
2148 }
2149
2150 /* CONST_AND_COPIES is a table which maps an SSA_NAME to the current
2151 known value for that SSA_NAME (or NULL if no value is known).
2152
2153 Propagate values from CONST_AND_COPIES into the uses, vuses and
2154 vdef_ops of STMT. */
2155
2156 static void
2157 cprop_into_stmt (gimple stmt)
2158 {
2159 use_operand_p op_p;
2160 ssa_op_iter iter;
2161
2162 FOR_EACH_SSA_USE_OPERAND (op_p, stmt, iter, SSA_OP_USE)
2163 cprop_operand (stmt, op_p);
2164 }
2165
2166 /* Optimize the statement pointed to by iterator SI.
2167
2168 We try to perform some simplistic global redundancy elimination and
2169 constant propagation:
2170
2171 1- To detect global redundancy, we keep track of expressions that have
2172 been computed in this block and its dominators. If we find that the
2173 same expression is computed more than once, we eliminate repeated
2174 computations by using the target of the first one.
2175
2176 2- Constant values and copy assignments. This is used to do very
2177 simplistic constant and copy propagation. When a constant or copy
2178 assignment is found, we map the value on the RHS of the assignment to
2179 the variable in the LHS in the CONST_AND_COPIES table. */
2180
2181 static void
2182 optimize_stmt (basic_block bb, gimple_stmt_iterator si)
2183 {
2184 gimple stmt, old_stmt;
2185 bool may_optimize_p;
2186 bool modified_p = false;
2187
2188 old_stmt = stmt = gsi_stmt (si);
2189
2190 if (dump_file && (dump_flags & TDF_DETAILS))
2191 {
2192 fprintf (dump_file, "Optimizing statement ");
2193 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
2194 }
2195
2196 if (gimple_code (stmt) == GIMPLE_COND)
2197 canonicalize_comparison (stmt);
2198
2199 update_stmt_if_modified (stmt);
2200 opt_stats.num_stmts++;
2201
2202 /* Const/copy propagate into USES, VUSES and the RHS of VDEFs. */
2203 cprop_into_stmt (stmt);
2204
2205 /* If the statement has been modified with constant replacements,
2206 fold its RHS before checking for redundant computations. */
2207 if (gimple_modified_p (stmt))
2208 {
2209 tree rhs = NULL;
2210
2211 /* Try to fold the statement making sure that STMT is kept
2212 up to date. */
2213 if (fold_stmt (&si))
2214 {
2215 stmt = gsi_stmt (si);
2216 gimple_set_modified (stmt, true);
2217
2218 if (dump_file && (dump_flags & TDF_DETAILS))
2219 {
2220 fprintf (dump_file, " Folded to: ");
2221 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
2222 }
2223 }
2224
2225 /* We only need to consider cases that can yield a gimple operand. */
2226 if (gimple_assign_single_p (stmt))
2227 rhs = gimple_assign_rhs1 (stmt);
2228 else if (gimple_code (stmt) == GIMPLE_GOTO)
2229 rhs = gimple_goto_dest (stmt);
2230 else if (gimple_code (stmt) == GIMPLE_SWITCH)
2231 /* This should never be an ADDR_EXPR. */
2232 rhs = gimple_switch_index (stmt);
2233
2234 if (rhs && TREE_CODE (rhs) == ADDR_EXPR)
2235 recompute_tree_invariant_for_addr_expr (rhs);
2236
2237 /* Indicate that maybe_clean_or_replace_eh_stmt needs to be called,
2238 even if fold_stmt updated the stmt already and thus cleared
2239 gimple_modified_p flag on it. */
2240 modified_p = true;
2241 }
2242
2243 /* Check for redundant computations. Do this optimization only
2244 for assignments that have no volatile ops and conditionals. */
2245 may_optimize_p = (!gimple_has_side_effects (stmt)
2246 && (is_gimple_assign (stmt)
2247 || (is_gimple_call (stmt)
2248 && gimple_call_lhs (stmt) != NULL_TREE)
2249 || gimple_code (stmt) == GIMPLE_COND
2250 || gimple_code (stmt) == GIMPLE_SWITCH));
2251
2252 if (may_optimize_p)
2253 {
2254 if (gimple_code (stmt) == GIMPLE_CALL)
2255 {
2256 /* Resolve __builtin_constant_p. If it hasn't been
2257 folded to integer_one_node by now, it's fairly
2258 certain that the value simply isn't constant. */
2259 tree callee = gimple_call_fndecl (stmt);
2260 if (callee
2261 && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL
2262 && DECL_FUNCTION_CODE (callee) == BUILT_IN_CONSTANT_P)
2263 {
2264 propagate_tree_value_into_stmt (&si, integer_zero_node);
2265 stmt = gsi_stmt (si);
2266 }
2267 }
2268
2269 update_stmt_if_modified (stmt);
2270 eliminate_redundant_computations (&si);
2271 stmt = gsi_stmt (si);
2272
2273 /* Perform simple redundant store elimination. */
2274 if (gimple_assign_single_p (stmt)
2275 && TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME)
2276 {
2277 tree lhs = gimple_assign_lhs (stmt);
2278 tree rhs = gimple_assign_rhs1 (stmt);
2279 tree cached_lhs;
2280 gimple new_stmt;
2281 if (TREE_CODE (rhs) == SSA_NAME)
2282 {
2283 tree tem = SSA_NAME_VALUE (rhs);
2284 if (tem)
2285 rhs = tem;
2286 }
2287 /* Build a new statement with the RHS and LHS exchanged. */
2288 if (TREE_CODE (rhs) == SSA_NAME)
2289 {
2290 gimple defstmt = SSA_NAME_DEF_STMT (rhs);
2291 new_stmt = gimple_build_assign (rhs, lhs);
2292 SSA_NAME_DEF_STMT (rhs) = defstmt;
2293 }
2294 else
2295 new_stmt = gimple_build_assign (rhs, lhs);
2296 gimple_set_vuse (new_stmt, gimple_vuse (stmt));
2297 cached_lhs = lookup_avail_expr (new_stmt, false);
2298 if (cached_lhs
2299 && rhs == cached_lhs)
2300 {
2301 basic_block bb = gimple_bb (stmt);
2302 unlink_stmt_vdef (stmt);
2303 if (gsi_remove (&si, true))
2304 {
2305 bitmap_set_bit (need_eh_cleanup, bb->index);
2306 if (dump_file && (dump_flags & TDF_DETAILS))
2307 fprintf (dump_file, " Flagged to clear EH edges.\n");
2308 }
2309 release_defs (stmt);
2310 return;
2311 }
2312 }
2313 }
2314
2315 /* Record any additional equivalences created by this statement. */
2316 if (is_gimple_assign (stmt))
2317 record_equivalences_from_stmt (stmt, may_optimize_p);
2318
2319 /* If STMT is a COND_EXPR and it was modified, then we may know
2320 where it goes. If that is the case, then mark the CFG as altered.
2321
2322 This will cause us to later call remove_unreachable_blocks and
2323 cleanup_tree_cfg when it is safe to do so. It is not safe to
2324 clean things up here since removal of edges and such can trigger
2325 the removal of PHI nodes, which in turn can release SSA_NAMEs to
2326 the manager.
2327
2328 That's all fine and good, except that once SSA_NAMEs are released
2329 to the manager, we must not call create_ssa_name until all references
2330 to released SSA_NAMEs have been eliminated.
2331
2332 All references to the deleted SSA_NAMEs can not be eliminated until
2333 we remove unreachable blocks.
2334
2335 We can not remove unreachable blocks until after we have completed
2336 any queued jump threading.
2337
2338 We can not complete any queued jump threads until we have taken
2339 appropriate variables out of SSA form. Taking variables out of
2340 SSA form can call create_ssa_name and thus we lose.
2341
2342 Ultimately I suspect we're going to need to change the interface
2343 into the SSA_NAME manager. */
2344 if (gimple_modified_p (stmt) || modified_p)
2345 {
2346 tree val = NULL;
2347
2348 update_stmt_if_modified (stmt);
2349
2350 if (gimple_code (stmt) == GIMPLE_COND)
2351 val = fold_binary_loc (gimple_location (stmt),
2352 gimple_cond_code (stmt), boolean_type_node,
2353 gimple_cond_lhs (stmt), gimple_cond_rhs (stmt));
2354 else if (gimple_code (stmt) == GIMPLE_SWITCH)
2355 val = gimple_switch_index (stmt);
2356
2357 if (val && TREE_CODE (val) == INTEGER_CST && find_taken_edge (bb, val))
2358 cfg_altered = true;
2359
2360 /* If we simplified a statement in such a way as to be shown that it
2361 cannot trap, update the eh information and the cfg to match. */
2362 if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt))
2363 {
2364 bitmap_set_bit (need_eh_cleanup, bb->index);
2365 if (dump_file && (dump_flags & TDF_DETAILS))
2366 fprintf (dump_file, " Flagged to clear EH edges.\n");
2367 }
2368 }
2369 }
2370
2371 /* Search for an existing instance of STMT in the AVAIL_EXPRS table.
2372 If found, return its LHS. Otherwise insert STMT in the table and
2373 return NULL_TREE.
2374
2375 Also, when an expression is first inserted in the table, it is also
2376 is also added to AVAIL_EXPRS_STACK, so that it can be removed when
2377 we finish processing this block and its children. */
2378
2379 static tree
2380 lookup_avail_expr (gimple stmt, bool insert)
2381 {
2382 void **slot;
2383 tree lhs;
2384 tree temp;
2385 struct expr_hash_elt element;
2386
2387 /* Get LHS of phi, assignment, or call; else NULL_TREE. */
2388 if (gimple_code (stmt) == GIMPLE_PHI)
2389 lhs = gimple_phi_result (stmt);
2390 else
2391 lhs = gimple_get_lhs (stmt);
2392
2393 initialize_hash_element (stmt, lhs, &element);
2394
2395 if (dump_file && (dump_flags & TDF_DETAILS))
2396 {
2397 fprintf (dump_file, "LKUP ");
2398 print_expr_hash_elt (dump_file, &element);
2399 }
2400
2401 /* Don't bother remembering constant assignments and copy operations.
2402 Constants and copy operations are handled by the constant/copy propagator
2403 in optimize_stmt. */
2404 if (element.expr.kind == EXPR_SINGLE
2405 && (TREE_CODE (element.expr.ops.single.rhs) == SSA_NAME
2406 || is_gimple_min_invariant (element.expr.ops.single.rhs)))
2407 return NULL_TREE;
2408
2409 /* Finally try to find the expression in the main expression hash table. */
2410 slot = htab_find_slot_with_hash (avail_exprs, &element, element.hash,
2411 (insert ? INSERT : NO_INSERT));
2412 if (slot == NULL)
2413 {
2414 free_expr_hash_elt_contents (&element);
2415 return NULL_TREE;
2416 }
2417 else if (*slot == NULL)
2418 {
2419 struct expr_hash_elt *element2 = XNEW (struct expr_hash_elt);
2420 *element2 = element;
2421 element2->stamp = element2;
2422 *slot = (void *) element2;
2423
2424 if (dump_file && (dump_flags & TDF_DETAILS))
2425 {
2426 fprintf (dump_file, "2>>> ");
2427 print_expr_hash_elt (dump_file, element2);
2428 }
2429
2430 VEC_safe_push (expr_hash_elt_t, heap, avail_exprs_stack, element2);
2431 return NULL_TREE;
2432 }
2433 else
2434 free_expr_hash_elt_contents (&element);
2435
2436 /* Extract the LHS of the assignment so that it can be used as the current
2437 definition of another variable. */
2438 lhs = ((struct expr_hash_elt *)*slot)->lhs;
2439
2440 /* See if the LHS appears in the CONST_AND_COPIES table. If it does, then
2441 use the value from the const_and_copies table. */
2442 if (TREE_CODE (lhs) == SSA_NAME)
2443 {
2444 temp = SSA_NAME_VALUE (lhs);
2445 if (temp)
2446 lhs = temp;
2447 }
2448
2449 if (dump_file && (dump_flags & TDF_DETAILS))
2450 {
2451 fprintf (dump_file, "FIND: ");
2452 print_generic_expr (dump_file, lhs, 0);
2453 fprintf (dump_file, "\n");
2454 }
2455
2456 return lhs;
2457 }
2458
2459 /* Hashing and equality functions for AVAIL_EXPRS. We compute a value number
2460 for expressions using the code of the expression and the SSA numbers of
2461 its operands. */
2462
2463 static hashval_t
2464 avail_expr_hash (const void *p)
2465 {
2466 gimple stmt = ((const struct expr_hash_elt *)p)->stmt;
2467 const struct hashable_expr *expr = &((const struct expr_hash_elt *)p)->expr;
2468 tree vuse;
2469 hashval_t val = 0;
2470
2471 val = iterative_hash_hashable_expr (expr, val);
2472
2473 /* If the hash table entry is not associated with a statement, then we
2474 can just hash the expression and not worry about virtual operands
2475 and such. */
2476 if (!stmt)
2477 return val;
2478
2479 /* Add the SSA version numbers of the vuse operand. This is important
2480 because compound variables like arrays are not renamed in the
2481 operands. Rather, the rename is done on the virtual variable
2482 representing all the elements of the array. */
2483 if ((vuse = gimple_vuse (stmt)))
2484 val = iterative_hash_expr (vuse, val);
2485
2486 return val;
2487 }
2488
2489 static hashval_t
2490 real_avail_expr_hash (const void *p)
2491 {
2492 return ((const struct expr_hash_elt *)p)->hash;
2493 }
2494
2495 static int
2496 avail_expr_eq (const void *p1, const void *p2)
2497 {
2498 gimple stmt1 = ((const struct expr_hash_elt *)p1)->stmt;
2499 const struct hashable_expr *expr1 = &((const struct expr_hash_elt *)p1)->expr;
2500 const struct expr_hash_elt *stamp1 = ((const struct expr_hash_elt *)p1)->stamp;
2501 gimple stmt2 = ((const struct expr_hash_elt *)p2)->stmt;
2502 const struct hashable_expr *expr2 = &((const struct expr_hash_elt *)p2)->expr;
2503 const struct expr_hash_elt *stamp2 = ((const struct expr_hash_elt *)p2)->stamp;
2504
2505 /* This case should apply only when removing entries from the table. */
2506 if (stamp1 == stamp2)
2507 return true;
2508
2509 /* FIXME tuples:
2510 We add stmts to a hash table and them modify them. To detect the case
2511 that we modify a stmt and then search for it, we assume that the hash
2512 is always modified by that change.
2513 We have to fully check why this doesn't happen on trunk or rewrite
2514 this in a more reliable (and easier to understand) way. */
2515 if (((const struct expr_hash_elt *)p1)->hash
2516 != ((const struct expr_hash_elt *)p2)->hash)
2517 return false;
2518
2519 /* In case of a collision, both RHS have to be identical and have the
2520 same VUSE operands. */
2521 if (hashable_expr_equal_p (expr1, expr2)
2522 && types_compatible_p (expr1->type, expr2->type))
2523 {
2524 /* Note that STMT1 and/or STMT2 may be NULL. */
2525 return ((stmt1 ? gimple_vuse (stmt1) : NULL_TREE)
2526 == (stmt2 ? gimple_vuse (stmt2) : NULL_TREE));
2527 }
2528
2529 return false;
2530 }
2531
2532 /* PHI-ONLY copy and constant propagation. This pass is meant to clean
2533 up degenerate PHIs created by or exposed by jump threading. */
2534
2535 /* Given PHI, return its RHS if the PHI is a degenerate, otherwise return
2536 NULL. */
2537
2538 tree
2539 degenerate_phi_result (gimple phi)
2540 {
2541 tree lhs = gimple_phi_result (phi);
2542 tree val = NULL;
2543 size_t i;
2544
2545 /* Ignoring arguments which are the same as LHS, if all the remaining
2546 arguments are the same, then the PHI is a degenerate and has the
2547 value of that common argument. */
2548 for (i = 0; i < gimple_phi_num_args (phi); i++)
2549 {
2550 tree arg = gimple_phi_arg_def (phi, i);
2551
2552 if (arg == lhs)
2553 continue;
2554 else if (!arg)
2555 break;
2556 else if (!val)
2557 val = arg;
2558 else if (arg == val)
2559 continue;
2560 /* We bring in some of operand_equal_p not only to speed things
2561 up, but also to avoid crashing when dereferencing the type of
2562 a released SSA name. */
2563 else if (TREE_CODE (val) != TREE_CODE (arg)
2564 || TREE_CODE (val) == SSA_NAME
2565 || !operand_equal_p (arg, val, 0))
2566 break;
2567 }
2568 return (i == gimple_phi_num_args (phi) ? val : NULL);
2569 }
2570
2571 /* Given a statement STMT, which is either a PHI node or an assignment,
2572 remove it from the IL. */
2573
2574 static void
2575 remove_stmt_or_phi (gimple stmt)
2576 {
2577 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
2578
2579 if (gimple_code (stmt) == GIMPLE_PHI)
2580 remove_phi_node (&gsi, true);
2581 else
2582 {
2583 gsi_remove (&gsi, true);
2584 release_defs (stmt);
2585 }
2586 }
2587
2588 /* Given a statement STMT, which is either a PHI node or an assignment,
2589 return the "rhs" of the node, in the case of a non-degenerate
2590 phi, NULL is returned. */
2591
2592 static tree
2593 get_rhs_or_phi_arg (gimple stmt)
2594 {
2595 if (gimple_code (stmt) == GIMPLE_PHI)
2596 return degenerate_phi_result (stmt);
2597 else if (gimple_assign_single_p (stmt))
2598 return gimple_assign_rhs1 (stmt);
2599 else
2600 gcc_unreachable ();
2601 }
2602
2603
2604 /* Given a statement STMT, which is either a PHI node or an assignment,
2605 return the "lhs" of the node. */
2606
2607 static tree
2608 get_lhs_or_phi_result (gimple stmt)
2609 {
2610 if (gimple_code (stmt) == GIMPLE_PHI)
2611 return gimple_phi_result (stmt);
2612 else if (is_gimple_assign (stmt))
2613 return gimple_assign_lhs (stmt);
2614 else
2615 gcc_unreachable ();
2616 }
2617
2618 /* Propagate RHS into all uses of LHS (when possible).
2619
2620 RHS and LHS are derived from STMT, which is passed in solely so
2621 that we can remove it if propagation is successful.
2622
2623 When propagating into a PHI node or into a statement which turns
2624 into a trivial copy or constant initialization, set the
2625 appropriate bit in INTERESTING_NAMEs so that we will visit those
2626 nodes as well in an effort to pick up secondary optimization
2627 opportunities. */
2628
2629 static void
2630 propagate_rhs_into_lhs (gimple stmt, tree lhs, tree rhs, bitmap interesting_names)
2631 {
2632 /* First verify that propagation is valid and isn't going to move a
2633 loop variant variable outside its loop. */
2634 if (! SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs)
2635 && (TREE_CODE (rhs) != SSA_NAME
2636 || ! SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs))
2637 && may_propagate_copy (lhs, rhs)
2638 && loop_depth_of_name (lhs) >= loop_depth_of_name (rhs))
2639 {
2640 use_operand_p use_p;
2641 imm_use_iterator iter;
2642 gimple use_stmt;
2643 bool all = true;
2644
2645 /* Dump details. */
2646 if (dump_file && (dump_flags & TDF_DETAILS))
2647 {
2648 fprintf (dump_file, " Replacing '");
2649 print_generic_expr (dump_file, lhs, dump_flags);
2650 fprintf (dump_file, "' with %s '",
2651 (TREE_CODE (rhs) != SSA_NAME ? "constant" : "variable"));
2652 print_generic_expr (dump_file, rhs, dump_flags);
2653 fprintf (dump_file, "'\n");
2654 }
2655
2656 /* Walk over every use of LHS and try to replace the use with RHS.
2657 At this point the only reason why such a propagation would not
2658 be successful would be if the use occurs in an ASM_EXPR. */
2659 FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs)
2660 {
2661 /* Leave debug stmts alone. If we succeed in propagating
2662 all non-debug uses, we'll drop the DEF, and propagation
2663 into debug stmts will occur then. */
2664 if (gimple_debug_bind_p (use_stmt))
2665 continue;
2666
2667 /* It's not always safe to propagate into an ASM_EXPR. */
2668 if (gimple_code (use_stmt) == GIMPLE_ASM
2669 && ! may_propagate_copy_into_asm (lhs))
2670 {
2671 all = false;
2672 continue;
2673 }
2674
2675 /* It's not ok to propagate into the definition stmt of RHS.
2676 <bb 9>:
2677 # prephitmp.12_36 = PHI <g_67.1_6(9)>
2678 g_67.1_6 = prephitmp.12_36;
2679 goto <bb 9>;
2680 While this is strictly all dead code we do not want to
2681 deal with this here. */
2682 if (TREE_CODE (rhs) == SSA_NAME
2683 && SSA_NAME_DEF_STMT (rhs) == use_stmt)
2684 {
2685 all = false;
2686 continue;
2687 }
2688
2689 /* Dump details. */
2690 if (dump_file && (dump_flags & TDF_DETAILS))
2691 {
2692 fprintf (dump_file, " Original statement:");
2693 print_gimple_stmt (dump_file, use_stmt, 0, dump_flags);
2694 }
2695
2696 /* Propagate the RHS into this use of the LHS. */
2697 FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
2698 propagate_value (use_p, rhs);
2699
2700 /* Special cases to avoid useless calls into the folding
2701 routines, operand scanning, etc.
2702
2703 Propagation into a PHI may cause the PHI to become
2704 a degenerate, so mark the PHI as interesting. No other
2705 actions are necessary. */
2706 if (gimple_code (use_stmt) == GIMPLE_PHI)
2707 {
2708 tree result;
2709
2710 /* Dump details. */
2711 if (dump_file && (dump_flags & TDF_DETAILS))
2712 {
2713 fprintf (dump_file, " Updated statement:");
2714 print_gimple_stmt (dump_file, use_stmt, 0, dump_flags);
2715 }
2716
2717 result = get_lhs_or_phi_result (use_stmt);
2718 bitmap_set_bit (interesting_names, SSA_NAME_VERSION (result));
2719 continue;
2720 }
2721
2722 /* From this point onward we are propagating into a
2723 real statement. Folding may (or may not) be possible,
2724 we may expose new operands, expose dead EH edges,
2725 etc. */
2726 /* NOTE tuples. In the tuples world, fold_stmt_inplace
2727 cannot fold a call that simplifies to a constant,
2728 because the GIMPLE_CALL must be replaced by a
2729 GIMPLE_ASSIGN, and there is no way to effect such a
2730 transformation in-place. We might want to consider
2731 using the more general fold_stmt here. */
2732 {
2733 gimple_stmt_iterator gsi = gsi_for_stmt (use_stmt);
2734 fold_stmt_inplace (&gsi);
2735 }
2736
2737 /* Sometimes propagation can expose new operands to the
2738 renamer. */
2739 update_stmt (use_stmt);
2740
2741 /* Dump details. */
2742 if (dump_file && (dump_flags & TDF_DETAILS))
2743 {
2744 fprintf (dump_file, " Updated statement:");
2745 print_gimple_stmt (dump_file, use_stmt, 0, dump_flags);
2746 }
2747
2748 /* If we replaced a variable index with a constant, then
2749 we would need to update the invariant flag for ADDR_EXPRs. */
2750 if (gimple_assign_single_p (use_stmt)
2751 && TREE_CODE (gimple_assign_rhs1 (use_stmt)) == ADDR_EXPR)
2752 recompute_tree_invariant_for_addr_expr
2753 (gimple_assign_rhs1 (use_stmt));
2754
2755 /* If we cleaned up EH information from the statement,
2756 mark its containing block as needing EH cleanups. */
2757 if (maybe_clean_or_replace_eh_stmt (use_stmt, use_stmt))
2758 {
2759 bitmap_set_bit (need_eh_cleanup, gimple_bb (use_stmt)->index);
2760 if (dump_file && (dump_flags & TDF_DETAILS))
2761 fprintf (dump_file, " Flagged to clear EH edges.\n");
2762 }
2763
2764 /* Propagation may expose new trivial copy/constant propagation
2765 opportunities. */
2766 if (gimple_assign_single_p (use_stmt)
2767 && TREE_CODE (gimple_assign_lhs (use_stmt)) == SSA_NAME
2768 && (TREE_CODE (gimple_assign_rhs1 (use_stmt)) == SSA_NAME
2769 || is_gimple_min_invariant (gimple_assign_rhs1 (use_stmt))))
2770 {
2771 tree result = get_lhs_or_phi_result (use_stmt);
2772 bitmap_set_bit (interesting_names, SSA_NAME_VERSION (result));
2773 }
2774
2775 /* Propagation into these nodes may make certain edges in
2776 the CFG unexecutable. We want to identify them as PHI nodes
2777 at the destination of those unexecutable edges may become
2778 degenerates. */
2779 else if (gimple_code (use_stmt) == GIMPLE_COND
2780 || gimple_code (use_stmt) == GIMPLE_SWITCH
2781 || gimple_code (use_stmt) == GIMPLE_GOTO)
2782 {
2783 tree val;
2784
2785 if (gimple_code (use_stmt) == GIMPLE_COND)
2786 val = fold_binary_loc (gimple_location (use_stmt),
2787 gimple_cond_code (use_stmt),
2788 boolean_type_node,
2789 gimple_cond_lhs (use_stmt),
2790 gimple_cond_rhs (use_stmt));
2791 else if (gimple_code (use_stmt) == GIMPLE_SWITCH)
2792 val = gimple_switch_index (use_stmt);
2793 else
2794 val = gimple_goto_dest (use_stmt);
2795
2796 if (val && is_gimple_min_invariant (val))
2797 {
2798 basic_block bb = gimple_bb (use_stmt);
2799 edge te = find_taken_edge (bb, val);
2800 edge_iterator ei;
2801 edge e;
2802 gimple_stmt_iterator gsi, psi;
2803
2804 /* Remove all outgoing edges except TE. */
2805 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei));)
2806 {
2807 if (e != te)
2808 {
2809 /* Mark all the PHI nodes at the destination of
2810 the unexecutable edge as interesting. */
2811 for (psi = gsi_start_phis (e->dest);
2812 !gsi_end_p (psi);
2813 gsi_next (&psi))
2814 {
2815 gimple phi = gsi_stmt (psi);
2816
2817 tree result = gimple_phi_result (phi);
2818 int version = SSA_NAME_VERSION (result);
2819
2820 bitmap_set_bit (interesting_names, version);
2821 }
2822
2823 te->probability += e->probability;
2824
2825 te->count += e->count;
2826 remove_edge (e);
2827 cfg_altered = true;
2828 }
2829 else
2830 ei_next (&ei);
2831 }
2832
2833 gsi = gsi_last_bb (gimple_bb (use_stmt));
2834 gsi_remove (&gsi, true);
2835
2836 /* And fixup the flags on the single remaining edge. */
2837 te->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
2838 te->flags &= ~EDGE_ABNORMAL;
2839 te->flags |= EDGE_FALLTHRU;
2840 if (te->probability > REG_BR_PROB_BASE)
2841 te->probability = REG_BR_PROB_BASE;
2842 }
2843 }
2844 }
2845
2846 /* Ensure there is nothing else to do. */
2847 gcc_assert (!all || has_zero_uses (lhs));
2848
2849 /* If we were able to propagate away all uses of LHS, then
2850 we can remove STMT. */
2851 if (all)
2852 remove_stmt_or_phi (stmt);
2853 }
2854 }
2855
2856 /* STMT is either a PHI node (potentially a degenerate PHI node) or
2857 a statement that is a trivial copy or constant initialization.
2858
2859 Attempt to eliminate T by propagating its RHS into all uses of
2860 its LHS. This may in turn set new bits in INTERESTING_NAMES
2861 for nodes we want to revisit later.
2862
2863 All exit paths should clear INTERESTING_NAMES for the result
2864 of STMT. */
2865
2866 static void
2867 eliminate_const_or_copy (gimple stmt, bitmap interesting_names)
2868 {
2869 tree lhs = get_lhs_or_phi_result (stmt);
2870 tree rhs;
2871 int version = SSA_NAME_VERSION (lhs);
2872
2873 /* If the LHS of this statement or PHI has no uses, then we can
2874 just eliminate it. This can occur if, for example, the PHI
2875 was created by block duplication due to threading and its only
2876 use was in the conditional at the end of the block which was
2877 deleted. */
2878 if (has_zero_uses (lhs))
2879 {
2880 bitmap_clear_bit (interesting_names, version);
2881 remove_stmt_or_phi (stmt);
2882 return;
2883 }
2884
2885 /* Get the RHS of the assignment or PHI node if the PHI is a
2886 degenerate. */
2887 rhs = get_rhs_or_phi_arg (stmt);
2888 if (!rhs)
2889 {
2890 bitmap_clear_bit (interesting_names, version);
2891 return;
2892 }
2893
2894 propagate_rhs_into_lhs (stmt, lhs, rhs, interesting_names);
2895
2896 /* Note that STMT may well have been deleted by now, so do
2897 not access it, instead use the saved version # to clear
2898 T's entry in the worklist. */
2899 bitmap_clear_bit (interesting_names, version);
2900 }
2901
2902 /* The first phase in degenerate PHI elimination.
2903
2904 Eliminate the degenerate PHIs in BB, then recurse on the
2905 dominator children of BB. */
2906
2907 static void
2908 eliminate_degenerate_phis_1 (basic_block bb, bitmap interesting_names)
2909 {
2910 gimple_stmt_iterator gsi;
2911 basic_block son;
2912
2913 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2914 {
2915 gimple phi = gsi_stmt (gsi);
2916
2917 eliminate_const_or_copy (phi, interesting_names);
2918 }
2919
2920 /* Recurse into the dominator children of BB. */
2921 for (son = first_dom_son (CDI_DOMINATORS, bb);
2922 son;
2923 son = next_dom_son (CDI_DOMINATORS, son))
2924 eliminate_degenerate_phis_1 (son, interesting_names);
2925 }
2926
2927
2928 /* A very simple pass to eliminate degenerate PHI nodes from the
2929 IL. This is meant to be fast enough to be able to be run several
2930 times in the optimization pipeline.
2931
2932 Certain optimizations, particularly those which duplicate blocks
2933 or remove edges from the CFG can create or expose PHIs which are
2934 trivial copies or constant initializations.
2935
2936 While we could pick up these optimizations in DOM or with the
2937 combination of copy-prop and CCP, those solutions are far too
2938 heavy-weight for our needs.
2939
2940 This implementation has two phases so that we can efficiently
2941 eliminate the first order degenerate PHIs and second order
2942 degenerate PHIs.
2943
2944 The first phase performs a dominator walk to identify and eliminate
2945 the vast majority of the degenerate PHIs. When a degenerate PHI
2946 is identified and eliminated any affected statements or PHIs
2947 are put on a worklist.
2948
2949 The second phase eliminates degenerate PHIs and trivial copies
2950 or constant initializations using the worklist. This is how we
2951 pick up the secondary optimization opportunities with minimal
2952 cost. */
2953
2954 static unsigned int
2955 eliminate_degenerate_phis (void)
2956 {
2957 bitmap interesting_names;
2958 bitmap interesting_names1;
2959
2960 /* Bitmap of blocks which need EH information updated. We can not
2961 update it on-the-fly as doing so invalidates the dominator tree. */
2962 need_eh_cleanup = BITMAP_ALLOC (NULL);
2963
2964 /* INTERESTING_NAMES is effectively our worklist, indexed by
2965 SSA_NAME_VERSION.
2966
2967 A set bit indicates that the statement or PHI node which
2968 defines the SSA_NAME should be (re)examined to determine if
2969 it has become a degenerate PHI or trivial const/copy propagation
2970 opportunity.
2971
2972 Experiments have show we generally get better compilation
2973 time behavior with bitmaps rather than sbitmaps. */
2974 interesting_names = BITMAP_ALLOC (NULL);
2975 interesting_names1 = BITMAP_ALLOC (NULL);
2976
2977 calculate_dominance_info (CDI_DOMINATORS);
2978 cfg_altered = false;
2979
2980 /* First phase. Eliminate degenerate PHIs via a dominator
2981 walk of the CFG.
2982
2983 Experiments have indicated that we generally get better
2984 compile-time behavior by visiting blocks in the first
2985 phase in dominator order. Presumably this is because walking
2986 in dominator order leaves fewer PHIs for later examination
2987 by the worklist phase. */
2988 eliminate_degenerate_phis_1 (ENTRY_BLOCK_PTR, interesting_names);
2989
2990 /* Second phase. Eliminate second order degenerate PHIs as well
2991 as trivial copies or constant initializations identified by
2992 the first phase or this phase. Basically we keep iterating
2993 until our set of INTERESTING_NAMEs is empty. */
2994 while (!bitmap_empty_p (interesting_names))
2995 {
2996 unsigned int i;
2997 bitmap_iterator bi;
2998
2999 /* EXECUTE_IF_SET_IN_BITMAP does not like its bitmap
3000 changed during the loop. Copy it to another bitmap and
3001 use that. */
3002 bitmap_copy (interesting_names1, interesting_names);
3003
3004 EXECUTE_IF_SET_IN_BITMAP (interesting_names1, 0, i, bi)
3005 {
3006 tree name = ssa_name (i);
3007
3008 /* Ignore SSA_NAMEs that have been released because
3009 their defining statement was deleted (unreachable). */
3010 if (name)
3011 eliminate_const_or_copy (SSA_NAME_DEF_STMT (ssa_name (i)),
3012 interesting_names);
3013 }
3014 }
3015
3016 if (cfg_altered)
3017 free_dominance_info (CDI_DOMINATORS);
3018
3019 /* Propagation of const and copies may make some EH edges dead. Purge
3020 such edges from the CFG as needed. */
3021 if (!bitmap_empty_p (need_eh_cleanup))
3022 {
3023 gimple_purge_all_dead_eh_edges (need_eh_cleanup);
3024 BITMAP_FREE (need_eh_cleanup);
3025 }
3026
3027 BITMAP_FREE (interesting_names);
3028 BITMAP_FREE (interesting_names1);
3029 return 0;
3030 }
3031
3032 struct gimple_opt_pass pass_phi_only_cprop =
3033 {
3034 {
3035 GIMPLE_PASS,
3036 "phicprop", /* name */
3037 OPTGROUP_NONE, /* optinfo_flags */
3038 gate_dominator, /* gate */
3039 eliminate_degenerate_phis, /* execute */
3040 NULL, /* sub */
3041 NULL, /* next */
3042 0, /* static_pass_number */
3043 TV_TREE_PHI_CPROP, /* tv_id */
3044 PROP_cfg | PROP_ssa, /* properties_required */
3045 0, /* properties_provided */
3046 0, /* properties_destroyed */
3047 0, /* todo_flags_start */
3048 TODO_cleanup_cfg
3049 | TODO_ggc_collect
3050 | TODO_verify_ssa
3051 | TODO_verify_stmts
3052 | TODO_update_ssa /* todo_flags_finish */
3053 }
3054 };