* expr.c (gfc_copy_shape_excluding): Change && to ||.
[official-gcc.git] / gcc / tree-ssa-dce.c
blob69408e8cd7d6290651ece027f9f20f04cc6cac22
1 /* Dead code elimination pass for the GNU compiler.
2 Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
3 Contributed by Ben Elliston <bje@redhat.com>
4 and Andrew MacLeod <amacleod@redhat.com>
5 Adapted to use control dependence by Steven Bosscher, SUSE Labs.
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 2, or (at your option) any
12 later version.
14 GCC is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to the Free
21 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 02111-1307, USA. */
24 /* Dead code elimination.
26 References:
28 Building an Optimizing Compiler,
29 Robert Morgan, Butterworth-Heinemann, 1998, Section 8.9.
31 Advanced Compiler Design and Implementation,
32 Steven Muchnick, Morgan Kaufmann, 1997, Section 18.10.
34 Dead-code elimination is the removal of statements which have no
35 impact on the program's output. "Dead statements" have no impact
36 on the program's output, while "necessary statements" may have
37 impact on the output.
39 The algorithm consists of three phases:
40 1. Marking as necessary all statements known to be necessary,
41 e.g. most function calls, writing a value to memory, etc;
42 2. Propagating necessary statements, e.g., the statements
43 giving values to operands in necessary statements; and
44 3. Removing dead statements. */
46 #include "config.h"
47 #include "system.h"
48 #include "coretypes.h"
49 #include "tm.h"
50 #include "errors.h"
51 #include "ggc.h"
53 /* These RTL headers are needed for basic-block.h. */
54 #include "rtl.h"
55 #include "tm_p.h"
56 #include "hard-reg-set.h"
57 #include "obstack.h"
58 #include "basic-block.h"
60 #include "tree.h"
61 #include "diagnostic.h"
62 #include "tree-flow.h"
63 #include "tree-gimple.h"
64 #include "tree-dump.h"
65 #include "tree-pass.h"
66 #include "timevar.h"
67 #include "flags.h"
69 static struct stmt_stats
71 int total;
72 int total_phis;
73 int removed;
74 int removed_phis;
75 } stats;
77 static varray_type worklist;
79 /* Vector indicating an SSA name has already been processed and marked
80 as necessary. */
81 static sbitmap processed;
83 /* Vector indicating that last_stmt if a basic block has already been
84 marked as necessary. */
85 static sbitmap last_stmt_necessary;
87 /* Before we can determine whether a control branch is dead, we need to
88 compute which blocks are control dependent on which edges.
90 We expect each block to be control dependent on very few edges so we
91 use a bitmap for each block recording its edges. An array holds the
92 bitmap. The Ith bit in the bitmap is set if that block is dependent
93 on the Ith edge. */
94 bitmap *control_dependence_map;
96 /* Vector indicating that a basic block has already had all the edges
97 processed that it is control dependent on. */
98 sbitmap visited_control_parents;
100 /* Execute CODE for each edge (given number EDGE_NUMBER within the CODE)
101 for which the block with index N is control dependent. */
102 #define EXECUTE_IF_CONTROL_DEPENDENT(N, EDGE_NUMBER, CODE) \
104 bitmap_iterator bi; \
106 EXECUTE_IF_SET_IN_BITMAP (control_dependence_map[N], 0, EDGE_NUMBER, bi) \
108 CODE; \
112 /* Local function prototypes. */
113 static inline void set_control_dependence_map_bit (basic_block, int);
114 static inline void clear_control_dependence_bitmap (basic_block);
115 static void find_all_control_dependences (struct edge_list *);
116 static void find_control_dependence (struct edge_list *, int);
117 static inline basic_block find_pdom (basic_block);
119 static inline void mark_stmt_necessary (tree, bool);
120 static inline void mark_operand_necessary (tree, bool);
122 static void mark_stmt_if_obviously_necessary (tree, bool);
123 static void find_obviously_necessary_stmts (struct edge_list *);
125 static void mark_control_dependent_edges_necessary (basic_block, struct edge_list *);
126 static void propagate_necessity (struct edge_list *);
128 static void eliminate_unnecessary_stmts (void);
129 static void remove_dead_phis (basic_block);
130 static void remove_dead_stmt (block_stmt_iterator *, basic_block);
132 static void print_stats (void);
133 static void tree_dce_init (bool);
134 static void tree_dce_done (bool);
136 /* Indicate block BB is control dependent on an edge with index EDGE_INDEX. */
137 static inline void
138 set_control_dependence_map_bit (basic_block bb, int edge_index)
140 if (bb == ENTRY_BLOCK_PTR)
141 return;
142 gcc_assert (bb != EXIT_BLOCK_PTR);
143 bitmap_set_bit (control_dependence_map[bb->index], edge_index);
146 /* Clear all control dependences for block BB. */
147 static inline
148 void clear_control_dependence_bitmap (basic_block bb)
150 bitmap_clear (control_dependence_map[bb->index]);
153 /* Record all blocks' control dependences on all edges in the edge
154 list EL, ala Morgan, Section 3.6. */
156 static void
157 find_all_control_dependences (struct edge_list *el)
159 int i;
161 for (i = 0; i < NUM_EDGES (el); ++i)
162 find_control_dependence (el, i);
165 /* Determine all blocks' control dependences on the given edge with edge_list
166 EL index EDGE_INDEX, ala Morgan, Section 3.6. */
168 static void
169 find_control_dependence (struct edge_list *el, int edge_index)
171 basic_block current_block;
172 basic_block ending_block;
174 gcc_assert (INDEX_EDGE_PRED_BB (el, edge_index) != EXIT_BLOCK_PTR);
176 if (INDEX_EDGE_PRED_BB (el, edge_index) == ENTRY_BLOCK_PTR)
177 ending_block = ENTRY_BLOCK_PTR->next_bb;
178 else
179 ending_block = find_pdom (INDEX_EDGE_PRED_BB (el, edge_index));
181 for (current_block = INDEX_EDGE_SUCC_BB (el, edge_index);
182 current_block != ending_block && current_block != EXIT_BLOCK_PTR;
183 current_block = find_pdom (current_block))
185 edge e = INDEX_EDGE (el, edge_index);
187 /* For abnormal edges, we don't make current_block control
188 dependent because instructions that throw are always necessary
189 anyway. */
190 if (e->flags & EDGE_ABNORMAL)
191 continue;
193 set_control_dependence_map_bit (current_block, edge_index);
197 /* Find the immediate postdominator PDOM of the specified basic block BLOCK.
198 This function is necessary because some blocks have negative numbers. */
200 static inline basic_block
201 find_pdom (basic_block block)
203 gcc_assert (block != ENTRY_BLOCK_PTR);
205 if (block == EXIT_BLOCK_PTR)
206 return EXIT_BLOCK_PTR;
207 else
209 basic_block bb = get_immediate_dominator (CDI_POST_DOMINATORS, block);
210 if (! bb)
211 return EXIT_BLOCK_PTR;
212 return bb;
216 #define NECESSARY(stmt) stmt->common.asm_written_flag
218 /* If STMT is not already marked necessary, mark it, and add it to the
219 worklist if ADD_TO_WORKLIST is true. */
220 static inline void
221 mark_stmt_necessary (tree stmt, bool add_to_worklist)
223 gcc_assert (stmt);
224 gcc_assert (stmt != error_mark_node);
225 gcc_assert (!DECL_P (stmt));
227 if (NECESSARY (stmt))
228 return;
230 if (dump_file && (dump_flags & TDF_DETAILS))
232 fprintf (dump_file, "Marking useful stmt: ");
233 print_generic_stmt (dump_file, stmt, TDF_SLIM);
234 fprintf (dump_file, "\n");
237 NECESSARY (stmt) = 1;
238 if (add_to_worklist)
239 VARRAY_PUSH_TREE (worklist, stmt);
242 /* Mark the statement defining operand OP as necessary. PHIONLY is true
243 if we should only mark it necessary if it is a phi node. */
245 static inline void
246 mark_operand_necessary (tree op, bool phionly)
248 tree stmt;
249 int ver;
251 gcc_assert (op);
253 ver = SSA_NAME_VERSION (op);
254 if (TEST_BIT (processed, ver))
255 return;
256 SET_BIT (processed, ver);
258 stmt = SSA_NAME_DEF_STMT (op);
259 gcc_assert (stmt);
261 if (NECESSARY (stmt)
262 || IS_EMPTY_STMT (stmt)
263 || (phionly && TREE_CODE (stmt) != PHI_NODE))
264 return;
266 NECESSARY (stmt) = 1;
267 VARRAY_PUSH_TREE (worklist, stmt);
271 /* Mark STMT as necessary if it obviously is. Add it to the worklist if
272 it can make other statements necessary.
274 If AGGRESSIVE is false, control statements are conservatively marked as
275 necessary. */
277 static void
278 mark_stmt_if_obviously_necessary (tree stmt, bool aggressive)
280 stmt_ann_t ann;
281 tree op, def;
282 ssa_op_iter iter;
284 /* Statements that are implicitly live. Most function calls, asm and return
285 statements are required. Labels and BIND_EXPR nodes are kept because
286 they are control flow, and we have no way of knowing whether they can be
287 removed. DCE can eliminate all the other statements in a block, and CFG
288 can then remove the block and labels. */
289 switch (TREE_CODE (stmt))
291 case BIND_EXPR:
292 case LABEL_EXPR:
293 case CASE_LABEL_EXPR:
294 mark_stmt_necessary (stmt, false);
295 return;
297 case ASM_EXPR:
298 case RESX_EXPR:
299 case RETURN_EXPR:
300 mark_stmt_necessary (stmt, true);
301 return;
303 case CALL_EXPR:
304 /* Most, but not all function calls are required. Function calls that
305 produce no result and have no side effects (i.e. const pure
306 functions) are unnecessary. */
307 if (TREE_SIDE_EFFECTS (stmt))
308 mark_stmt_necessary (stmt, true);
309 return;
311 case MODIFY_EXPR:
312 op = get_call_expr_in (stmt);
313 if (op && TREE_SIDE_EFFECTS (op))
315 mark_stmt_necessary (stmt, true);
316 return;
319 /* These values are mildly magic bits of the EH runtime. We can't
320 see the entire lifetime of these values until landing pads are
321 generated. */
322 if (TREE_CODE (TREE_OPERAND (stmt, 0)) == EXC_PTR_EXPR
323 || TREE_CODE (TREE_OPERAND (stmt, 0)) == FILTER_EXPR)
325 mark_stmt_necessary (stmt, true);
326 return;
328 break;
330 case GOTO_EXPR:
331 gcc_assert (!simple_goto_p (stmt));
332 mark_stmt_necessary (stmt, true);
333 return;
335 case COND_EXPR:
336 gcc_assert (EDGE_COUNT (bb_for_stmt (stmt)->succs) == 2);
337 /* Fall through. */
339 case SWITCH_EXPR:
340 if (! aggressive)
341 mark_stmt_necessary (stmt, true);
342 break;
344 default:
345 break;
348 ann = stmt_ann (stmt);
350 /* If the statement has volatile operands, it needs to be preserved.
351 Same for statements that can alter control flow in unpredictable
352 ways. */
353 if (ann->has_volatile_ops || is_ctrl_altering_stmt (stmt))
355 mark_stmt_necessary (stmt, true);
356 return;
359 get_stmt_operands (stmt);
361 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
363 if (is_global_var (SSA_NAME_VAR (def)))
365 mark_stmt_necessary (stmt, true);
366 return;
369 if (is_hidden_global_store (stmt))
371 mark_stmt_necessary (stmt, true);
372 return;
375 return;
378 /* Find obviously necessary statements. These are things like most function
379 calls, and stores to file level variables.
381 If EL is NULL, control statements are conservatively marked as
382 necessary. Otherwise it contains the list of edges used by control
383 dependence analysis. */
385 static void
386 find_obviously_necessary_stmts (struct edge_list *el)
388 basic_block bb;
389 block_stmt_iterator i;
390 edge e;
392 FOR_EACH_BB (bb)
394 tree phi;
396 /* Check any PHI nodes in the block. */
397 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
399 NECESSARY (phi) = 0;
401 /* PHIs for virtual variables do not directly affect code
402 generation and need not be considered inherently necessary
403 regardless of the bits set in their decl.
405 Thus, we only need to mark PHIs for real variables which
406 need their result preserved as being inherently necessary. */
407 if (is_gimple_reg (PHI_RESULT (phi))
408 && is_global_var (SSA_NAME_VAR (PHI_RESULT (phi))))
409 mark_stmt_necessary (phi, true);
412 /* Check all statements in the block. */
413 for (i = bsi_start (bb); ! bsi_end_p (i); bsi_next (&i))
415 tree stmt = bsi_stmt (i);
416 NECESSARY (stmt) = 0;
417 mark_stmt_if_obviously_necessary (stmt, el != NULL);
421 if (el)
423 /* Prevent the loops from being removed. We must keep the infinite loops,
424 and we currently do not have a means to recognize the finite ones. */
425 FOR_EACH_BB (bb)
427 edge_iterator ei;
428 FOR_EACH_EDGE (e, ei, bb->succs)
429 if (e->flags & EDGE_DFS_BACK)
430 mark_control_dependent_edges_necessary (e->dest, el);
435 /* Make corresponding control dependent edges necessary. We only
436 have to do this once for each basic block, so we clear the bitmap
437 after we're done. */
438 static void
439 mark_control_dependent_edges_necessary (basic_block bb, struct edge_list *el)
441 unsigned edge_number;
443 gcc_assert (bb != EXIT_BLOCK_PTR);
445 if (bb == ENTRY_BLOCK_PTR)
446 return;
448 EXECUTE_IF_CONTROL_DEPENDENT (bb->index, edge_number,
450 tree t;
451 basic_block cd_bb = INDEX_EDGE_PRED_BB (el, edge_number);
453 if (TEST_BIT (last_stmt_necessary, cd_bb->index))
454 continue;
455 SET_BIT (last_stmt_necessary, cd_bb->index);
457 t = last_stmt (cd_bb);
458 if (t && is_ctrl_stmt (t))
459 mark_stmt_necessary (t, true);
463 /* Propagate necessity using the operands of necessary statements. Process
464 the uses on each statement in the worklist, and add all feeding statements
465 which contribute to the calculation of this value to the worklist.
467 In conservative mode, EL is NULL. */
469 static void
470 propagate_necessity (struct edge_list *el)
472 tree i;
473 bool aggressive = (el ? true : false);
475 if (dump_file && (dump_flags & TDF_DETAILS))
476 fprintf (dump_file, "\nProcessing worklist:\n");
478 while (VARRAY_ACTIVE_SIZE (worklist) > 0)
480 /* Take `i' from worklist. */
481 i = VARRAY_TOP_TREE (worklist);
482 VARRAY_POP (worklist);
484 if (dump_file && (dump_flags & TDF_DETAILS))
486 fprintf (dump_file, "processing: ");
487 print_generic_stmt (dump_file, i, TDF_SLIM);
488 fprintf (dump_file, "\n");
491 if (aggressive)
493 /* Mark the last statements of the basic blocks that the block
494 containing `i' is control dependent on, but only if we haven't
495 already done so. */
496 basic_block bb = bb_for_stmt (i);
497 if (bb != ENTRY_BLOCK_PTR
498 && ! TEST_BIT (visited_control_parents, bb->index))
500 SET_BIT (visited_control_parents, bb->index);
501 mark_control_dependent_edges_necessary (bb, el);
505 if (TREE_CODE (i) == PHI_NODE)
507 /* PHI nodes are somewhat special in that each PHI alternative has
508 data and control dependencies. All the statements feeding the
509 PHI node's arguments are always necessary. In aggressive mode,
510 we also consider the control dependent edges leading to the
511 predecessor block associated with each PHI alternative as
512 necessary. */
513 int k;
514 for (k = 0; k < PHI_NUM_ARGS (i); k++)
516 tree arg = PHI_ARG_DEF (i, k);
517 if (TREE_CODE (arg) == SSA_NAME)
518 mark_operand_necessary (arg, false);
521 if (aggressive)
523 for (k = 0; k < PHI_NUM_ARGS (i); k++)
525 basic_block arg_bb = PHI_ARG_EDGE (i, k)->src;
526 if (arg_bb != ENTRY_BLOCK_PTR
527 && ! TEST_BIT (visited_control_parents, arg_bb->index))
529 SET_BIT (visited_control_parents, arg_bb->index);
530 mark_control_dependent_edges_necessary (arg_bb, el);
535 else
537 /* Propagate through the operands. Examine all the USE, VUSE and
538 V_MAY_DEF operands in this statement. Mark all the statements
539 which feed this statement's uses as necessary. */
540 ssa_op_iter iter;
541 tree use;
543 get_stmt_operands (i);
545 /* The operands of V_MAY_DEF expressions are also needed as they
546 represent potential definitions that may reach this
547 statement (V_MAY_DEF operands allow us to follow def-def
548 links). */
550 FOR_EACH_SSA_TREE_OPERAND (use, i, iter, SSA_OP_ALL_USES)
551 mark_operand_necessary (use, false);
557 /* Propagate necessity around virtual phi nodes used in kill operands.
558 The reason this isn't done during propagate_necessity is because we don't
559 want to keep phis around that are just there for must-defs, unless we
560 absolutely have to. After we've rewritten the reaching definitions to be
561 correct in the previous part of the fixup routine, we can simply propagate
562 around the information about which of these virtual phi nodes are really
563 used, and set the NECESSARY flag accordingly.
564 Note that we do the minimum here to ensure that we keep alive the phis that
565 are actually used in the corrected SSA form. In particular, some of these
566 phis may now have all of the same operand, and will be deleted by some
567 other pass. */
569 static void
570 mark_really_necessary_kill_operand_phis (void)
572 basic_block bb;
573 int i;
575 /* Seed the worklist with the new virtual phi arguments and virtual
576 uses */
577 FOR_EACH_BB (bb)
579 block_stmt_iterator bsi;
580 tree phi;
582 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
584 if (!is_gimple_reg (PHI_RESULT (phi)) && NECESSARY (phi))
586 for (i = 0; i < PHI_NUM_ARGS (phi); i++)
587 mark_operand_necessary (PHI_ARG_DEF (phi, i), true);
591 for (bsi = bsi_last (bb); !bsi_end_p (bsi); bsi_prev (&bsi))
593 tree stmt = bsi_stmt (bsi);
595 if (NECESSARY (stmt))
597 use_operand_p use_p;
598 ssa_op_iter iter;
599 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter,
600 SSA_OP_VIRTUAL_USES | SSA_OP_VIRTUAL_KILLS)
602 tree use = USE_FROM_PTR (use_p);
603 mark_operand_necessary (use, true);
609 /* Mark all virtual phis still in use as necessary, and all of their
610 arguments that are phis as necessary. */
611 while (VARRAY_ACTIVE_SIZE (worklist) > 0)
613 tree use = VARRAY_TOP_TREE (worklist);
614 VARRAY_POP (worklist);
616 for (i = 0; i < PHI_NUM_ARGS (use); i++)
617 mark_operand_necessary (PHI_ARG_DEF (use, i), true);
624 /* Eliminate unnecessary statements. Any instruction not marked as necessary
625 contributes nothing to the program, and can be deleted. */
627 static void
628 eliminate_unnecessary_stmts (void)
630 basic_block bb;
631 block_stmt_iterator i;
633 if (dump_file && (dump_flags & TDF_DETAILS))
634 fprintf (dump_file, "\nEliminating unnecessary statements:\n");
636 clear_special_calls ();
637 FOR_EACH_BB (bb)
639 /* Remove dead PHI nodes. */
640 remove_dead_phis (bb);
642 /* Remove dead statements. */
643 for (i = bsi_start (bb); ! bsi_end_p (i) ; )
645 tree t = bsi_stmt (i);
647 stats.total++;
649 /* If `i' is not necessary then remove it. */
650 if (! NECESSARY (t))
651 remove_dead_stmt (&i, bb);
652 else
654 tree call = get_call_expr_in (t);
655 if (call)
656 notice_special_calls (call);
657 bsi_next (&i);
663 /* Remove dead PHI nodes from block BB. */
665 static void
666 remove_dead_phis (basic_block bb)
668 tree prev, phi;
670 prev = NULL_TREE;
671 phi = phi_nodes (bb);
672 while (phi)
674 stats.total_phis++;
676 if (! NECESSARY (phi))
678 tree next = PHI_CHAIN (phi);
680 if (dump_file && (dump_flags & TDF_DETAILS))
682 fprintf (dump_file, "Deleting : ");
683 print_generic_stmt (dump_file, phi, TDF_SLIM);
684 fprintf (dump_file, "\n");
687 remove_phi_node (phi, prev, bb);
688 stats.removed_phis++;
689 phi = next;
691 else
693 prev = phi;
694 phi = PHI_CHAIN (phi);
699 /* Remove dead statement pointed by iterator I. Receives the basic block BB
700 containing I so that we don't have to look it up. */
702 static void
703 remove_dead_stmt (block_stmt_iterator *i, basic_block bb)
705 tree t = bsi_stmt (*i);
706 def_operand_p def_p;
708 ssa_op_iter iter;
710 if (dump_file && (dump_flags & TDF_DETAILS))
712 fprintf (dump_file, "Deleting : ");
713 print_generic_stmt (dump_file, t, TDF_SLIM);
714 fprintf (dump_file, "\n");
717 stats.removed++;
719 /* If we have determined that a conditional branch statement contributes
720 nothing to the program, then we not only remove it, but we also change
721 the flow graph so that the current block will simply fall-thru to its
722 immediate post-dominator. The blocks we are circumventing will be
723 removed by cleaup_cfg if this change in the flow graph makes them
724 unreachable. */
725 if (is_ctrl_stmt (t))
727 basic_block post_dom_bb;
728 /* The post dominance info has to be up-to-date. */
729 gcc_assert (dom_computed[CDI_POST_DOMINATORS] == DOM_OK);
730 /* Get the immediate post dominator of bb. */
731 post_dom_bb = get_immediate_dominator (CDI_POST_DOMINATORS, bb);
732 /* Some blocks don't have an immediate post dominator. This can happen
733 for example with infinite loops. Removing an infinite loop is an
734 inappropriate transformation anyway... */
735 if (! post_dom_bb)
737 bsi_next (i);
738 return;
741 /* Redirect the first edge out of BB to reach POST_DOM_BB. */
742 redirect_edge_and_branch (EDGE_SUCC (bb, 0), post_dom_bb);
743 PENDING_STMT (EDGE_SUCC (bb, 0)) = NULL;
744 EDGE_SUCC (bb, 0)->probability = REG_BR_PROB_BASE;
745 EDGE_SUCC (bb, 0)->count = bb->count;
747 /* The edge is no longer associated with a conditional, so it does
748 not have TRUE/FALSE flags. */
749 EDGE_SUCC (bb, 0)->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
751 /* If the edge reaches any block other than the exit, then it is a
752 fallthru edge; if it reaches the exit, then it is not a fallthru
753 edge. */
754 if (post_dom_bb != EXIT_BLOCK_PTR)
755 EDGE_SUCC (bb, 0)->flags |= EDGE_FALLTHRU;
756 else
757 EDGE_SUCC (bb, 0)->flags &= ~EDGE_FALLTHRU;
759 /* Remove the remaining the outgoing edges. */
760 while (EDGE_COUNT (bb->succs) != 1)
761 remove_edge (EDGE_SUCC (bb, 1));
764 FOR_EACH_SSA_DEF_OPERAND (def_p, t, iter,
765 SSA_OP_VIRTUAL_DEFS | SSA_OP_VIRTUAL_KILLS)
767 tree def = DEF_FROM_PTR (def_p);
768 bitmap_set_bit (vars_to_rename,
769 var_ann (SSA_NAME_VAR (def))->uid);
771 bsi_remove (i);
772 release_defs (t);
775 /* Print out removed statement statistics. */
777 static void
778 print_stats (void)
780 if (dump_file && (dump_flags & (TDF_STATS|TDF_DETAILS)))
782 float percg;
784 percg = ((float) stats.removed / (float) stats.total) * 100;
785 fprintf (dump_file, "Removed %d of %d statements (%d%%)\n",
786 stats.removed, stats.total, (int) percg);
788 if (stats.total_phis == 0)
789 percg = 0;
790 else
791 percg = ((float) stats.removed_phis / (float) stats.total_phis) * 100;
793 fprintf (dump_file, "Removed %d of %d PHI nodes (%d%%)\n",
794 stats.removed_phis, stats.total_phis, (int) percg);
798 /* Initialization for this pass. Set up the used data structures. */
800 static void
801 tree_dce_init (bool aggressive)
803 memset ((void *) &stats, 0, sizeof (stats));
805 if (aggressive)
807 int i;
809 control_dependence_map
810 = xmalloc (last_basic_block * sizeof (bitmap));
811 for (i = 0; i < last_basic_block; ++i)
812 control_dependence_map[i] = BITMAP_ALLOC (NULL);
814 last_stmt_necessary = sbitmap_alloc (last_basic_block);
815 sbitmap_zero (last_stmt_necessary);
818 processed = sbitmap_alloc (num_ssa_names + 1);
819 sbitmap_zero (processed);
821 VARRAY_TREE_INIT (worklist, 64, "work list");
824 /* Cleanup after this pass. */
826 static void
827 tree_dce_done (bool aggressive)
829 if (aggressive)
831 int i;
833 for (i = 0; i < last_basic_block; ++i)
834 BITMAP_FREE (control_dependence_map[i]);
835 free (control_dependence_map);
837 sbitmap_free (visited_control_parents);
838 sbitmap_free (last_stmt_necessary);
841 sbitmap_free (processed);
844 /* Main routine to eliminate dead code.
846 AGGRESSIVE controls the aggressiveness of the algorithm.
847 In conservative mode, we ignore control dependence and simply declare
848 all but the most trivially dead branches necessary. This mode is fast.
849 In aggressive mode, control dependences are taken into account, which
850 results in more dead code elimination, but at the cost of some time.
852 FIXME: Aggressive mode before PRE doesn't work currently because
853 the dominance info is not invalidated after DCE1. This is
854 not an issue right now because we only run aggressive DCE
855 as the last tree SSA pass, but keep this in mind when you
856 start experimenting with pass ordering. */
858 static void
859 perform_tree_ssa_dce (bool aggressive)
861 struct edge_list *el = NULL;
863 tree_dce_init (aggressive);
865 if (aggressive)
867 /* Compute control dependence. */
868 timevar_push (TV_CONTROL_DEPENDENCES);
869 calculate_dominance_info (CDI_POST_DOMINATORS);
870 el = create_edge_list ();
871 find_all_control_dependences (el);
872 timevar_pop (TV_CONTROL_DEPENDENCES);
874 visited_control_parents = sbitmap_alloc (last_basic_block);
875 sbitmap_zero (visited_control_parents);
877 mark_dfs_back_edges ();
880 find_obviously_necessary_stmts (el);
882 propagate_necessity (el);
884 mark_really_necessary_kill_operand_phis ();
885 eliminate_unnecessary_stmts ();
887 if (aggressive)
888 free_dominance_info (CDI_POST_DOMINATORS);
890 /* Debugging dumps. */
891 if (dump_file)
892 print_stats ();
894 tree_dce_done (aggressive);
896 free_edge_list (el);
899 /* Pass entry points. */
900 static void
901 tree_ssa_dce (void)
903 perform_tree_ssa_dce (/*aggressive=*/false);
906 static void
907 tree_ssa_cd_dce (void)
909 perform_tree_ssa_dce (/*aggressive=*/optimize >= 2);
912 static bool
913 gate_dce (void)
915 return flag_tree_dce != 0;
918 struct tree_opt_pass pass_dce =
920 "dce", /* name */
921 gate_dce, /* gate */
922 tree_ssa_dce, /* execute */
923 NULL, /* sub */
924 NULL, /* next */
925 0, /* static_pass_number */
926 TV_TREE_DCE, /* tv_id */
927 PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
928 0, /* properties_provided */
929 0, /* properties_destroyed */
930 0, /* todo_flags_start */
931 TODO_dump_func | TODO_fix_def_def_chains | TODO_cleanup_cfg | TODO_ggc_collect | TODO_verify_ssa, /* todo_flags_finish */
932 0 /* letter */
935 struct tree_opt_pass pass_cd_dce =
937 "cddce", /* name */
938 gate_dce, /* gate */
939 tree_ssa_cd_dce, /* execute */
940 NULL, /* sub */
941 NULL, /* next */
942 0, /* static_pass_number */
943 TV_TREE_CD_DCE, /* tv_id */
944 PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
945 0, /* properties_provided */
946 0, /* properties_destroyed */
947 0, /* todo_flags_start */
948 TODO_dump_func | TODO_fix_def_def_chains | TODO_cleanup_cfg | TODO_ggc_collect | TODO_verify_ssa | TODO_verify_flow,
949 /* todo_flags_finish */
950 0 /* letter */