jit: document union types
[official-gcc.git] / gcc / tree-ssa-dom.c
blobe45b78c411aa9f9c8f486763ec6a6a3748a5be4d
1 /* SSA Dominator optimizations for trees
2 Copyright (C) 2001-2015 Free Software Foundation, Inc.
3 Contributed by Diego Novillo <dnovillo@redhat.com>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "alias.h"
26 #include "symtab.h"
27 #include "tree.h"
28 #include "fold-const.h"
29 #include "stor-layout.h"
30 #include "flags.h"
31 #include "tm_p.h"
32 #include "predict.h"
33 #include "hard-reg-set.h"
34 #include "function.h"
35 #include "dominance.h"
36 #include "cfg.h"
37 #include "cfganal.h"
38 #include "basic-block.h"
39 #include "cfgloop.h"
40 #include "gimple-pretty-print.h"
41 #include "tree-ssa-alias.h"
42 #include "internal-fn.h"
43 #include "gimple-fold.h"
44 #include "tree-eh.h"
45 #include "gimple-expr.h"
46 #include "gimple.h"
47 #include "gimple-iterator.h"
48 #include "gimple-ssa.h"
49 #include "tree-cfg.h"
50 #include "tree-phinodes.h"
51 #include "ssa-iterators.h"
52 #include "stringpool.h"
53 #include "tree-ssanames.h"
54 #include "tree-into-ssa.h"
55 #include "domwalk.h"
56 #include "tree-pass.h"
57 #include "tree-ssa-propagate.h"
58 #include "tree-ssa-threadupdate.h"
59 #include "langhooks.h"
60 #include "params.h"
61 #include "tree-ssa-scopedtables.h"
62 #include "tree-ssa-threadedge.h"
63 #include "tree-ssa-dom.h"
64 #include "gimplify.h"
65 #include "tree-cfgcleanup.h"
67 /* This file implements optimizations on the dominator tree. */
69 /* Representation of a "naked" right-hand-side expression, to be used
70 in recording available expressions in the expression hash table. */
72 enum expr_kind
74 EXPR_SINGLE,
75 EXPR_UNARY,
76 EXPR_BINARY,
77 EXPR_TERNARY,
78 EXPR_CALL,
79 EXPR_PHI
82 struct hashable_expr
84 tree type;
85 enum expr_kind kind;
86 union {
87 struct { tree rhs; } single;
88 struct { enum tree_code op; tree opnd; } unary;
89 struct { enum tree_code op; tree opnd0, opnd1; } binary;
90 struct { enum tree_code op; tree opnd0, opnd1, opnd2; } ternary;
91 struct { gcall *fn_from; bool pure; size_t nargs; tree *args; } call;
92 struct { size_t nargs; tree *args; } phi;
93 } ops;
96 /* Structure for recording known values of a conditional expression
97 at the exits from its block. */
99 typedef struct cond_equivalence_s
101 struct hashable_expr cond;
102 tree value;
103 } cond_equivalence;
106 /* Structure for recording edge equivalences as well as any pending
107 edge redirections during the dominator optimizer.
109 Computing and storing the edge equivalences instead of creating
110 them on-demand can save significant amounts of time, particularly
111 for pathological cases involving switch statements.
113 These structures live for a single iteration of the dominator
114 optimizer in the edge's AUX field. At the end of an iteration we
115 free each of these structures and update the AUX field to point
116 to any requested redirection target (the code for updating the
117 CFG and SSA graph for edge redirection expects redirection edge
118 targets to be in the AUX field for each edge. */
120 struct edge_info
122 /* If this edge creates a simple equivalence, the LHS and RHS of
123 the equivalence will be stored here. */
124 tree lhs;
125 tree rhs;
127 /* Traversing an edge may also indicate one or more particular conditions
128 are true or false. */
129 vec<cond_equivalence> cond_equivalences;
132 /* Stack of available expressions in AVAIL_EXPRs. Each block pushes any
133 expressions it enters into the hash table along with a marker entry
134 (null). When we finish processing the block, we pop off entries and
135 remove the expressions from the global hash table until we hit the
136 marker. */
137 typedef struct expr_hash_elt * expr_hash_elt_t;
139 static vec<std::pair<expr_hash_elt_t, expr_hash_elt_t> > avail_exprs_stack;
141 /* Structure for entries in the expression hash table. */
143 struct expr_hash_elt
145 /* The value (lhs) of this expression. */
146 tree lhs;
148 /* The expression (rhs) we want to record. */
149 struct hashable_expr expr;
151 /* The virtual operand associated with the nearest dominating stmt
152 loading from or storing to expr. */
153 tree vop;
155 /* The hash value for RHS. */
156 hashval_t hash;
158 /* A unique stamp, typically the address of the hash
159 element itself, used in removing entries from the table. */
160 struct expr_hash_elt *stamp;
163 /* Hashtable helpers. */
165 static bool hashable_expr_equal_p (const struct hashable_expr *,
166 const struct hashable_expr *);
167 static void free_expr_hash_elt (void *);
169 struct expr_elt_hasher : pointer_hash <expr_hash_elt>
171 static inline hashval_t hash (const value_type &);
172 static inline bool equal (const value_type &, const compare_type &);
173 static inline void remove (value_type &);
176 inline hashval_t
177 expr_elt_hasher::hash (const value_type &p)
179 return p->hash;
182 inline bool
183 expr_elt_hasher::equal (const value_type &p1, const compare_type &p2)
185 const struct hashable_expr *expr1 = &p1->expr;
186 const struct expr_hash_elt *stamp1 = p1->stamp;
187 const struct hashable_expr *expr2 = &p2->expr;
188 const struct expr_hash_elt *stamp2 = p2->stamp;
190 /* This case should apply only when removing entries from the table. */
191 if (stamp1 == stamp2)
192 return true;
194 if (p1->hash != p2->hash)
195 return false;
197 /* In case of a collision, both RHS have to be identical and have the
198 same VUSE operands. */
199 if (hashable_expr_equal_p (expr1, expr2)
200 && types_compatible_p (expr1->type, expr2->type))
201 return true;
203 return false;
206 /* Delete an expr_hash_elt and reclaim its storage. */
208 inline void
209 expr_elt_hasher::remove (value_type &element)
211 free_expr_hash_elt (element);
214 /* Hash table with expressions made available during the renaming process.
215 When an assignment of the form X_i = EXPR is found, the statement is
216 stored in this table. If the same expression EXPR is later found on the
217 RHS of another statement, it is replaced with X_i (thus performing
218 global redundancy elimination). Similarly as we pass through conditionals
219 we record the conditional itself as having either a true or false value
220 in this table. */
221 static hash_table<expr_elt_hasher> *avail_exprs;
223 /* Unwindable const/copy equivalences. */
224 static const_and_copies *const_and_copies;
226 /* Track whether or not we have changed the control flow graph. */
227 static bool cfg_altered;
229 /* Bitmap of blocks that have had EH statements cleaned. We should
230 remove their dead edges eventually. */
231 static bitmap need_eh_cleanup;
232 static vec<gimple> need_noreturn_fixup;
234 /* Statistics for dominator optimizations. */
235 struct opt_stats_d
237 long num_stmts;
238 long num_exprs_considered;
239 long num_re;
240 long num_const_prop;
241 long num_copy_prop;
244 static struct opt_stats_d opt_stats;
246 /* Local functions. */
247 static void optimize_stmt (basic_block, gimple_stmt_iterator);
248 static tree lookup_avail_expr (gimple, bool);
249 static hashval_t avail_expr_hash (const void *);
250 static void htab_statistics (FILE *,
251 const hash_table<expr_elt_hasher> &);
252 static void record_cond (cond_equivalence *);
253 static void record_equality (tree, tree);
254 static void record_equivalences_from_phis (basic_block);
255 static void record_equivalences_from_incoming_edge (basic_block);
256 static void eliminate_redundant_computations (gimple_stmt_iterator *);
257 static void record_equivalences_from_stmt (gimple, int);
258 static void remove_local_expressions_from_table (void);
259 static edge single_incoming_edge_ignoring_loop_edges (basic_block);
262 /* Given a statement STMT, initialize the hash table element pointed to
263 by ELEMENT. */
265 static void
266 initialize_hash_element (gimple stmt, tree lhs,
267 struct expr_hash_elt *element)
269 enum gimple_code code = gimple_code (stmt);
270 struct hashable_expr *expr = &element->expr;
272 if (code == GIMPLE_ASSIGN)
274 enum tree_code subcode = gimple_assign_rhs_code (stmt);
276 switch (get_gimple_rhs_class (subcode))
278 case GIMPLE_SINGLE_RHS:
279 expr->kind = EXPR_SINGLE;
280 expr->type = TREE_TYPE (gimple_assign_rhs1 (stmt));
281 expr->ops.single.rhs = gimple_assign_rhs1 (stmt);
282 break;
283 case GIMPLE_UNARY_RHS:
284 expr->kind = EXPR_UNARY;
285 expr->type = TREE_TYPE (gimple_assign_lhs (stmt));
286 if (CONVERT_EXPR_CODE_P (subcode))
287 subcode = NOP_EXPR;
288 expr->ops.unary.op = subcode;
289 expr->ops.unary.opnd = gimple_assign_rhs1 (stmt);
290 break;
291 case GIMPLE_BINARY_RHS:
292 expr->kind = EXPR_BINARY;
293 expr->type = TREE_TYPE (gimple_assign_lhs (stmt));
294 expr->ops.binary.op = subcode;
295 expr->ops.binary.opnd0 = gimple_assign_rhs1 (stmt);
296 expr->ops.binary.opnd1 = gimple_assign_rhs2 (stmt);
297 break;
298 case GIMPLE_TERNARY_RHS:
299 expr->kind = EXPR_TERNARY;
300 expr->type = TREE_TYPE (gimple_assign_lhs (stmt));
301 expr->ops.ternary.op = subcode;
302 expr->ops.ternary.opnd0 = gimple_assign_rhs1 (stmt);
303 expr->ops.ternary.opnd1 = gimple_assign_rhs2 (stmt);
304 expr->ops.ternary.opnd2 = gimple_assign_rhs3 (stmt);
305 break;
306 default:
307 gcc_unreachable ();
310 else if (code == GIMPLE_COND)
312 expr->type = boolean_type_node;
313 expr->kind = EXPR_BINARY;
314 expr->ops.binary.op = gimple_cond_code (stmt);
315 expr->ops.binary.opnd0 = gimple_cond_lhs (stmt);
316 expr->ops.binary.opnd1 = gimple_cond_rhs (stmt);
318 else if (gcall *call_stmt = dyn_cast <gcall *> (stmt))
320 size_t nargs = gimple_call_num_args (call_stmt);
321 size_t i;
323 gcc_assert (gimple_call_lhs (call_stmt));
325 expr->type = TREE_TYPE (gimple_call_lhs (call_stmt));
326 expr->kind = EXPR_CALL;
327 expr->ops.call.fn_from = call_stmt;
329 if (gimple_call_flags (call_stmt) & (ECF_CONST | ECF_PURE))
330 expr->ops.call.pure = true;
331 else
332 expr->ops.call.pure = false;
334 expr->ops.call.nargs = nargs;
335 expr->ops.call.args = XCNEWVEC (tree, nargs);
336 for (i = 0; i < nargs; i++)
337 expr->ops.call.args[i] = gimple_call_arg (call_stmt, i);
339 else if (gswitch *swtch_stmt = dyn_cast <gswitch *> (stmt))
341 expr->type = TREE_TYPE (gimple_switch_index (swtch_stmt));
342 expr->kind = EXPR_SINGLE;
343 expr->ops.single.rhs = gimple_switch_index (swtch_stmt);
345 else if (code == GIMPLE_GOTO)
347 expr->type = TREE_TYPE (gimple_goto_dest (stmt));
348 expr->kind = EXPR_SINGLE;
349 expr->ops.single.rhs = gimple_goto_dest (stmt);
351 else if (code == GIMPLE_PHI)
353 size_t nargs = gimple_phi_num_args (stmt);
354 size_t i;
356 expr->type = TREE_TYPE (gimple_phi_result (stmt));
357 expr->kind = EXPR_PHI;
358 expr->ops.phi.nargs = nargs;
359 expr->ops.phi.args = XCNEWVEC (tree, nargs);
361 for (i = 0; i < nargs; i++)
362 expr->ops.phi.args[i] = gimple_phi_arg_def (stmt, i);
364 else
365 gcc_unreachable ();
367 element->lhs = lhs;
368 element->vop = gimple_vuse (stmt);
369 element->hash = avail_expr_hash (element);
370 element->stamp = element;
373 /* Given a conditional expression COND as a tree, initialize
374 a hashable_expr expression EXPR. The conditional must be a
375 comparison or logical negation. A constant or a variable is
376 not permitted. */
378 static void
379 initialize_expr_from_cond (tree cond, struct hashable_expr *expr)
381 expr->type = boolean_type_node;
383 if (COMPARISON_CLASS_P (cond))
385 expr->kind = EXPR_BINARY;
386 expr->ops.binary.op = TREE_CODE (cond);
387 expr->ops.binary.opnd0 = TREE_OPERAND (cond, 0);
388 expr->ops.binary.opnd1 = TREE_OPERAND (cond, 1);
390 else if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
392 expr->kind = EXPR_UNARY;
393 expr->ops.unary.op = TRUTH_NOT_EXPR;
394 expr->ops.unary.opnd = TREE_OPERAND (cond, 0);
396 else
397 gcc_unreachable ();
400 /* Given a hashable_expr expression EXPR and an LHS,
401 initialize the hash table element pointed to by ELEMENT. */
403 static void
404 initialize_hash_element_from_expr (struct hashable_expr *expr,
405 tree lhs,
406 struct expr_hash_elt *element)
408 element->expr = *expr;
409 element->lhs = lhs;
410 element->vop = NULL_TREE;
411 element->hash = avail_expr_hash (element);
412 element->stamp = element;
415 /* Compare two hashable_expr structures for equivalence.
416 They are considered equivalent when the the expressions
417 they denote must necessarily be equal. The logic is intended
418 to follow that of operand_equal_p in fold-const.c */
420 static bool
421 hashable_expr_equal_p (const struct hashable_expr *expr0,
422 const struct hashable_expr *expr1)
424 tree type0 = expr0->type;
425 tree type1 = expr1->type;
427 /* If either type is NULL, there is nothing to check. */
428 if ((type0 == NULL_TREE) ^ (type1 == NULL_TREE))
429 return false;
431 /* If both types don't have the same signedness, precision, and mode,
432 then we can't consider them equal. */
433 if (type0 != type1
434 && (TREE_CODE (type0) == ERROR_MARK
435 || TREE_CODE (type1) == ERROR_MARK
436 || TYPE_UNSIGNED (type0) != TYPE_UNSIGNED (type1)
437 || TYPE_PRECISION (type0) != TYPE_PRECISION (type1)
438 || TYPE_MODE (type0) != TYPE_MODE (type1)))
439 return false;
441 if (expr0->kind != expr1->kind)
442 return false;
444 switch (expr0->kind)
446 case EXPR_SINGLE:
447 return operand_equal_p (expr0->ops.single.rhs,
448 expr1->ops.single.rhs, 0);
450 case EXPR_UNARY:
451 if (expr0->ops.unary.op != expr1->ops.unary.op)
452 return false;
454 if ((CONVERT_EXPR_CODE_P (expr0->ops.unary.op)
455 || expr0->ops.unary.op == NON_LVALUE_EXPR)
456 && TYPE_UNSIGNED (expr0->type) != TYPE_UNSIGNED (expr1->type))
457 return false;
459 return operand_equal_p (expr0->ops.unary.opnd,
460 expr1->ops.unary.opnd, 0);
462 case EXPR_BINARY:
463 if (expr0->ops.binary.op != expr1->ops.binary.op)
464 return false;
466 if (operand_equal_p (expr0->ops.binary.opnd0,
467 expr1->ops.binary.opnd0, 0)
468 && operand_equal_p (expr0->ops.binary.opnd1,
469 expr1->ops.binary.opnd1, 0))
470 return true;
472 /* For commutative ops, allow the other order. */
473 return (commutative_tree_code (expr0->ops.binary.op)
474 && operand_equal_p (expr0->ops.binary.opnd0,
475 expr1->ops.binary.opnd1, 0)
476 && operand_equal_p (expr0->ops.binary.opnd1,
477 expr1->ops.binary.opnd0, 0));
479 case EXPR_TERNARY:
480 if (expr0->ops.ternary.op != expr1->ops.ternary.op
481 || !operand_equal_p (expr0->ops.ternary.opnd2,
482 expr1->ops.ternary.opnd2, 0))
483 return false;
485 if (operand_equal_p (expr0->ops.ternary.opnd0,
486 expr1->ops.ternary.opnd0, 0)
487 && operand_equal_p (expr0->ops.ternary.opnd1,
488 expr1->ops.ternary.opnd1, 0))
489 return true;
491 /* For commutative ops, allow the other order. */
492 return (commutative_ternary_tree_code (expr0->ops.ternary.op)
493 && operand_equal_p (expr0->ops.ternary.opnd0,
494 expr1->ops.ternary.opnd1, 0)
495 && operand_equal_p (expr0->ops.ternary.opnd1,
496 expr1->ops.ternary.opnd0, 0));
498 case EXPR_CALL:
500 size_t i;
502 /* If the calls are to different functions, then they
503 clearly cannot be equal. */
504 if (!gimple_call_same_target_p (expr0->ops.call.fn_from,
505 expr1->ops.call.fn_from))
506 return false;
508 if (! expr0->ops.call.pure)
509 return false;
511 if (expr0->ops.call.nargs != expr1->ops.call.nargs)
512 return false;
514 for (i = 0; i < expr0->ops.call.nargs; i++)
515 if (! operand_equal_p (expr0->ops.call.args[i],
516 expr1->ops.call.args[i], 0))
517 return false;
519 if (stmt_could_throw_p (expr0->ops.call.fn_from))
521 int lp0 = lookup_stmt_eh_lp (expr0->ops.call.fn_from);
522 int lp1 = lookup_stmt_eh_lp (expr1->ops.call.fn_from);
523 if ((lp0 > 0 || lp1 > 0) && lp0 != lp1)
524 return false;
527 return true;
530 case EXPR_PHI:
532 size_t i;
534 if (expr0->ops.phi.nargs != expr1->ops.phi.nargs)
535 return false;
537 for (i = 0; i < expr0->ops.phi.nargs; i++)
538 if (! operand_equal_p (expr0->ops.phi.args[i],
539 expr1->ops.phi.args[i], 0))
540 return false;
542 return true;
545 default:
546 gcc_unreachable ();
550 /* Generate a hash value for a pair of expressions. This can be used
551 iteratively by passing a previous result in HSTATE.
553 The same hash value is always returned for a given pair of expressions,
554 regardless of the order in which they are presented. This is useful in
555 hashing the operands of commutative functions. */
557 namespace inchash
560 static void
561 add_expr_commutative (const_tree t1, const_tree t2, hash &hstate)
563 hash one, two;
565 inchash::add_expr (t1, one);
566 inchash::add_expr (t2, two);
567 hstate.add_commutative (one, two);
570 /* Compute a hash value for a hashable_expr value EXPR and a
571 previously accumulated hash value VAL. If two hashable_expr
572 values compare equal with hashable_expr_equal_p, they must
573 hash to the same value, given an identical value of VAL.
574 The logic is intended to follow inchash::add_expr in tree.c. */
576 static void
577 add_hashable_expr (const struct hashable_expr *expr, hash &hstate)
579 switch (expr->kind)
581 case EXPR_SINGLE:
582 inchash::add_expr (expr->ops.single.rhs, hstate);
583 break;
585 case EXPR_UNARY:
586 hstate.add_object (expr->ops.unary.op);
588 /* Make sure to include signedness in the hash computation.
589 Don't hash the type, that can lead to having nodes which
590 compare equal according to operand_equal_p, but which
591 have different hash codes. */
592 if (CONVERT_EXPR_CODE_P (expr->ops.unary.op)
593 || expr->ops.unary.op == NON_LVALUE_EXPR)
594 hstate.add_int (TYPE_UNSIGNED (expr->type));
596 inchash::add_expr (expr->ops.unary.opnd, hstate);
597 break;
599 case EXPR_BINARY:
600 hstate.add_object (expr->ops.binary.op);
601 if (commutative_tree_code (expr->ops.binary.op))
602 inchash::add_expr_commutative (expr->ops.binary.opnd0,
603 expr->ops.binary.opnd1, hstate);
604 else
606 inchash::add_expr (expr->ops.binary.opnd0, hstate);
607 inchash::add_expr (expr->ops.binary.opnd1, hstate);
609 break;
611 case EXPR_TERNARY:
612 hstate.add_object (expr->ops.ternary.op);
613 if (commutative_ternary_tree_code (expr->ops.ternary.op))
614 inchash::add_expr_commutative (expr->ops.ternary.opnd0,
615 expr->ops.ternary.opnd1, hstate);
616 else
618 inchash::add_expr (expr->ops.ternary.opnd0, hstate);
619 inchash::add_expr (expr->ops.ternary.opnd1, hstate);
621 inchash::add_expr (expr->ops.ternary.opnd2, hstate);
622 break;
624 case EXPR_CALL:
626 size_t i;
627 enum tree_code code = CALL_EXPR;
628 gcall *fn_from;
630 hstate.add_object (code);
631 fn_from = expr->ops.call.fn_from;
632 if (gimple_call_internal_p (fn_from))
633 hstate.merge_hash ((hashval_t) gimple_call_internal_fn (fn_from));
634 else
635 inchash::add_expr (gimple_call_fn (fn_from), hstate);
636 for (i = 0; i < expr->ops.call.nargs; i++)
637 inchash::add_expr (expr->ops.call.args[i], hstate);
639 break;
641 case EXPR_PHI:
643 size_t i;
645 for (i = 0; i < expr->ops.phi.nargs; i++)
646 inchash::add_expr (expr->ops.phi.args[i], hstate);
648 break;
650 default:
651 gcc_unreachable ();
657 /* Print a diagnostic dump of an expression hash table entry. */
659 static void
660 print_expr_hash_elt (FILE * stream, const struct expr_hash_elt *element)
662 fprintf (stream, "STMT ");
664 if (element->lhs)
666 print_generic_expr (stream, element->lhs, 0);
667 fprintf (stream, " = ");
670 switch (element->expr.kind)
672 case EXPR_SINGLE:
673 print_generic_expr (stream, element->expr.ops.single.rhs, 0);
674 break;
676 case EXPR_UNARY:
677 fprintf (stream, "%s ", get_tree_code_name (element->expr.ops.unary.op));
678 print_generic_expr (stream, element->expr.ops.unary.opnd, 0);
679 break;
681 case EXPR_BINARY:
682 print_generic_expr (stream, element->expr.ops.binary.opnd0, 0);
683 fprintf (stream, " %s ", get_tree_code_name (element->expr.ops.binary.op));
684 print_generic_expr (stream, element->expr.ops.binary.opnd1, 0);
685 break;
687 case EXPR_TERNARY:
688 fprintf (stream, " %s <", get_tree_code_name (element->expr.ops.ternary.op));
689 print_generic_expr (stream, element->expr.ops.ternary.opnd0, 0);
690 fputs (", ", stream);
691 print_generic_expr (stream, element->expr.ops.ternary.opnd1, 0);
692 fputs (", ", stream);
693 print_generic_expr (stream, element->expr.ops.ternary.opnd2, 0);
694 fputs (">", stream);
695 break;
697 case EXPR_CALL:
699 size_t i;
700 size_t nargs = element->expr.ops.call.nargs;
701 gcall *fn_from;
703 fn_from = element->expr.ops.call.fn_from;
704 if (gimple_call_internal_p (fn_from))
705 fputs (internal_fn_name (gimple_call_internal_fn (fn_from)),
706 stream);
707 else
708 print_generic_expr (stream, gimple_call_fn (fn_from), 0);
709 fprintf (stream, " (");
710 for (i = 0; i < nargs; i++)
712 print_generic_expr (stream, element->expr.ops.call.args[i], 0);
713 if (i + 1 < nargs)
714 fprintf (stream, ", ");
716 fprintf (stream, ")");
718 break;
720 case EXPR_PHI:
722 size_t i;
723 size_t nargs = element->expr.ops.phi.nargs;
725 fprintf (stream, "PHI <");
726 for (i = 0; i < nargs; i++)
728 print_generic_expr (stream, element->expr.ops.phi.args[i], 0);
729 if (i + 1 < nargs)
730 fprintf (stream, ", ");
732 fprintf (stream, ">");
734 break;
737 if (element->vop)
739 fprintf (stream, " with ");
740 print_generic_expr (stream, element->vop, 0);
743 fprintf (stream, "\n");
746 /* Delete variable sized pieces of the expr_hash_elt ELEMENT. */
748 static void
749 free_expr_hash_elt_contents (struct expr_hash_elt *element)
751 if (element->expr.kind == EXPR_CALL)
752 free (element->expr.ops.call.args);
753 else if (element->expr.kind == EXPR_PHI)
754 free (element->expr.ops.phi.args);
757 /* Delete an expr_hash_elt and reclaim its storage. */
759 static void
760 free_expr_hash_elt (void *elt)
762 struct expr_hash_elt *element = ((struct expr_hash_elt *)elt);
763 free_expr_hash_elt_contents (element);
764 free (element);
767 /* Allocate an EDGE_INFO for edge E and attach it to E.
768 Return the new EDGE_INFO structure. */
770 static struct edge_info *
771 allocate_edge_info (edge e)
773 struct edge_info *edge_info;
775 edge_info = XCNEW (struct edge_info);
777 e->aux = edge_info;
778 return edge_info;
781 /* Free all EDGE_INFO structures associated with edges in the CFG.
782 If a particular edge can be threaded, copy the redirection
783 target from the EDGE_INFO structure into the edge's AUX field
784 as required by code to update the CFG and SSA graph for
785 jump threading. */
787 static void
788 free_all_edge_infos (void)
790 basic_block bb;
791 edge_iterator ei;
792 edge e;
794 FOR_EACH_BB_FN (bb, cfun)
796 FOR_EACH_EDGE (e, ei, bb->preds)
798 struct edge_info *edge_info = (struct edge_info *) e->aux;
800 if (edge_info)
802 edge_info->cond_equivalences.release ();
803 free (edge_info);
804 e->aux = NULL;
810 /* Build a cond_equivalence record indicating that the comparison
811 CODE holds between operands OP0 and OP1 and push it to **P. */
813 static void
814 build_and_record_new_cond (enum tree_code code,
815 tree op0, tree op1,
816 vec<cond_equivalence> *p)
818 cond_equivalence c;
819 struct hashable_expr *cond = &c.cond;
821 gcc_assert (TREE_CODE_CLASS (code) == tcc_comparison);
823 cond->type = boolean_type_node;
824 cond->kind = EXPR_BINARY;
825 cond->ops.binary.op = code;
826 cond->ops.binary.opnd0 = op0;
827 cond->ops.binary.opnd1 = op1;
829 c.value = boolean_true_node;
830 p->safe_push (c);
833 /* Record that COND is true and INVERTED is false into the edge information
834 structure. Also record that any conditions dominated by COND are true
835 as well.
837 For example, if a < b is true, then a <= b must also be true. */
839 static void
840 record_conditions (struct edge_info *edge_info, tree cond, tree inverted)
842 tree op0, op1;
843 cond_equivalence c;
845 if (!COMPARISON_CLASS_P (cond))
846 return;
848 op0 = TREE_OPERAND (cond, 0);
849 op1 = TREE_OPERAND (cond, 1);
851 switch (TREE_CODE (cond))
853 case LT_EXPR:
854 case GT_EXPR:
855 if (FLOAT_TYPE_P (TREE_TYPE (op0)))
857 build_and_record_new_cond (ORDERED_EXPR, op0, op1,
858 &edge_info->cond_equivalences);
859 build_and_record_new_cond (LTGT_EXPR, op0, op1,
860 &edge_info->cond_equivalences);
863 build_and_record_new_cond ((TREE_CODE (cond) == LT_EXPR
864 ? LE_EXPR : GE_EXPR),
865 op0, op1, &edge_info->cond_equivalences);
866 build_and_record_new_cond (NE_EXPR, op0, op1,
867 &edge_info->cond_equivalences);
868 break;
870 case GE_EXPR:
871 case LE_EXPR:
872 if (FLOAT_TYPE_P (TREE_TYPE (op0)))
874 build_and_record_new_cond (ORDERED_EXPR, op0, op1,
875 &edge_info->cond_equivalences);
877 break;
879 case EQ_EXPR:
880 if (FLOAT_TYPE_P (TREE_TYPE (op0)))
882 build_and_record_new_cond (ORDERED_EXPR, op0, op1,
883 &edge_info->cond_equivalences);
885 build_and_record_new_cond (LE_EXPR, op0, op1,
886 &edge_info->cond_equivalences);
887 build_and_record_new_cond (GE_EXPR, op0, op1,
888 &edge_info->cond_equivalences);
889 break;
891 case UNORDERED_EXPR:
892 build_and_record_new_cond (NE_EXPR, op0, op1,
893 &edge_info->cond_equivalences);
894 build_and_record_new_cond (UNLE_EXPR, op0, op1,
895 &edge_info->cond_equivalences);
896 build_and_record_new_cond (UNGE_EXPR, op0, op1,
897 &edge_info->cond_equivalences);
898 build_and_record_new_cond (UNEQ_EXPR, op0, op1,
899 &edge_info->cond_equivalences);
900 build_and_record_new_cond (UNLT_EXPR, op0, op1,
901 &edge_info->cond_equivalences);
902 build_and_record_new_cond (UNGT_EXPR, op0, op1,
903 &edge_info->cond_equivalences);
904 break;
906 case UNLT_EXPR:
907 case UNGT_EXPR:
908 build_and_record_new_cond ((TREE_CODE (cond) == UNLT_EXPR
909 ? UNLE_EXPR : UNGE_EXPR),
910 op0, op1, &edge_info->cond_equivalences);
911 build_and_record_new_cond (NE_EXPR, op0, op1,
912 &edge_info->cond_equivalences);
913 break;
915 case UNEQ_EXPR:
916 build_and_record_new_cond (UNLE_EXPR, op0, op1,
917 &edge_info->cond_equivalences);
918 build_and_record_new_cond (UNGE_EXPR, op0, op1,
919 &edge_info->cond_equivalences);
920 break;
922 case LTGT_EXPR:
923 build_and_record_new_cond (NE_EXPR, op0, op1,
924 &edge_info->cond_equivalences);
925 build_and_record_new_cond (ORDERED_EXPR, op0, op1,
926 &edge_info->cond_equivalences);
927 break;
929 default:
930 break;
933 /* Now store the original true and false conditions into the first
934 two slots. */
935 initialize_expr_from_cond (cond, &c.cond);
936 c.value = boolean_true_node;
937 edge_info->cond_equivalences.safe_push (c);
939 /* It is possible for INVERTED to be the negation of a comparison,
940 and not a valid RHS or GIMPLE_COND condition. This happens because
941 invert_truthvalue may return such an expression when asked to invert
942 a floating-point comparison. These comparisons are not assumed to
943 obey the trichotomy law. */
944 initialize_expr_from_cond (inverted, &c.cond);
945 c.value = boolean_false_node;
946 edge_info->cond_equivalences.safe_push (c);
949 /* We have finished optimizing BB, record any information implied by
950 taking a specific outgoing edge from BB. */
952 static void
953 record_edge_info (basic_block bb)
955 gimple_stmt_iterator gsi = gsi_last_bb (bb);
956 struct edge_info *edge_info;
958 if (! gsi_end_p (gsi))
960 gimple stmt = gsi_stmt (gsi);
961 location_t loc = gimple_location (stmt);
963 if (gimple_code (stmt) == GIMPLE_SWITCH)
965 gswitch *switch_stmt = as_a <gswitch *> (stmt);
966 tree index = gimple_switch_index (switch_stmt);
968 if (TREE_CODE (index) == SSA_NAME)
970 int i;
971 int n_labels = gimple_switch_num_labels (switch_stmt);
972 tree *info = XCNEWVEC (tree, last_basic_block_for_fn (cfun));
973 edge e;
974 edge_iterator ei;
976 for (i = 0; i < n_labels; i++)
978 tree label = gimple_switch_label (switch_stmt, i);
979 basic_block target_bb = label_to_block (CASE_LABEL (label));
980 if (CASE_HIGH (label)
981 || !CASE_LOW (label)
982 || info[target_bb->index])
983 info[target_bb->index] = error_mark_node;
984 else
985 info[target_bb->index] = label;
988 FOR_EACH_EDGE (e, ei, bb->succs)
990 basic_block target_bb = e->dest;
991 tree label = info[target_bb->index];
993 if (label != NULL && label != error_mark_node)
995 tree x = fold_convert_loc (loc, TREE_TYPE (index),
996 CASE_LOW (label));
997 edge_info = allocate_edge_info (e);
998 edge_info->lhs = index;
999 edge_info->rhs = x;
1002 free (info);
1006 /* A COND_EXPR may create equivalences too. */
1007 if (gimple_code (stmt) == GIMPLE_COND)
1009 edge true_edge;
1010 edge false_edge;
1012 tree op0 = gimple_cond_lhs (stmt);
1013 tree op1 = gimple_cond_rhs (stmt);
1014 enum tree_code code = gimple_cond_code (stmt);
1016 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
1018 /* Special case comparing booleans against a constant as we
1019 know the value of OP0 on both arms of the branch. i.e., we
1020 can record an equivalence for OP0 rather than COND. */
1021 if ((code == EQ_EXPR || code == NE_EXPR)
1022 && TREE_CODE (op0) == SSA_NAME
1023 && TREE_CODE (TREE_TYPE (op0)) == BOOLEAN_TYPE
1024 && is_gimple_min_invariant (op1))
1026 if (code == EQ_EXPR)
1028 edge_info = allocate_edge_info (true_edge);
1029 edge_info->lhs = op0;
1030 edge_info->rhs = (integer_zerop (op1)
1031 ? boolean_false_node
1032 : boolean_true_node);
1034 edge_info = allocate_edge_info (false_edge);
1035 edge_info->lhs = op0;
1036 edge_info->rhs = (integer_zerop (op1)
1037 ? boolean_true_node
1038 : boolean_false_node);
1040 else
1042 edge_info = allocate_edge_info (true_edge);
1043 edge_info->lhs = op0;
1044 edge_info->rhs = (integer_zerop (op1)
1045 ? boolean_true_node
1046 : boolean_false_node);
1048 edge_info = allocate_edge_info (false_edge);
1049 edge_info->lhs = op0;
1050 edge_info->rhs = (integer_zerop (op1)
1051 ? boolean_false_node
1052 : boolean_true_node);
1055 else if (is_gimple_min_invariant (op0)
1056 && (TREE_CODE (op1) == SSA_NAME
1057 || is_gimple_min_invariant (op1)))
1059 tree cond = build2 (code, boolean_type_node, op0, op1);
1060 tree inverted = invert_truthvalue_loc (loc, cond);
1061 bool can_infer_simple_equiv
1062 = !(HONOR_SIGNED_ZEROS (op0)
1063 && real_zerop (op0));
1064 struct edge_info *edge_info;
1066 edge_info = allocate_edge_info (true_edge);
1067 record_conditions (edge_info, cond, inverted);
1069 if (can_infer_simple_equiv && code == EQ_EXPR)
1071 edge_info->lhs = op1;
1072 edge_info->rhs = op0;
1075 edge_info = allocate_edge_info (false_edge);
1076 record_conditions (edge_info, inverted, cond);
1078 if (can_infer_simple_equiv && TREE_CODE (inverted) == EQ_EXPR)
1080 edge_info->lhs = op1;
1081 edge_info->rhs = op0;
1085 else if (TREE_CODE (op0) == SSA_NAME
1086 && (TREE_CODE (op1) == SSA_NAME
1087 || is_gimple_min_invariant (op1)))
1089 tree cond = build2 (code, boolean_type_node, op0, op1);
1090 tree inverted = invert_truthvalue_loc (loc, cond);
1091 bool can_infer_simple_equiv
1092 = !(HONOR_SIGNED_ZEROS (op1)
1093 && (TREE_CODE (op1) == SSA_NAME || real_zerop (op1)));
1094 struct edge_info *edge_info;
1096 edge_info = allocate_edge_info (true_edge);
1097 record_conditions (edge_info, cond, inverted);
1099 if (can_infer_simple_equiv && code == EQ_EXPR)
1101 edge_info->lhs = op0;
1102 edge_info->rhs = op1;
1105 edge_info = allocate_edge_info (false_edge);
1106 record_conditions (edge_info, inverted, cond);
1108 if (can_infer_simple_equiv && TREE_CODE (inverted) == EQ_EXPR)
1110 edge_info->lhs = op0;
1111 edge_info->rhs = op1;
1116 /* ??? TRUTH_NOT_EXPR can create an equivalence too. */
1121 class dom_opt_dom_walker : public dom_walker
1123 public:
1124 dom_opt_dom_walker (cdi_direction direction)
1125 : dom_walker (direction), m_dummy_cond (NULL) {}
1127 virtual void before_dom_children (basic_block);
1128 virtual void after_dom_children (basic_block);
1130 private:
1131 void thread_across_edge (edge);
1133 gcond *m_dummy_cond;
1136 /* Jump threading, redundancy elimination and const/copy propagation.
1138 This pass may expose new symbols that need to be renamed into SSA. For
1139 every new symbol exposed, its corresponding bit will be set in
1140 VARS_TO_RENAME. */
1142 namespace {
1144 const pass_data pass_data_dominator =
1146 GIMPLE_PASS, /* type */
1147 "dom", /* name */
1148 OPTGROUP_NONE, /* optinfo_flags */
1149 TV_TREE_SSA_DOMINATOR_OPTS, /* tv_id */
1150 ( PROP_cfg | PROP_ssa ), /* properties_required */
1151 0, /* properties_provided */
1152 0, /* properties_destroyed */
1153 0, /* todo_flags_start */
1154 ( TODO_cleanup_cfg | TODO_update_ssa ), /* todo_flags_finish */
1157 class pass_dominator : public gimple_opt_pass
1159 public:
1160 pass_dominator (gcc::context *ctxt)
1161 : gimple_opt_pass (pass_data_dominator, ctxt)
1164 /* opt_pass methods: */
1165 opt_pass * clone () { return new pass_dominator (m_ctxt); }
1166 virtual bool gate (function *) { return flag_tree_dom != 0; }
1167 virtual unsigned int execute (function *);
1169 }; // class pass_dominator
1171 unsigned int
1172 pass_dominator::execute (function *fun)
1174 memset (&opt_stats, 0, sizeof (opt_stats));
1176 /* Create our hash tables. */
1177 avail_exprs = new hash_table<expr_elt_hasher> (1024);
1178 avail_exprs_stack.create (20);
1179 const_and_copies = new class const_and_copies (dump_file, dump_flags);
1180 need_eh_cleanup = BITMAP_ALLOC (NULL);
1181 need_noreturn_fixup.create (0);
1183 calculate_dominance_info (CDI_DOMINATORS);
1184 cfg_altered = false;
1186 /* We need to know loop structures in order to avoid destroying them
1187 in jump threading. Note that we still can e.g. thread through loop
1188 headers to an exit edge, or through loop header to the loop body, assuming
1189 that we update the loop info.
1191 TODO: We don't need to set LOOPS_HAVE_PREHEADERS generally, but due
1192 to several overly conservative bail-outs in jump threading, case
1193 gcc.dg/tree-ssa/pr21417.c can't be threaded if loop preheader is
1194 missing. We should improve jump threading in future then
1195 LOOPS_HAVE_PREHEADERS won't be needed here. */
1196 loop_optimizer_init (LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_SIMPLE_LATCHES);
1198 /* Initialize the value-handle array. */
1199 threadedge_initialize_values ();
1201 /* We need accurate information regarding back edges in the CFG
1202 for jump threading; this may include back edges that are not part of
1203 a single loop. */
1204 mark_dfs_back_edges ();
1206 /* Recursively walk the dominator tree optimizing statements. */
1207 dom_opt_dom_walker (CDI_DOMINATORS).walk (fun->cfg->x_entry_block_ptr);
1210 gimple_stmt_iterator gsi;
1211 basic_block bb;
1212 FOR_EACH_BB_FN (bb, fun)
1214 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1215 update_stmt_if_modified (gsi_stmt (gsi));
1219 /* If we exposed any new variables, go ahead and put them into
1220 SSA form now, before we handle jump threading. This simplifies
1221 interactions between rewriting of _DECL nodes into SSA form
1222 and rewriting SSA_NAME nodes into SSA form after block
1223 duplication and CFG manipulation. */
1224 update_ssa (TODO_update_ssa);
1226 free_all_edge_infos ();
1228 /* Thread jumps, creating duplicate blocks as needed. */
1229 cfg_altered |= thread_through_all_blocks (first_pass_instance);
1231 if (cfg_altered)
1232 free_dominance_info (CDI_DOMINATORS);
1234 /* Removal of statements may make some EH edges dead. Purge
1235 such edges from the CFG as needed. */
1236 if (!bitmap_empty_p (need_eh_cleanup))
1238 unsigned i;
1239 bitmap_iterator bi;
1241 /* Jump threading may have created forwarder blocks from blocks
1242 needing EH cleanup; the new successor of these blocks, which
1243 has inherited from the original block, needs the cleanup.
1244 Don't clear bits in the bitmap, as that can break the bitmap
1245 iterator. */
1246 EXECUTE_IF_SET_IN_BITMAP (need_eh_cleanup, 0, i, bi)
1248 basic_block bb = BASIC_BLOCK_FOR_FN (fun, i);
1249 if (bb == NULL)
1250 continue;
1251 while (single_succ_p (bb)
1252 && (single_succ_edge (bb)->flags & EDGE_EH) == 0)
1253 bb = single_succ (bb);
1254 if (bb == EXIT_BLOCK_PTR_FOR_FN (fun))
1255 continue;
1256 if ((unsigned) bb->index != i)
1257 bitmap_set_bit (need_eh_cleanup, bb->index);
1260 gimple_purge_all_dead_eh_edges (need_eh_cleanup);
1261 bitmap_clear (need_eh_cleanup);
1264 /* Fixup stmts that became noreturn calls. This may require splitting
1265 blocks and thus isn't possible during the dominator walk or before
1266 jump threading finished. Do this in reverse order so we don't
1267 inadvertedly remove a stmt we want to fixup by visiting a dominating
1268 now noreturn call first. */
1269 while (!need_noreturn_fixup.is_empty ())
1271 gimple stmt = need_noreturn_fixup.pop ();
1272 if (dump_file && dump_flags & TDF_DETAILS)
1274 fprintf (dump_file, "Fixing up noreturn call ");
1275 print_gimple_stmt (dump_file, stmt, 0, 0);
1276 fprintf (dump_file, "\n");
1278 fixup_noreturn_call (stmt);
1281 statistics_counter_event (fun, "Redundant expressions eliminated",
1282 opt_stats.num_re);
1283 statistics_counter_event (fun, "Constants propagated",
1284 opt_stats.num_const_prop);
1285 statistics_counter_event (fun, "Copies propagated",
1286 opt_stats.num_copy_prop);
1288 /* Debugging dumps. */
1289 if (dump_file && (dump_flags & TDF_STATS))
1290 dump_dominator_optimization_stats (dump_file);
1292 loop_optimizer_finalize ();
1294 /* Delete our main hashtable. */
1295 delete avail_exprs;
1296 avail_exprs = NULL;
1298 /* Free asserted bitmaps and stacks. */
1299 BITMAP_FREE (need_eh_cleanup);
1300 need_noreturn_fixup.release ();
1301 avail_exprs_stack.release ();
1302 delete const_and_copies;
1304 /* Free the value-handle array. */
1305 threadedge_finalize_values ();
1307 return 0;
1310 } // anon namespace
1312 gimple_opt_pass *
1313 make_pass_dominator (gcc::context *ctxt)
1315 return new pass_dominator (ctxt);
1319 /* Given a conditional statement CONDSTMT, convert the
1320 condition to a canonical form. */
1322 static void
1323 canonicalize_comparison (gcond *condstmt)
1325 tree op0;
1326 tree op1;
1327 enum tree_code code;
1329 gcc_assert (gimple_code (condstmt) == GIMPLE_COND);
1331 op0 = gimple_cond_lhs (condstmt);
1332 op1 = gimple_cond_rhs (condstmt);
1334 code = gimple_cond_code (condstmt);
1336 /* If it would be profitable to swap the operands, then do so to
1337 canonicalize the statement, enabling better optimization.
1339 By placing canonicalization of such expressions here we
1340 transparently keep statements in canonical form, even
1341 when the statement is modified. */
1342 if (tree_swap_operands_p (op0, op1, false))
1344 /* For relationals we need to swap the operands
1345 and change the code. */
1346 if (code == LT_EXPR
1347 || code == GT_EXPR
1348 || code == LE_EXPR
1349 || code == GE_EXPR)
1351 code = swap_tree_comparison (code);
1353 gimple_cond_set_code (condstmt, code);
1354 gimple_cond_set_lhs (condstmt, op1);
1355 gimple_cond_set_rhs (condstmt, op0);
1357 update_stmt (condstmt);
1362 /* Initialize local stacks for this optimizer and record equivalences
1363 upon entry to BB. Equivalences can come from the edge traversed to
1364 reach BB or they may come from PHI nodes at the start of BB. */
1366 /* Remove all the expressions in LOCALS from TABLE, stopping when there are
1367 LIMIT entries left in LOCALs. */
1369 static void
1370 remove_local_expressions_from_table (void)
1372 /* Remove all the expressions made available in this block. */
1373 while (avail_exprs_stack.length () > 0)
1375 std::pair<expr_hash_elt_t, expr_hash_elt_t> victim
1376 = avail_exprs_stack.pop ();
1377 expr_hash_elt **slot;
1379 if (victim.first == NULL)
1380 break;
1382 /* This must precede the actual removal from the hash table,
1383 as ELEMENT and the table entry may share a call argument
1384 vector which will be freed during removal. */
1385 if (dump_file && (dump_flags & TDF_DETAILS))
1387 fprintf (dump_file, "<<<< ");
1388 print_expr_hash_elt (dump_file, victim.first);
1391 slot = avail_exprs->find_slot (victim.first, NO_INSERT);
1392 gcc_assert (slot && *slot == victim.first);
1393 if (victim.second != NULL)
1395 free_expr_hash_elt (*slot);
1396 *slot = victim.second;
1398 else
1399 avail_exprs->clear_slot (slot);
1403 /* A trivial wrapper so that we can present the generic jump
1404 threading code with a simple API for simplifying statements. */
1405 static tree
1406 simplify_stmt_for_jump_threading (gimple stmt,
1407 gimple within_stmt ATTRIBUTE_UNUSED)
1409 return lookup_avail_expr (stmt, false);
1412 /* Record into the equivalence tables any equivalences implied by
1413 traversing edge E (which are cached in E->aux).
1415 Callers are responsible for managing the unwinding markers. */
1416 static void
1417 record_temporary_equivalences (edge e)
1419 int i;
1420 struct edge_info *edge_info = (struct edge_info *) e->aux;
1422 /* If we have info associated with this edge, record it into
1423 our equivalence tables. */
1424 if (edge_info)
1426 cond_equivalence *eq;
1427 tree lhs = edge_info->lhs;
1428 tree rhs = edge_info->rhs;
1430 /* If we have a simple NAME = VALUE equivalence, record it. */
1431 if (lhs && TREE_CODE (lhs) == SSA_NAME)
1432 const_and_copies->record_const_or_copy (lhs, rhs);
1434 /* If we have 0 = COND or 1 = COND equivalences, record them
1435 into our expression hash tables. */
1436 for (i = 0; edge_info->cond_equivalences.iterate (i, &eq); ++i)
1437 record_cond (eq);
1441 /* Wrapper for common code to attempt to thread an edge. For example,
1442 it handles lazily building the dummy condition and the bookkeeping
1443 when jump threading is successful. */
1445 void
1446 dom_opt_dom_walker::thread_across_edge (edge e)
1448 if (! m_dummy_cond)
1449 m_dummy_cond =
1450 gimple_build_cond (NE_EXPR,
1451 integer_zero_node, integer_zero_node,
1452 NULL, NULL);
1454 /* Push a marker on both stacks so we can unwind the tables back to their
1455 current state. */
1456 avail_exprs_stack.safe_push
1457 (std::pair<expr_hash_elt_t, expr_hash_elt_t> (NULL, NULL));
1458 const_and_copies->push_marker ();
1460 /* Traversing E may result in equivalences we can utilize. */
1461 record_temporary_equivalences (e);
1463 /* With all the edge equivalences in the tables, go ahead and attempt
1464 to thread through E->dest. */
1465 ::thread_across_edge (m_dummy_cond, e, false,
1466 const_and_copies,
1467 simplify_stmt_for_jump_threading);
1469 /* And restore the various tables to their state before
1470 we threaded this edge.
1472 XXX The code in tree-ssa-threadedge.c will restore the state of
1473 the const_and_copies table. We we just have to restore the expression
1474 table. */
1475 remove_local_expressions_from_table ();
1478 /* PHI nodes can create equivalences too.
1480 Ignoring any alternatives which are the same as the result, if
1481 all the alternatives are equal, then the PHI node creates an
1482 equivalence. */
1484 static void
1485 record_equivalences_from_phis (basic_block bb)
1487 gphi_iterator gsi;
1489 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1491 gphi *phi = gsi.phi ();
1493 tree lhs = gimple_phi_result (phi);
1494 tree rhs = NULL;
1495 size_t i;
1497 for (i = 0; i < gimple_phi_num_args (phi); i++)
1499 tree t = gimple_phi_arg_def (phi, i);
1501 /* Ignore alternatives which are the same as our LHS. Since
1502 LHS is a PHI_RESULT, it is known to be a SSA_NAME, so we
1503 can simply compare pointers. */
1504 if (lhs == t)
1505 continue;
1507 /* Valueize t. */
1508 if (TREE_CODE (t) == SSA_NAME)
1510 tree tmp = SSA_NAME_VALUE (t);
1511 t = tmp ? tmp : t;
1514 /* If we have not processed an alternative yet, then set
1515 RHS to this alternative. */
1516 if (rhs == NULL)
1517 rhs = t;
1518 /* If we have processed an alternative (stored in RHS), then
1519 see if it is equal to this one. If it isn't, then stop
1520 the search. */
1521 else if (! operand_equal_for_phi_arg_p (rhs, t))
1522 break;
1525 /* If we had no interesting alternatives, then all the RHS alternatives
1526 must have been the same as LHS. */
1527 if (!rhs)
1528 rhs = lhs;
1530 /* If we managed to iterate through each PHI alternative without
1531 breaking out of the loop, then we have a PHI which may create
1532 a useful equivalence. We do not need to record unwind data for
1533 this, since this is a true assignment and not an equivalence
1534 inferred from a comparison. All uses of this ssa name are dominated
1535 by this assignment, so unwinding just costs time and space. */
1536 if (i == gimple_phi_num_args (phi)
1537 && may_propagate_copy (lhs, rhs))
1538 set_ssa_name_value (lhs, rhs);
1542 /* Ignoring loop backedges, if BB has precisely one incoming edge then
1543 return that edge. Otherwise return NULL. */
1544 static edge
1545 single_incoming_edge_ignoring_loop_edges (basic_block bb)
1547 edge retval = NULL;
1548 edge e;
1549 edge_iterator ei;
1551 FOR_EACH_EDGE (e, ei, bb->preds)
1553 /* A loop back edge can be identified by the destination of
1554 the edge dominating the source of the edge. */
1555 if (dominated_by_p (CDI_DOMINATORS, e->src, e->dest))
1556 continue;
1558 /* If we have already seen a non-loop edge, then we must have
1559 multiple incoming non-loop edges and thus we return NULL. */
1560 if (retval)
1561 return NULL;
1563 /* This is the first non-loop incoming edge we have found. Record
1564 it. */
1565 retval = e;
1568 return retval;
1571 /* Record any equivalences created by the incoming edge to BB. If BB
1572 has more than one incoming edge, then no equivalence is created. */
1574 static void
1575 record_equivalences_from_incoming_edge (basic_block bb)
1577 edge e;
1578 basic_block parent;
1579 struct edge_info *edge_info;
1581 /* If our parent block ended with a control statement, then we may be
1582 able to record some equivalences based on which outgoing edge from
1583 the parent was followed. */
1584 parent = get_immediate_dominator (CDI_DOMINATORS, bb);
1586 e = single_incoming_edge_ignoring_loop_edges (bb);
1588 /* If we had a single incoming edge from our parent block, then enter
1589 any data associated with the edge into our tables. */
1590 if (e && e->src == parent)
1592 unsigned int i;
1594 edge_info = (struct edge_info *) e->aux;
1596 if (edge_info)
1598 tree lhs = edge_info->lhs;
1599 tree rhs = edge_info->rhs;
1600 cond_equivalence *eq;
1602 if (lhs)
1603 record_equality (lhs, rhs);
1605 /* If LHS is an SSA_NAME and RHS is a constant integer and LHS was
1606 set via a widening type conversion, then we may be able to record
1607 additional equivalences. */
1608 if (lhs
1609 && TREE_CODE (lhs) == SSA_NAME
1610 && is_gimple_constant (rhs)
1611 && TREE_CODE (rhs) == INTEGER_CST)
1613 gimple defstmt = SSA_NAME_DEF_STMT (lhs);
1615 if (defstmt
1616 && is_gimple_assign (defstmt)
1617 && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (defstmt)))
1619 tree old_rhs = gimple_assign_rhs1 (defstmt);
1621 /* If the conversion widens the original value and
1622 the constant is in the range of the type of OLD_RHS,
1623 then convert the constant and record the equivalence.
1625 Note that int_fits_type_p does not check the precision
1626 if the upper and lower bounds are OK. */
1627 if (INTEGRAL_TYPE_P (TREE_TYPE (old_rhs))
1628 && (TYPE_PRECISION (TREE_TYPE (lhs))
1629 > TYPE_PRECISION (TREE_TYPE (old_rhs)))
1630 && int_fits_type_p (rhs, TREE_TYPE (old_rhs)))
1632 tree newval = fold_convert (TREE_TYPE (old_rhs), rhs);
1633 record_equality (old_rhs, newval);
1638 for (i = 0; edge_info->cond_equivalences.iterate (i, &eq); ++i)
1639 record_cond (eq);
1644 /* Dump SSA statistics on FILE. */
1646 void
1647 dump_dominator_optimization_stats (FILE *file)
1649 fprintf (file, "Total number of statements: %6ld\n\n",
1650 opt_stats.num_stmts);
1651 fprintf (file, "Exprs considered for dominator optimizations: %6ld\n",
1652 opt_stats.num_exprs_considered);
1654 fprintf (file, "\nHash table statistics:\n");
1656 fprintf (file, " avail_exprs: ");
1657 htab_statistics (file, *avail_exprs);
1661 /* Dump SSA statistics on stderr. */
1663 DEBUG_FUNCTION void
1664 debug_dominator_optimization_stats (void)
1666 dump_dominator_optimization_stats (stderr);
1670 /* Dump statistics for the hash table HTAB. */
1672 static void
1673 htab_statistics (FILE *file, const hash_table<expr_elt_hasher> &htab)
1675 fprintf (file, "size %ld, %ld elements, %f collision/search ratio\n",
1676 (long) htab.size (),
1677 (long) htab.elements (),
1678 htab.collisions ());
1682 /* Enter condition equivalence into the expression hash table.
1683 This indicates that a conditional expression has a known
1684 boolean value. */
1686 static void
1687 record_cond (cond_equivalence *p)
1689 struct expr_hash_elt *element = XCNEW (struct expr_hash_elt);
1690 expr_hash_elt **slot;
1692 initialize_hash_element_from_expr (&p->cond, p->value, element);
1694 slot = avail_exprs->find_slot_with_hash (element, element->hash, INSERT);
1695 if (*slot == NULL)
1697 *slot = element;
1699 if (dump_file && (dump_flags & TDF_DETAILS))
1701 fprintf (dump_file, "1>>> ");
1702 print_expr_hash_elt (dump_file, element);
1705 avail_exprs_stack.safe_push
1706 (std::pair<expr_hash_elt_t, expr_hash_elt_t> (element, NULL));
1708 else
1709 free_expr_hash_elt (element);
1712 /* Return the loop depth of the basic block of the defining statement of X.
1713 This number should not be treated as absolutely correct because the loop
1714 information may not be completely up-to-date when dom runs. However, it
1715 will be relatively correct, and as more passes are taught to keep loop info
1716 up to date, the result will become more and more accurate. */
1718 static int
1719 loop_depth_of_name (tree x)
1721 gimple defstmt;
1722 basic_block defbb;
1724 /* If it's not an SSA_NAME, we have no clue where the definition is. */
1725 if (TREE_CODE (x) != SSA_NAME)
1726 return 0;
1728 /* Otherwise return the loop depth of the defining statement's bb.
1729 Note that there may not actually be a bb for this statement, if the
1730 ssa_name is live on entry. */
1731 defstmt = SSA_NAME_DEF_STMT (x);
1732 defbb = gimple_bb (defstmt);
1733 if (!defbb)
1734 return 0;
1736 return bb_loop_depth (defbb);
1739 /* Similarly, but assume that X and Y are the two operands of an EQ_EXPR.
1740 This constrains the cases in which we may treat this as assignment. */
1742 static void
1743 record_equality (tree x, tree y)
1745 tree prev_x = NULL, prev_y = NULL;
1747 if (tree_swap_operands_p (x, y, false))
1748 std::swap (x, y);
1750 /* Most of the time tree_swap_operands_p does what we want. But there
1751 are cases where we know one operand is better for copy propagation than
1752 the other. Given no other code cares about ordering of equality
1753 comparison operators for that purpose, we just handle the special cases
1754 here. */
1755 if (TREE_CODE (x) == SSA_NAME && TREE_CODE (y) == SSA_NAME)
1757 /* If one operand is a single use operand, then make it
1758 X. This will preserve its single use properly and if this
1759 conditional is eliminated, the computation of X can be
1760 eliminated as well. */
1761 if (has_single_use (y) && ! has_single_use (x))
1762 std::swap (x, y);
1764 if (TREE_CODE (x) == SSA_NAME)
1765 prev_x = SSA_NAME_VALUE (x);
1766 if (TREE_CODE (y) == SSA_NAME)
1767 prev_y = SSA_NAME_VALUE (y);
1769 /* If one of the previous values is invariant, or invariant in more loops
1770 (by depth), then use that.
1771 Otherwise it doesn't matter which value we choose, just so
1772 long as we canonicalize on one value. */
1773 if (is_gimple_min_invariant (y))
1775 else if (is_gimple_min_invariant (x)
1776 /* ??? When threading over backedges the following is important
1777 for correctness. See PR61757. */
1778 || (loop_depth_of_name (x) < loop_depth_of_name (y)))
1779 prev_x = x, x = y, y = prev_x, prev_x = prev_y;
1780 else if (prev_x && is_gimple_min_invariant (prev_x))
1781 x = y, y = prev_x, prev_x = prev_y;
1782 else if (prev_y)
1783 y = prev_y;
1785 /* After the swapping, we must have one SSA_NAME. */
1786 if (TREE_CODE (x) != SSA_NAME)
1787 return;
1789 /* For IEEE, -0.0 == 0.0, so we don't necessarily know the sign of a
1790 variable compared against zero. If we're honoring signed zeros,
1791 then we cannot record this value unless we know that the value is
1792 nonzero. */
1793 if (HONOR_SIGNED_ZEROS (x)
1794 && (TREE_CODE (y) != REAL_CST
1795 || REAL_VALUES_EQUAL (dconst0, TREE_REAL_CST (y))))
1796 return;
1798 const_and_copies->record_const_or_copy (x, y, prev_x);
1801 /* Returns true when STMT is a simple iv increment. It detects the
1802 following situation:
1804 i_1 = phi (..., i_2)
1805 i_2 = i_1 +/- ... */
1807 bool
1808 simple_iv_increment_p (gimple stmt)
1810 enum tree_code code;
1811 tree lhs, preinc;
1812 gimple phi;
1813 size_t i;
1815 if (gimple_code (stmt) != GIMPLE_ASSIGN)
1816 return false;
1818 lhs = gimple_assign_lhs (stmt);
1819 if (TREE_CODE (lhs) != SSA_NAME)
1820 return false;
1822 code = gimple_assign_rhs_code (stmt);
1823 if (code != PLUS_EXPR
1824 && code != MINUS_EXPR
1825 && code != POINTER_PLUS_EXPR)
1826 return false;
1828 preinc = gimple_assign_rhs1 (stmt);
1829 if (TREE_CODE (preinc) != SSA_NAME)
1830 return false;
1832 phi = SSA_NAME_DEF_STMT (preinc);
1833 if (gimple_code (phi) != GIMPLE_PHI)
1834 return false;
1836 for (i = 0; i < gimple_phi_num_args (phi); i++)
1837 if (gimple_phi_arg_def (phi, i) == lhs)
1838 return true;
1840 return false;
1843 /* CONST_AND_COPIES is a table which maps an SSA_NAME to the current
1844 known value for that SSA_NAME (or NULL if no value is known).
1846 Propagate values from CONST_AND_COPIES into the PHI nodes of the
1847 successors of BB. */
1849 static void
1850 cprop_into_successor_phis (basic_block bb)
1852 edge e;
1853 edge_iterator ei;
1855 FOR_EACH_EDGE (e, ei, bb->succs)
1857 int indx;
1858 gphi_iterator gsi;
1860 /* If this is an abnormal edge, then we do not want to copy propagate
1861 into the PHI alternative associated with this edge. */
1862 if (e->flags & EDGE_ABNORMAL)
1863 continue;
1865 gsi = gsi_start_phis (e->dest);
1866 if (gsi_end_p (gsi))
1867 continue;
1869 /* We may have an equivalence associated with this edge. While
1870 we can not propagate it into non-dominated blocks, we can
1871 propagate them into PHIs in non-dominated blocks. */
1873 /* Push the unwind marker so we can reset the const and copies
1874 table back to its original state after processing this edge. */
1875 const_and_copies->push_marker ();
1877 /* Extract and record any simple NAME = VALUE equivalences.
1879 Don't bother with [01] = COND equivalences, they're not useful
1880 here. */
1881 struct edge_info *edge_info = (struct edge_info *) e->aux;
1882 if (edge_info)
1884 tree lhs = edge_info->lhs;
1885 tree rhs = edge_info->rhs;
1887 if (lhs && TREE_CODE (lhs) == SSA_NAME)
1888 const_and_copies->record_const_or_copy (lhs, rhs);
1891 indx = e->dest_idx;
1892 for ( ; !gsi_end_p (gsi); gsi_next (&gsi))
1894 tree new_val;
1895 use_operand_p orig_p;
1896 tree orig_val;
1897 gphi *phi = gsi.phi ();
1899 /* The alternative may be associated with a constant, so verify
1900 it is an SSA_NAME before doing anything with it. */
1901 orig_p = gimple_phi_arg_imm_use_ptr (phi, indx);
1902 orig_val = get_use_from_ptr (orig_p);
1903 if (TREE_CODE (orig_val) != SSA_NAME)
1904 continue;
1906 /* If we have *ORIG_P in our constant/copy table, then replace
1907 ORIG_P with its value in our constant/copy table. */
1908 new_val = SSA_NAME_VALUE (orig_val);
1909 if (new_val
1910 && new_val != orig_val
1911 && (TREE_CODE (new_val) == SSA_NAME
1912 || is_gimple_min_invariant (new_val))
1913 && may_propagate_copy (orig_val, new_val))
1914 propagate_value (orig_p, new_val);
1917 const_and_copies->pop_to_marker ();
1921 void
1922 dom_opt_dom_walker::before_dom_children (basic_block bb)
1924 gimple_stmt_iterator gsi;
1926 if (dump_file && (dump_flags & TDF_DETAILS))
1927 fprintf (dump_file, "\n\nOptimizing block #%d\n\n", bb->index);
1929 /* Push a marker on the stacks of local information so that we know how
1930 far to unwind when we finalize this block. */
1931 avail_exprs_stack.safe_push
1932 (std::pair<expr_hash_elt_t, expr_hash_elt_t> (NULL, NULL));
1933 const_and_copies->push_marker ();
1935 record_equivalences_from_incoming_edge (bb);
1937 /* PHI nodes can create equivalences too. */
1938 record_equivalences_from_phis (bb);
1940 /* Create equivalences from redundant PHIs. PHIs are only truly
1941 redundant when they exist in the same block, so push another
1942 marker and unwind right afterwards. */
1943 avail_exprs_stack.safe_push
1944 (std::pair<expr_hash_elt_t, expr_hash_elt_t> (NULL, NULL));
1945 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1946 eliminate_redundant_computations (&gsi);
1947 remove_local_expressions_from_table ();
1949 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1950 optimize_stmt (bb, gsi);
1952 /* Now prepare to process dominated blocks. */
1953 record_edge_info (bb);
1954 cprop_into_successor_phis (bb);
1957 /* We have finished processing the dominator children of BB, perform
1958 any finalization actions in preparation for leaving this node in
1959 the dominator tree. */
1961 void
1962 dom_opt_dom_walker::after_dom_children (basic_block bb)
1964 gimple last;
1966 /* If we have an outgoing edge to a block with multiple incoming and
1967 outgoing edges, then we may be able to thread the edge, i.e., we
1968 may be able to statically determine which of the outgoing edges
1969 will be traversed when the incoming edge from BB is traversed. */
1970 if (single_succ_p (bb)
1971 && (single_succ_edge (bb)->flags & EDGE_ABNORMAL) == 0
1972 && potentially_threadable_block (single_succ (bb)))
1974 thread_across_edge (single_succ_edge (bb));
1976 else if ((last = last_stmt (bb))
1977 && gimple_code (last) == GIMPLE_COND
1978 && EDGE_COUNT (bb->succs) == 2
1979 && (EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL) == 0
1980 && (EDGE_SUCC (bb, 1)->flags & EDGE_ABNORMAL) == 0)
1982 edge true_edge, false_edge;
1984 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
1986 /* Only try to thread the edge if it reaches a target block with
1987 more than one predecessor and more than one successor. */
1988 if (potentially_threadable_block (true_edge->dest))
1989 thread_across_edge (true_edge);
1991 /* Similarly for the ELSE arm. */
1992 if (potentially_threadable_block (false_edge->dest))
1993 thread_across_edge (false_edge);
1997 /* These remove expressions local to BB from the tables. */
1998 remove_local_expressions_from_table ();
1999 const_and_copies->pop_to_marker ();
2002 /* Search for redundant computations in STMT. If any are found, then
2003 replace them with the variable holding the result of the computation.
2005 If safe, record this expression into the available expression hash
2006 table. */
2008 static void
2009 eliminate_redundant_computations (gimple_stmt_iterator* gsi)
2011 tree expr_type;
2012 tree cached_lhs;
2013 tree def;
2014 bool insert = true;
2015 bool assigns_var_p = false;
2017 gimple stmt = gsi_stmt (*gsi);
2019 if (gimple_code (stmt) == GIMPLE_PHI)
2020 def = gimple_phi_result (stmt);
2021 else
2022 def = gimple_get_lhs (stmt);
2024 /* Certain expressions on the RHS can be optimized away, but can not
2025 themselves be entered into the hash tables. */
2026 if (! def
2027 || TREE_CODE (def) != SSA_NAME
2028 || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def)
2029 || gimple_vdef (stmt)
2030 /* Do not record equivalences for increments of ivs. This would create
2031 overlapping live ranges for a very questionable gain. */
2032 || simple_iv_increment_p (stmt))
2033 insert = false;
2035 /* Check if the expression has been computed before. */
2036 cached_lhs = lookup_avail_expr (stmt, insert);
2038 opt_stats.num_exprs_considered++;
2040 /* Get the type of the expression we are trying to optimize. */
2041 if (is_gimple_assign (stmt))
2043 expr_type = TREE_TYPE (gimple_assign_lhs (stmt));
2044 assigns_var_p = true;
2046 else if (gimple_code (stmt) == GIMPLE_COND)
2047 expr_type = boolean_type_node;
2048 else if (is_gimple_call (stmt))
2050 gcc_assert (gimple_call_lhs (stmt));
2051 expr_type = TREE_TYPE (gimple_call_lhs (stmt));
2052 assigns_var_p = true;
2054 else if (gswitch *swtch_stmt = dyn_cast <gswitch *> (stmt))
2055 expr_type = TREE_TYPE (gimple_switch_index (swtch_stmt));
2056 else if (gimple_code (stmt) == GIMPLE_PHI)
2057 /* We can't propagate into a phi, so the logic below doesn't apply.
2058 Instead record an equivalence between the cached LHS and the
2059 PHI result of this statement, provided they are in the same block.
2060 This should be sufficient to kill the redundant phi. */
2062 if (def && cached_lhs)
2063 const_and_copies->record_const_or_copy (def, cached_lhs);
2064 return;
2066 else
2067 gcc_unreachable ();
2069 if (!cached_lhs)
2070 return;
2072 /* It is safe to ignore types here since we have already done
2073 type checking in the hashing and equality routines. In fact
2074 type checking here merely gets in the way of constant
2075 propagation. Also, make sure that it is safe to propagate
2076 CACHED_LHS into the expression in STMT. */
2077 if ((TREE_CODE (cached_lhs) != SSA_NAME
2078 && (assigns_var_p
2079 || useless_type_conversion_p (expr_type, TREE_TYPE (cached_lhs))))
2080 || may_propagate_copy_into_stmt (stmt, cached_lhs))
2082 gcc_checking_assert (TREE_CODE (cached_lhs) == SSA_NAME
2083 || is_gimple_min_invariant (cached_lhs));
2085 if (dump_file && (dump_flags & TDF_DETAILS))
2087 fprintf (dump_file, " Replaced redundant expr '");
2088 print_gimple_expr (dump_file, stmt, 0, dump_flags);
2089 fprintf (dump_file, "' with '");
2090 print_generic_expr (dump_file, cached_lhs, dump_flags);
2091 fprintf (dump_file, "'\n");
2094 opt_stats.num_re++;
2096 if (assigns_var_p
2097 && !useless_type_conversion_p (expr_type, TREE_TYPE (cached_lhs)))
2098 cached_lhs = fold_convert (expr_type, cached_lhs);
2100 propagate_tree_value_into_stmt (gsi, cached_lhs);
2102 /* Since it is always necessary to mark the result as modified,
2103 perhaps we should move this into propagate_tree_value_into_stmt
2104 itself. */
2105 gimple_set_modified (gsi_stmt (*gsi), true);
2109 /* STMT, a GIMPLE_ASSIGN, may create certain equivalences, in either
2110 the available expressions table or the const_and_copies table.
2111 Detect and record those equivalences. */
2112 /* We handle only very simple copy equivalences here. The heavy
2113 lifing is done by eliminate_redundant_computations. */
2115 static void
2116 record_equivalences_from_stmt (gimple stmt, int may_optimize_p)
2118 tree lhs;
2119 enum tree_code lhs_code;
2121 gcc_assert (is_gimple_assign (stmt));
2123 lhs = gimple_assign_lhs (stmt);
2124 lhs_code = TREE_CODE (lhs);
2126 if (lhs_code == SSA_NAME
2127 && gimple_assign_single_p (stmt))
2129 tree rhs = gimple_assign_rhs1 (stmt);
2131 /* If the RHS of the assignment is a constant or another variable that
2132 may be propagated, register it in the CONST_AND_COPIES table. We
2133 do not need to record unwind data for this, since this is a true
2134 assignment and not an equivalence inferred from a comparison. All
2135 uses of this ssa name are dominated by this assignment, so unwinding
2136 just costs time and space. */
2137 if (may_optimize_p
2138 && (TREE_CODE (rhs) == SSA_NAME
2139 || is_gimple_min_invariant (rhs)))
2141 /* Valueize rhs. */
2142 if (TREE_CODE (rhs) == SSA_NAME)
2144 tree tmp = SSA_NAME_VALUE (rhs);
2145 rhs = tmp ? tmp : rhs;
2148 if (dump_file && (dump_flags & TDF_DETAILS))
2150 fprintf (dump_file, "==== ASGN ");
2151 print_generic_expr (dump_file, lhs, 0);
2152 fprintf (dump_file, " = ");
2153 print_generic_expr (dump_file, rhs, 0);
2154 fprintf (dump_file, "\n");
2157 set_ssa_name_value (lhs, rhs);
2161 /* Make sure we can propagate &x + CST. */
2162 if (lhs_code == SSA_NAME
2163 && gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR
2164 && TREE_CODE (gimple_assign_rhs1 (stmt)) == ADDR_EXPR
2165 && TREE_CODE (gimple_assign_rhs2 (stmt)) == INTEGER_CST)
2167 tree op0 = gimple_assign_rhs1 (stmt);
2168 tree op1 = gimple_assign_rhs2 (stmt);
2169 tree new_rhs
2170 = build_fold_addr_expr (fold_build2 (MEM_REF,
2171 TREE_TYPE (TREE_TYPE (op0)),
2172 unshare_expr (op0),
2173 fold_convert (ptr_type_node,
2174 op1)));
2175 if (dump_file && (dump_flags & TDF_DETAILS))
2177 fprintf (dump_file, "==== ASGN ");
2178 print_generic_expr (dump_file, lhs, 0);
2179 fprintf (dump_file, " = ");
2180 print_generic_expr (dump_file, new_rhs, 0);
2181 fprintf (dump_file, "\n");
2184 set_ssa_name_value (lhs, new_rhs);
2187 /* A memory store, even an aliased store, creates a useful
2188 equivalence. By exchanging the LHS and RHS, creating suitable
2189 vops and recording the result in the available expression table,
2190 we may be able to expose more redundant loads. */
2191 if (!gimple_has_volatile_ops (stmt)
2192 && gimple_references_memory_p (stmt)
2193 && gimple_assign_single_p (stmt)
2194 && (TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
2195 || is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))
2196 && !is_gimple_reg (lhs))
2198 tree rhs = gimple_assign_rhs1 (stmt);
2199 gassign *new_stmt;
2201 /* Build a new statement with the RHS and LHS exchanged. */
2202 if (TREE_CODE (rhs) == SSA_NAME)
2204 /* NOTE tuples. The call to gimple_build_assign below replaced
2205 a call to build_gimple_modify_stmt, which did not set the
2206 SSA_NAME_DEF_STMT on the LHS of the assignment. Doing so
2207 may cause an SSA validation failure, as the LHS may be a
2208 default-initialized name and should have no definition. I'm
2209 a bit dubious of this, as the artificial statement that we
2210 generate here may in fact be ill-formed, but it is simply
2211 used as an internal device in this pass, and never becomes
2212 part of the CFG. */
2213 gimple defstmt = SSA_NAME_DEF_STMT (rhs);
2214 new_stmt = gimple_build_assign (rhs, lhs);
2215 SSA_NAME_DEF_STMT (rhs) = defstmt;
2217 else
2218 new_stmt = gimple_build_assign (rhs, lhs);
2220 gimple_set_vuse (new_stmt, gimple_vdef (stmt));
2222 /* Finally enter the statement into the available expression
2223 table. */
2224 lookup_avail_expr (new_stmt, true);
2228 /* Replace *OP_P in STMT with any known equivalent value for *OP_P from
2229 CONST_AND_COPIES. */
2231 static void
2232 cprop_operand (gimple stmt, use_operand_p op_p)
2234 tree val;
2235 tree op = USE_FROM_PTR (op_p);
2237 /* If the operand has a known constant value or it is known to be a
2238 copy of some other variable, use the value or copy stored in
2239 CONST_AND_COPIES. */
2240 val = SSA_NAME_VALUE (op);
2241 if (val && val != op)
2243 /* Do not replace hard register operands in asm statements. */
2244 if (gimple_code (stmt) == GIMPLE_ASM
2245 && !may_propagate_copy_into_asm (op))
2246 return;
2248 /* Certain operands are not allowed to be copy propagated due
2249 to their interaction with exception handling and some GCC
2250 extensions. */
2251 if (!may_propagate_copy (op, val))
2252 return;
2254 /* Do not propagate copies into BIVs.
2255 See PR23821 and PR62217 for how this can disturb IV and
2256 number of iteration analysis. */
2257 if (TREE_CODE (val) != INTEGER_CST)
2259 gimple def = SSA_NAME_DEF_STMT (op);
2260 if (gimple_code (def) == GIMPLE_PHI
2261 && gimple_bb (def)->loop_father->header == gimple_bb (def))
2262 return;
2265 /* Dump details. */
2266 if (dump_file && (dump_flags & TDF_DETAILS))
2268 fprintf (dump_file, " Replaced '");
2269 print_generic_expr (dump_file, op, dump_flags);
2270 fprintf (dump_file, "' with %s '",
2271 (TREE_CODE (val) != SSA_NAME ? "constant" : "variable"));
2272 print_generic_expr (dump_file, val, dump_flags);
2273 fprintf (dump_file, "'\n");
2276 if (TREE_CODE (val) != SSA_NAME)
2277 opt_stats.num_const_prop++;
2278 else
2279 opt_stats.num_copy_prop++;
2281 propagate_value (op_p, val);
2283 /* And note that we modified this statement. This is now
2284 safe, even if we changed virtual operands since we will
2285 rescan the statement and rewrite its operands again. */
2286 gimple_set_modified (stmt, true);
2290 /* CONST_AND_COPIES is a table which maps an SSA_NAME to the current
2291 known value for that SSA_NAME (or NULL if no value is known).
2293 Propagate values from CONST_AND_COPIES into the uses, vuses and
2294 vdef_ops of STMT. */
2296 static void
2297 cprop_into_stmt (gimple stmt)
2299 use_operand_p op_p;
2300 ssa_op_iter iter;
2302 FOR_EACH_SSA_USE_OPERAND (op_p, stmt, iter, SSA_OP_USE)
2303 cprop_operand (stmt, op_p);
2306 /* Optimize the statement pointed to by iterator SI.
2308 We try to perform some simplistic global redundancy elimination and
2309 constant propagation:
2311 1- To detect global redundancy, we keep track of expressions that have
2312 been computed in this block and its dominators. If we find that the
2313 same expression is computed more than once, we eliminate repeated
2314 computations by using the target of the first one.
2316 2- Constant values and copy assignments. This is used to do very
2317 simplistic constant and copy propagation. When a constant or copy
2318 assignment is found, we map the value on the RHS of the assignment to
2319 the variable in the LHS in the CONST_AND_COPIES table. */
2321 static void
2322 optimize_stmt (basic_block bb, gimple_stmt_iterator si)
2324 gimple stmt, old_stmt;
2325 bool may_optimize_p;
2326 bool modified_p = false;
2327 bool was_noreturn;
2329 old_stmt = stmt = gsi_stmt (si);
2330 was_noreturn = is_gimple_call (stmt) && gimple_call_noreturn_p (stmt);
2332 if (dump_file && (dump_flags & TDF_DETAILS))
2334 fprintf (dump_file, "Optimizing statement ");
2335 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
2338 if (gimple_code (stmt) == GIMPLE_COND)
2339 canonicalize_comparison (as_a <gcond *> (stmt));
2341 update_stmt_if_modified (stmt);
2342 opt_stats.num_stmts++;
2344 /* Const/copy propagate into USES, VUSES and the RHS of VDEFs. */
2345 cprop_into_stmt (stmt);
2347 /* If the statement has been modified with constant replacements,
2348 fold its RHS before checking for redundant computations. */
2349 if (gimple_modified_p (stmt))
2351 tree rhs = NULL;
2353 /* Try to fold the statement making sure that STMT is kept
2354 up to date. */
2355 if (fold_stmt (&si))
2357 stmt = gsi_stmt (si);
2358 gimple_set_modified (stmt, true);
2360 if (dump_file && (dump_flags & TDF_DETAILS))
2362 fprintf (dump_file, " Folded to: ");
2363 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
2367 /* We only need to consider cases that can yield a gimple operand. */
2368 if (gimple_assign_single_p (stmt))
2369 rhs = gimple_assign_rhs1 (stmt);
2370 else if (gimple_code (stmt) == GIMPLE_GOTO)
2371 rhs = gimple_goto_dest (stmt);
2372 else if (gswitch *swtch_stmt = dyn_cast <gswitch *> (stmt))
2373 /* This should never be an ADDR_EXPR. */
2374 rhs = gimple_switch_index (swtch_stmt);
2376 if (rhs && TREE_CODE (rhs) == ADDR_EXPR)
2377 recompute_tree_invariant_for_addr_expr (rhs);
2379 /* Indicate that maybe_clean_or_replace_eh_stmt needs to be called,
2380 even if fold_stmt updated the stmt already and thus cleared
2381 gimple_modified_p flag on it. */
2382 modified_p = true;
2385 /* Check for redundant computations. Do this optimization only
2386 for assignments that have no volatile ops and conditionals. */
2387 may_optimize_p = (!gimple_has_side_effects (stmt)
2388 && (is_gimple_assign (stmt)
2389 || (is_gimple_call (stmt)
2390 && gimple_call_lhs (stmt) != NULL_TREE)
2391 || gimple_code (stmt) == GIMPLE_COND
2392 || gimple_code (stmt) == GIMPLE_SWITCH));
2394 if (may_optimize_p)
2396 if (gimple_code (stmt) == GIMPLE_CALL)
2398 /* Resolve __builtin_constant_p. If it hasn't been
2399 folded to integer_one_node by now, it's fairly
2400 certain that the value simply isn't constant. */
2401 tree callee = gimple_call_fndecl (stmt);
2402 if (callee
2403 && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL
2404 && DECL_FUNCTION_CODE (callee) == BUILT_IN_CONSTANT_P)
2406 propagate_tree_value_into_stmt (&si, integer_zero_node);
2407 stmt = gsi_stmt (si);
2411 update_stmt_if_modified (stmt);
2412 eliminate_redundant_computations (&si);
2413 stmt = gsi_stmt (si);
2415 /* Perform simple redundant store elimination. */
2416 if (gimple_assign_single_p (stmt)
2417 && TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME)
2419 tree lhs = gimple_assign_lhs (stmt);
2420 tree rhs = gimple_assign_rhs1 (stmt);
2421 tree cached_lhs;
2422 gassign *new_stmt;
2423 if (TREE_CODE (rhs) == SSA_NAME)
2425 tree tem = SSA_NAME_VALUE (rhs);
2426 if (tem)
2427 rhs = tem;
2429 /* Build a new statement with the RHS and LHS exchanged. */
2430 if (TREE_CODE (rhs) == SSA_NAME)
2432 gimple defstmt = SSA_NAME_DEF_STMT (rhs);
2433 new_stmt = gimple_build_assign (rhs, lhs);
2434 SSA_NAME_DEF_STMT (rhs) = defstmt;
2436 else
2437 new_stmt = gimple_build_assign (rhs, lhs);
2438 gimple_set_vuse (new_stmt, gimple_vuse (stmt));
2439 cached_lhs = lookup_avail_expr (new_stmt, false);
2440 if (cached_lhs
2441 && rhs == cached_lhs)
2443 basic_block bb = gimple_bb (stmt);
2444 unlink_stmt_vdef (stmt);
2445 if (gsi_remove (&si, true))
2447 bitmap_set_bit (need_eh_cleanup, bb->index);
2448 if (dump_file && (dump_flags & TDF_DETAILS))
2449 fprintf (dump_file, " Flagged to clear EH edges.\n");
2451 release_defs (stmt);
2452 return;
2457 /* Record any additional equivalences created by this statement. */
2458 if (is_gimple_assign (stmt))
2459 record_equivalences_from_stmt (stmt, may_optimize_p);
2461 /* If STMT is a COND_EXPR and it was modified, then we may know
2462 where it goes. If that is the case, then mark the CFG as altered.
2464 This will cause us to later call remove_unreachable_blocks and
2465 cleanup_tree_cfg when it is safe to do so. It is not safe to
2466 clean things up here since removal of edges and such can trigger
2467 the removal of PHI nodes, which in turn can release SSA_NAMEs to
2468 the manager.
2470 That's all fine and good, except that once SSA_NAMEs are released
2471 to the manager, we must not call create_ssa_name until all references
2472 to released SSA_NAMEs have been eliminated.
2474 All references to the deleted SSA_NAMEs can not be eliminated until
2475 we remove unreachable blocks.
2477 We can not remove unreachable blocks until after we have completed
2478 any queued jump threading.
2480 We can not complete any queued jump threads until we have taken
2481 appropriate variables out of SSA form. Taking variables out of
2482 SSA form can call create_ssa_name and thus we lose.
2484 Ultimately I suspect we're going to need to change the interface
2485 into the SSA_NAME manager. */
2486 if (gimple_modified_p (stmt) || modified_p)
2488 tree val = NULL;
2490 update_stmt_if_modified (stmt);
2492 if (gimple_code (stmt) == GIMPLE_COND)
2493 val = fold_binary_loc (gimple_location (stmt),
2494 gimple_cond_code (stmt), boolean_type_node,
2495 gimple_cond_lhs (stmt), gimple_cond_rhs (stmt));
2496 else if (gswitch *swtch_stmt = dyn_cast <gswitch *> (stmt))
2497 val = gimple_switch_index (swtch_stmt);
2499 if (val && TREE_CODE (val) == INTEGER_CST && find_taken_edge (bb, val))
2500 cfg_altered = true;
2502 /* If we simplified a statement in such a way as to be shown that it
2503 cannot trap, update the eh information and the cfg to match. */
2504 if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt))
2506 bitmap_set_bit (need_eh_cleanup, bb->index);
2507 if (dump_file && (dump_flags & TDF_DETAILS))
2508 fprintf (dump_file, " Flagged to clear EH edges.\n");
2511 if (!was_noreturn
2512 && is_gimple_call (stmt) && gimple_call_noreturn_p (stmt))
2513 need_noreturn_fixup.safe_push (stmt);
2517 /* Helper for walk_non_aliased_vuses. Determine if we arrived at
2518 the desired memory state. */
2520 static void *
2521 vuse_eq (ao_ref *, tree vuse1, unsigned int cnt, void *data)
2523 tree vuse2 = (tree) data;
2524 if (vuse1 == vuse2)
2525 return data;
2527 /* This bounds the stmt walks we perform on reference lookups
2528 to O(1) instead of O(N) where N is the number of dominating
2529 stores leading to a candidate. We re-use the SCCVN param
2530 for this as it is basically the same complexity. */
2531 if (cnt > (unsigned) PARAM_VALUE (PARAM_SCCVN_MAX_ALIAS_QUERIES_PER_ACCESS))
2532 return (void *)-1;
2534 return NULL;
2537 /* Search for an existing instance of STMT in the AVAIL_EXPRS table.
2538 If found, return its LHS. Otherwise insert STMT in the table and
2539 return NULL_TREE.
2541 Also, when an expression is first inserted in the table, it is also
2542 is also added to AVAIL_EXPRS_STACK, so that it can be removed when
2543 we finish processing this block and its children. */
2545 static tree
2546 lookup_avail_expr (gimple stmt, bool insert)
2548 expr_hash_elt **slot;
2549 tree lhs;
2550 tree temp;
2551 struct expr_hash_elt element;
2553 /* Get LHS of phi, assignment, or call; else NULL_TREE. */
2554 if (gimple_code (stmt) == GIMPLE_PHI)
2555 lhs = gimple_phi_result (stmt);
2556 else
2557 lhs = gimple_get_lhs (stmt);
2559 initialize_hash_element (stmt, lhs, &element);
2561 if (dump_file && (dump_flags & TDF_DETAILS))
2563 fprintf (dump_file, "LKUP ");
2564 print_expr_hash_elt (dump_file, &element);
2567 /* Don't bother remembering constant assignments and copy operations.
2568 Constants and copy operations are handled by the constant/copy propagator
2569 in optimize_stmt. */
2570 if (element.expr.kind == EXPR_SINGLE
2571 && (TREE_CODE (element.expr.ops.single.rhs) == SSA_NAME
2572 || is_gimple_min_invariant (element.expr.ops.single.rhs)))
2573 return NULL_TREE;
2575 /* Finally try to find the expression in the main expression hash table. */
2576 slot = avail_exprs->find_slot (&element, (insert ? INSERT : NO_INSERT));
2577 if (slot == NULL)
2579 free_expr_hash_elt_contents (&element);
2580 return NULL_TREE;
2582 else if (*slot == NULL)
2584 struct expr_hash_elt *element2 = XNEW (struct expr_hash_elt);
2585 *element2 = element;
2586 element2->stamp = element2;
2587 *slot = element2;
2589 if (dump_file && (dump_flags & TDF_DETAILS))
2591 fprintf (dump_file, "2>>> ");
2592 print_expr_hash_elt (dump_file, element2);
2595 avail_exprs_stack.safe_push
2596 (std::pair<expr_hash_elt_t, expr_hash_elt_t> (element2, NULL));
2597 return NULL_TREE;
2600 /* If we found a redundant memory operation do an alias walk to
2601 check if we can re-use it. */
2602 if (gimple_vuse (stmt) != (*slot)->vop)
2604 tree vuse1 = (*slot)->vop;
2605 tree vuse2 = gimple_vuse (stmt);
2606 /* If we have a load of a register and a candidate in the
2607 hash with vuse1 then try to reach its stmt by walking
2608 up the virtual use-def chain using walk_non_aliased_vuses.
2609 But don't do this when removing expressions from the hash. */
2610 ao_ref ref;
2611 if (!(vuse1 && vuse2
2612 && gimple_assign_single_p (stmt)
2613 && TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME
2614 && (ao_ref_init (&ref, gimple_assign_rhs1 (stmt)), true)
2615 && walk_non_aliased_vuses (&ref, vuse2,
2616 vuse_eq, NULL, NULL, vuse1) != NULL))
2618 if (insert)
2620 struct expr_hash_elt *element2 = XNEW (struct expr_hash_elt);
2621 *element2 = element;
2622 element2->stamp = element2;
2624 /* Insert the expr into the hash by replacing the current
2625 entry and recording the value to restore in the
2626 avail_exprs_stack. */
2627 avail_exprs_stack.safe_push (std::make_pair (element2, *slot));
2628 *slot = element2;
2629 if (dump_file && (dump_flags & TDF_DETAILS))
2631 fprintf (dump_file, "2>>> ");
2632 print_expr_hash_elt (dump_file, *slot);
2635 return NULL_TREE;
2639 free_expr_hash_elt_contents (&element);
2641 /* Extract the LHS of the assignment so that it can be used as the current
2642 definition of another variable. */
2643 lhs = (*slot)->lhs;
2645 /* See if the LHS appears in the CONST_AND_COPIES table. If it does, then
2646 use the value from the const_and_copies table. */
2647 if (TREE_CODE (lhs) == SSA_NAME)
2649 temp = SSA_NAME_VALUE (lhs);
2650 if (temp)
2651 lhs = temp;
2654 if (dump_file && (dump_flags & TDF_DETAILS))
2656 fprintf (dump_file, "FIND: ");
2657 print_generic_expr (dump_file, lhs, 0);
2658 fprintf (dump_file, "\n");
2661 return lhs;
2664 /* Hashing and equality functions for AVAIL_EXPRS. We compute a value number
2665 for expressions using the code of the expression and the SSA numbers of
2666 its operands. */
2668 static hashval_t
2669 avail_expr_hash (const void *p)
2671 const struct hashable_expr *expr = &((const struct expr_hash_elt *)p)->expr;
2672 inchash::hash hstate;
2674 inchash::add_hashable_expr (expr, hstate);
2676 return hstate.end ();
2679 /* PHI-ONLY copy and constant propagation. This pass is meant to clean
2680 up degenerate PHIs created by or exposed by jump threading. */
2682 /* Given a statement STMT, which is either a PHI node or an assignment,
2683 remove it from the IL. */
2685 static void
2686 remove_stmt_or_phi (gimple stmt)
2688 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
2690 if (gimple_code (stmt) == GIMPLE_PHI)
2691 remove_phi_node (&gsi, true);
2692 else
2694 gsi_remove (&gsi, true);
2695 release_defs (stmt);
2699 /* Given a statement STMT, which is either a PHI node or an assignment,
2700 return the "rhs" of the node, in the case of a non-degenerate
2701 phi, NULL is returned. */
2703 static tree
2704 get_rhs_or_phi_arg (gimple stmt)
2706 if (gimple_code (stmt) == GIMPLE_PHI)
2707 return degenerate_phi_result (as_a <gphi *> (stmt));
2708 else if (gimple_assign_single_p (stmt))
2709 return gimple_assign_rhs1 (stmt);
2710 else
2711 gcc_unreachable ();
2715 /* Given a statement STMT, which is either a PHI node or an assignment,
2716 return the "lhs" of the node. */
2718 static tree
2719 get_lhs_or_phi_result (gimple stmt)
2721 if (gimple_code (stmt) == GIMPLE_PHI)
2722 return gimple_phi_result (stmt);
2723 else if (is_gimple_assign (stmt))
2724 return gimple_assign_lhs (stmt);
2725 else
2726 gcc_unreachable ();
2729 /* Propagate RHS into all uses of LHS (when possible).
2731 RHS and LHS are derived from STMT, which is passed in solely so
2732 that we can remove it if propagation is successful.
2734 When propagating into a PHI node or into a statement which turns
2735 into a trivial copy or constant initialization, set the
2736 appropriate bit in INTERESTING_NAMEs so that we will visit those
2737 nodes as well in an effort to pick up secondary optimization
2738 opportunities. */
2740 static void
2741 propagate_rhs_into_lhs (gimple stmt, tree lhs, tree rhs, bitmap interesting_names)
2743 /* First verify that propagation is valid. */
2744 if (may_propagate_copy (lhs, rhs))
2746 use_operand_p use_p;
2747 imm_use_iterator iter;
2748 gimple use_stmt;
2749 bool all = true;
2751 /* Dump details. */
2752 if (dump_file && (dump_flags & TDF_DETAILS))
2754 fprintf (dump_file, " Replacing '");
2755 print_generic_expr (dump_file, lhs, dump_flags);
2756 fprintf (dump_file, "' with %s '",
2757 (TREE_CODE (rhs) != SSA_NAME ? "constant" : "variable"));
2758 print_generic_expr (dump_file, rhs, dump_flags);
2759 fprintf (dump_file, "'\n");
2762 /* Walk over every use of LHS and try to replace the use with RHS.
2763 At this point the only reason why such a propagation would not
2764 be successful would be if the use occurs in an ASM_EXPR. */
2765 FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs)
2767 /* Leave debug stmts alone. If we succeed in propagating
2768 all non-debug uses, we'll drop the DEF, and propagation
2769 into debug stmts will occur then. */
2770 if (gimple_debug_bind_p (use_stmt))
2771 continue;
2773 /* It's not always safe to propagate into an ASM_EXPR. */
2774 if (gimple_code (use_stmt) == GIMPLE_ASM
2775 && ! may_propagate_copy_into_asm (lhs))
2777 all = false;
2778 continue;
2781 /* It's not ok to propagate into the definition stmt of RHS.
2782 <bb 9>:
2783 # prephitmp.12_36 = PHI <g_67.1_6(9)>
2784 g_67.1_6 = prephitmp.12_36;
2785 goto <bb 9>;
2786 While this is strictly all dead code we do not want to
2787 deal with this here. */
2788 if (TREE_CODE (rhs) == SSA_NAME
2789 && SSA_NAME_DEF_STMT (rhs) == use_stmt)
2791 all = false;
2792 continue;
2795 /* Dump details. */
2796 if (dump_file && (dump_flags & TDF_DETAILS))
2798 fprintf (dump_file, " Original statement:");
2799 print_gimple_stmt (dump_file, use_stmt, 0, dump_flags);
2802 /* Propagate the RHS into this use of the LHS. */
2803 FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
2804 propagate_value (use_p, rhs);
2806 /* Special cases to avoid useless calls into the folding
2807 routines, operand scanning, etc.
2809 Propagation into a PHI may cause the PHI to become
2810 a degenerate, so mark the PHI as interesting. No other
2811 actions are necessary. */
2812 if (gimple_code (use_stmt) == GIMPLE_PHI)
2814 tree result;
2816 /* Dump details. */
2817 if (dump_file && (dump_flags & TDF_DETAILS))
2819 fprintf (dump_file, " Updated statement:");
2820 print_gimple_stmt (dump_file, use_stmt, 0, dump_flags);
2823 result = get_lhs_or_phi_result (use_stmt);
2824 bitmap_set_bit (interesting_names, SSA_NAME_VERSION (result));
2825 continue;
2828 /* From this point onward we are propagating into a
2829 real statement. Folding may (or may not) be possible,
2830 we may expose new operands, expose dead EH edges,
2831 etc. */
2832 /* NOTE tuples. In the tuples world, fold_stmt_inplace
2833 cannot fold a call that simplifies to a constant,
2834 because the GIMPLE_CALL must be replaced by a
2835 GIMPLE_ASSIGN, and there is no way to effect such a
2836 transformation in-place. We might want to consider
2837 using the more general fold_stmt here. */
2839 gimple_stmt_iterator gsi = gsi_for_stmt (use_stmt);
2840 fold_stmt_inplace (&gsi);
2843 /* Sometimes propagation can expose new operands to the
2844 renamer. */
2845 update_stmt (use_stmt);
2847 /* Dump details. */
2848 if (dump_file && (dump_flags & TDF_DETAILS))
2850 fprintf (dump_file, " Updated statement:");
2851 print_gimple_stmt (dump_file, use_stmt, 0, dump_flags);
2854 /* If we replaced a variable index with a constant, then
2855 we would need to update the invariant flag for ADDR_EXPRs. */
2856 if (gimple_assign_single_p (use_stmt)
2857 && TREE_CODE (gimple_assign_rhs1 (use_stmt)) == ADDR_EXPR)
2858 recompute_tree_invariant_for_addr_expr
2859 (gimple_assign_rhs1 (use_stmt));
2861 /* If we cleaned up EH information from the statement,
2862 mark its containing block as needing EH cleanups. */
2863 if (maybe_clean_or_replace_eh_stmt (use_stmt, use_stmt))
2865 bitmap_set_bit (need_eh_cleanup, gimple_bb (use_stmt)->index);
2866 if (dump_file && (dump_flags & TDF_DETAILS))
2867 fprintf (dump_file, " Flagged to clear EH edges.\n");
2870 /* Propagation may expose new trivial copy/constant propagation
2871 opportunities. */
2872 if (gimple_assign_single_p (use_stmt)
2873 && TREE_CODE (gimple_assign_lhs (use_stmt)) == SSA_NAME
2874 && (TREE_CODE (gimple_assign_rhs1 (use_stmt)) == SSA_NAME
2875 || is_gimple_min_invariant (gimple_assign_rhs1 (use_stmt))))
2877 tree result = get_lhs_or_phi_result (use_stmt);
2878 bitmap_set_bit (interesting_names, SSA_NAME_VERSION (result));
2881 /* Propagation into these nodes may make certain edges in
2882 the CFG unexecutable. We want to identify them as PHI nodes
2883 at the destination of those unexecutable edges may become
2884 degenerates. */
2885 else if (gimple_code (use_stmt) == GIMPLE_COND
2886 || gimple_code (use_stmt) == GIMPLE_SWITCH
2887 || gimple_code (use_stmt) == GIMPLE_GOTO)
2889 tree val;
2891 if (gimple_code (use_stmt) == GIMPLE_COND)
2892 val = fold_binary_loc (gimple_location (use_stmt),
2893 gimple_cond_code (use_stmt),
2894 boolean_type_node,
2895 gimple_cond_lhs (use_stmt),
2896 gimple_cond_rhs (use_stmt));
2897 else if (gimple_code (use_stmt) == GIMPLE_SWITCH)
2898 val = gimple_switch_index (as_a <gswitch *> (use_stmt));
2899 else
2900 val = gimple_goto_dest (use_stmt);
2902 if (val && is_gimple_min_invariant (val))
2904 basic_block bb = gimple_bb (use_stmt);
2905 edge te = find_taken_edge (bb, val);
2906 if (!te)
2907 continue;
2909 edge_iterator ei;
2910 edge e;
2911 gimple_stmt_iterator gsi;
2912 gphi_iterator psi;
2914 /* Remove all outgoing edges except TE. */
2915 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei));)
2917 if (e != te)
2919 /* Mark all the PHI nodes at the destination of
2920 the unexecutable edge as interesting. */
2921 for (psi = gsi_start_phis (e->dest);
2922 !gsi_end_p (psi);
2923 gsi_next (&psi))
2925 gphi *phi = psi.phi ();
2927 tree result = gimple_phi_result (phi);
2928 int version = SSA_NAME_VERSION (result);
2930 bitmap_set_bit (interesting_names, version);
2933 te->probability += e->probability;
2935 te->count += e->count;
2936 remove_edge (e);
2937 cfg_altered = true;
2939 else
2940 ei_next (&ei);
2943 gsi = gsi_last_bb (gimple_bb (use_stmt));
2944 gsi_remove (&gsi, true);
2946 /* And fixup the flags on the single remaining edge. */
2947 te->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
2948 te->flags &= ~EDGE_ABNORMAL;
2949 te->flags |= EDGE_FALLTHRU;
2950 if (te->probability > REG_BR_PROB_BASE)
2951 te->probability = REG_BR_PROB_BASE;
2956 /* Ensure there is nothing else to do. */
2957 gcc_assert (!all || has_zero_uses (lhs));
2959 /* If we were able to propagate away all uses of LHS, then
2960 we can remove STMT. */
2961 if (all)
2962 remove_stmt_or_phi (stmt);
2966 /* STMT is either a PHI node (potentially a degenerate PHI node) or
2967 a statement that is a trivial copy or constant initialization.
2969 Attempt to eliminate T by propagating its RHS into all uses of
2970 its LHS. This may in turn set new bits in INTERESTING_NAMES
2971 for nodes we want to revisit later.
2973 All exit paths should clear INTERESTING_NAMES for the result
2974 of STMT. */
2976 static void
2977 eliminate_const_or_copy (gimple stmt, bitmap interesting_names)
2979 tree lhs = get_lhs_or_phi_result (stmt);
2980 tree rhs;
2981 int version = SSA_NAME_VERSION (lhs);
2983 /* If the LHS of this statement or PHI has no uses, then we can
2984 just eliminate it. This can occur if, for example, the PHI
2985 was created by block duplication due to threading and its only
2986 use was in the conditional at the end of the block which was
2987 deleted. */
2988 if (has_zero_uses (lhs))
2990 bitmap_clear_bit (interesting_names, version);
2991 remove_stmt_or_phi (stmt);
2992 return;
2995 /* Get the RHS of the assignment or PHI node if the PHI is a
2996 degenerate. */
2997 rhs = get_rhs_or_phi_arg (stmt);
2998 if (!rhs)
3000 bitmap_clear_bit (interesting_names, version);
3001 return;
3004 if (!virtual_operand_p (lhs))
3005 propagate_rhs_into_lhs (stmt, lhs, rhs, interesting_names);
3006 else
3008 gimple use_stmt;
3009 imm_use_iterator iter;
3010 use_operand_p use_p;
3011 /* For virtual operands we have to propagate into all uses as
3012 otherwise we will create overlapping life-ranges. */
3013 FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs)
3014 FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
3015 SET_USE (use_p, rhs);
3016 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
3017 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs) = 1;
3018 remove_stmt_or_phi (stmt);
3021 /* Note that STMT may well have been deleted by now, so do
3022 not access it, instead use the saved version # to clear
3023 T's entry in the worklist. */
3024 bitmap_clear_bit (interesting_names, version);
3027 /* The first phase in degenerate PHI elimination.
3029 Eliminate the degenerate PHIs in BB, then recurse on the
3030 dominator children of BB. */
3032 static void
3033 eliminate_degenerate_phis_1 (basic_block bb, bitmap interesting_names)
3035 gphi_iterator gsi;
3036 basic_block son;
3038 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
3040 gphi *phi = gsi.phi ();
3042 eliminate_const_or_copy (phi, interesting_names);
3045 /* Recurse into the dominator children of BB. */
3046 for (son = first_dom_son (CDI_DOMINATORS, bb);
3047 son;
3048 son = next_dom_son (CDI_DOMINATORS, son))
3049 eliminate_degenerate_phis_1 (son, interesting_names);
3053 /* A very simple pass to eliminate degenerate PHI nodes from the
3054 IL. This is meant to be fast enough to be able to be run several
3055 times in the optimization pipeline.
3057 Certain optimizations, particularly those which duplicate blocks
3058 or remove edges from the CFG can create or expose PHIs which are
3059 trivial copies or constant initializations.
3061 While we could pick up these optimizations in DOM or with the
3062 combination of copy-prop and CCP, those solutions are far too
3063 heavy-weight for our needs.
3065 This implementation has two phases so that we can efficiently
3066 eliminate the first order degenerate PHIs and second order
3067 degenerate PHIs.
3069 The first phase performs a dominator walk to identify and eliminate
3070 the vast majority of the degenerate PHIs. When a degenerate PHI
3071 is identified and eliminated any affected statements or PHIs
3072 are put on a worklist.
3074 The second phase eliminates degenerate PHIs and trivial copies
3075 or constant initializations using the worklist. This is how we
3076 pick up the secondary optimization opportunities with minimal
3077 cost. */
3079 namespace {
3081 const pass_data pass_data_phi_only_cprop =
3083 GIMPLE_PASS, /* type */
3084 "phicprop", /* name */
3085 OPTGROUP_NONE, /* optinfo_flags */
3086 TV_TREE_PHI_CPROP, /* tv_id */
3087 ( PROP_cfg | PROP_ssa ), /* properties_required */
3088 0, /* properties_provided */
3089 0, /* properties_destroyed */
3090 0, /* todo_flags_start */
3091 ( TODO_cleanup_cfg | TODO_update_ssa ), /* todo_flags_finish */
3094 class pass_phi_only_cprop : public gimple_opt_pass
3096 public:
3097 pass_phi_only_cprop (gcc::context *ctxt)
3098 : gimple_opt_pass (pass_data_phi_only_cprop, ctxt)
3101 /* opt_pass methods: */
3102 opt_pass * clone () { return new pass_phi_only_cprop (m_ctxt); }
3103 virtual bool gate (function *) { return flag_tree_dom != 0; }
3104 virtual unsigned int execute (function *);
3106 }; // class pass_phi_only_cprop
3108 unsigned int
3109 pass_phi_only_cprop::execute (function *fun)
3111 bitmap interesting_names;
3112 bitmap interesting_names1;
3114 /* Bitmap of blocks which need EH information updated. We can not
3115 update it on-the-fly as doing so invalidates the dominator tree. */
3116 need_eh_cleanup = BITMAP_ALLOC (NULL);
3118 /* INTERESTING_NAMES is effectively our worklist, indexed by
3119 SSA_NAME_VERSION.
3121 A set bit indicates that the statement or PHI node which
3122 defines the SSA_NAME should be (re)examined to determine if
3123 it has become a degenerate PHI or trivial const/copy propagation
3124 opportunity.
3126 Experiments have show we generally get better compilation
3127 time behavior with bitmaps rather than sbitmaps. */
3128 interesting_names = BITMAP_ALLOC (NULL);
3129 interesting_names1 = BITMAP_ALLOC (NULL);
3131 calculate_dominance_info (CDI_DOMINATORS);
3132 cfg_altered = false;
3134 /* First phase. Eliminate degenerate PHIs via a dominator
3135 walk of the CFG.
3137 Experiments have indicated that we generally get better
3138 compile-time behavior by visiting blocks in the first
3139 phase in dominator order. Presumably this is because walking
3140 in dominator order leaves fewer PHIs for later examination
3141 by the worklist phase. */
3142 eliminate_degenerate_phis_1 (ENTRY_BLOCK_PTR_FOR_FN (fun),
3143 interesting_names);
3145 /* Second phase. Eliminate second order degenerate PHIs as well
3146 as trivial copies or constant initializations identified by
3147 the first phase or this phase. Basically we keep iterating
3148 until our set of INTERESTING_NAMEs is empty. */
3149 while (!bitmap_empty_p (interesting_names))
3151 unsigned int i;
3152 bitmap_iterator bi;
3154 /* EXECUTE_IF_SET_IN_BITMAP does not like its bitmap
3155 changed during the loop. Copy it to another bitmap and
3156 use that. */
3157 bitmap_copy (interesting_names1, interesting_names);
3159 EXECUTE_IF_SET_IN_BITMAP (interesting_names1, 0, i, bi)
3161 tree name = ssa_name (i);
3163 /* Ignore SSA_NAMEs that have been released because
3164 their defining statement was deleted (unreachable). */
3165 if (name)
3166 eliminate_const_or_copy (SSA_NAME_DEF_STMT (ssa_name (i)),
3167 interesting_names);
3171 if (cfg_altered)
3173 free_dominance_info (CDI_DOMINATORS);
3174 /* If we changed the CFG schedule loops for fixup by cfgcleanup. */
3175 loops_state_set (LOOPS_NEED_FIXUP);
3178 /* Propagation of const and copies may make some EH edges dead. Purge
3179 such edges from the CFG as needed. */
3180 if (!bitmap_empty_p (need_eh_cleanup))
3182 gimple_purge_all_dead_eh_edges (need_eh_cleanup);
3183 BITMAP_FREE (need_eh_cleanup);
3186 BITMAP_FREE (interesting_names);
3187 BITMAP_FREE (interesting_names1);
3188 return 0;
3191 } // anon namespace
3193 gimple_opt_pass *
3194 make_pass_phi_only_cprop (gcc::context *ctxt)
3196 return new pass_phi_only_cprop (ctxt);