00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #include "config.h"
00047 #include "system.h"
00048 #include "coretypes.h"
00049 #include "tm.h"
00050 #include "ggc.h"
00051
00052
00053 #include "rtl.h"
00054 #include "tm_p.h"
00055 #include "hard-reg-set.h"
00056 #include "obstack.h"
00057 #include "basic-block.h"
00058
00059 #include "tree.h"
00060 #include "diagnostic.h"
00061 #include "tree-flow.h"
00062 #include "tree-gimple.h"
00063 #include "tree-dump.h"
00064 #include "tree-pass.h"
00065 #include "timevar.h"
00066 #include "flags.h"
00067 #include "cfgloop.h"
00068 #include "tree-scalar-evolution.h"
00069
00070 static struct stmt_stats
00071 {
00072 int total;
00073 int total_phis;
00074 int removed;
00075 int removed_phis;
00076 } stats;
00077
00078 static VEC(tree,heap) *worklist;
00079
00080
00081
00082 static sbitmap processed;
00083
00084
00085
00086 static sbitmap last_stmt_necessary;
00087
00088
00089
00090
00091
00092
00093
00094
00095 static bitmap *control_dependence_map;
00096
00097
00098
00099 static sbitmap visited_control_parents;
00100
00101
00102
00103
00104
00105
00106 static bool cfg_altered;
00107
00108
00109
00110
00111 #define EXECUTE_IF_CONTROL_DEPENDENT(BI, N, EDGE_NUMBER) \
00112 EXECUTE_IF_SET_IN_BITMAP (control_dependence_map[(N)], 0, \
00113 (EDGE_NUMBER), (BI))
00114
00115
00116 static inline void set_control_dependence_map_bit (basic_block, int);
00117 static inline void clear_control_dependence_bitmap (basic_block);
00118 static void find_all_control_dependences (struct edge_list *);
00119 static void find_control_dependence (struct edge_list *, int);
00120 static inline basic_block find_pdom (basic_block);
00121
00122 static inline void mark_stmt_necessary (tree, bool);
00123 static inline void mark_operand_necessary (tree, bool);
00124
00125 static void mark_stmt_if_obviously_necessary (tree, bool);
00126 static void find_obviously_necessary_stmts (struct edge_list *);
00127
00128 static void mark_control_dependent_edges_necessary (basic_block, struct edge_list *);
00129 static void propagate_necessity (struct edge_list *);
00130
00131 static void eliminate_unnecessary_stmts (void);
00132 static void remove_dead_phis (basic_block);
00133 static void remove_dead_stmt (block_stmt_iterator *, basic_block);
00134
00135 static void print_stats (void);
00136 static void tree_dce_init (bool);
00137 static void tree_dce_done (bool);
00138
00139
00140 static inline void
00141 set_control_dependence_map_bit (basic_block bb, int edge_index)
00142 {
00143 if (bb == ENTRY_BLOCK_PTR)
00144 return;
00145 gcc_assert (bb != EXIT_BLOCK_PTR);
00146 bitmap_set_bit (control_dependence_map[bb->index], edge_index);
00147 }
00148
00149
00150 static inline void
00151 clear_control_dependence_bitmap (basic_block bb)
00152 {
00153 bitmap_clear (control_dependence_map[bb->index]);
00154 }
00155
00156
00157
00158
00159 static void
00160 find_all_control_dependences (struct edge_list *el)
00161 {
00162 int i;
00163
00164 for (i = 0; i < NUM_EDGES (el); ++i)
00165 find_control_dependence (el, i);
00166 }
00167
00168
00169
00170
00171 static void
00172 find_control_dependence (struct edge_list *el, int edge_index)
00173 {
00174 basic_block current_block;
00175 basic_block ending_block;
00176
00177 gcc_assert (INDEX_EDGE_PRED_BB (el, edge_index) != EXIT_BLOCK_PTR);
00178
00179 if (INDEX_EDGE_PRED_BB (el, edge_index) == ENTRY_BLOCK_PTR)
00180 ending_block = single_succ (ENTRY_BLOCK_PTR);
00181 else
00182 ending_block = find_pdom (INDEX_EDGE_PRED_BB (el, edge_index));
00183
00184 for (current_block = INDEX_EDGE_SUCC_BB (el, edge_index);
00185 current_block != ending_block && current_block != EXIT_BLOCK_PTR;
00186 current_block = find_pdom (current_block))
00187 {
00188 edge e = INDEX_EDGE (el, edge_index);
00189
00190
00191
00192
00193 if (e->flags & EDGE_ABNORMAL)
00194 continue;
00195
00196 set_control_dependence_map_bit (current_block, edge_index);
00197 }
00198 }
00199
00200
00201
00202
00203 static inline basic_block
00204 find_pdom (basic_block block)
00205 {
00206 gcc_assert (block != ENTRY_BLOCK_PTR);
00207
00208 if (block == EXIT_BLOCK_PTR)
00209 return EXIT_BLOCK_PTR;
00210 else
00211 {
00212 basic_block bb = get_immediate_dominator (CDI_POST_DOMINATORS, block);
00213 if (! bb)
00214 return EXIT_BLOCK_PTR;
00215 return bb;
00216 }
00217 }
00218
00219 #define NECESSARY(stmt) stmt->common.asm_written_flag
00220
00221
00222
00223 static inline void
00224 mark_stmt_necessary (tree stmt, bool add_to_worklist)
00225 {
00226 gcc_assert (stmt);
00227 gcc_assert (!DECL_P (stmt));
00228
00229 if (NECESSARY (stmt))
00230 return;
00231
00232 if (dump_file && (dump_flags & TDF_DETAILS))
00233 {
00234 fprintf (dump_file, "Marking useful stmt: ");
00235 print_generic_stmt (dump_file, stmt, TDF_SLIM);
00236 fprintf (dump_file, "\n");
00237 }
00238
00239 NECESSARY (stmt) = 1;
00240 if (add_to_worklist)
00241 VEC_safe_push (tree, heap, worklist, stmt);
00242 }
00243
00244
00245
00246
00247 static inline void
00248 mark_operand_necessary (tree op, bool phionly)
00249 {
00250 tree stmt;
00251 int ver;
00252
00253 gcc_assert (op);
00254
00255 ver = SSA_NAME_VERSION (op);
00256 if (TEST_BIT (processed, ver))
00257 return;
00258 SET_BIT (processed, ver);
00259
00260 stmt = SSA_NAME_DEF_STMT (op);
00261 gcc_assert (stmt);
00262
00263 if (NECESSARY (stmt)
00264 || IS_EMPTY_STMT (stmt)
00265 || (phionly && TREE_CODE (stmt) != PHI_NODE))
00266 return;
00267
00268 NECESSARY (stmt) = 1;
00269 VEC_safe_push (tree, heap, worklist, stmt);
00270 }
00271
00272
00273
00274
00275
00276
00277
00278
00279 static void
00280 mark_stmt_if_obviously_necessary (tree stmt, bool aggressive)
00281 {
00282 stmt_ann_t ann;
00283 tree op;
00284
00285
00286
00287 if (flag_non_call_exceptions
00288 && tree_could_throw_p (stmt))
00289 {
00290 mark_stmt_necessary (stmt, true);
00291 return;
00292 }
00293
00294
00295
00296
00297
00298
00299 switch (TREE_CODE (stmt))
00300 {
00301 case BIND_EXPR:
00302 case LABEL_EXPR:
00303 case CASE_LABEL_EXPR:
00304 mark_stmt_necessary (stmt, false);
00305 return;
00306
00307 case ASM_EXPR:
00308 case RESX_EXPR:
00309 case RETURN_EXPR:
00310 mark_stmt_necessary (stmt, true);
00311 return;
00312
00313 case CALL_EXPR:
00314
00315
00316
00317 if (TREE_SIDE_EFFECTS (stmt))
00318 mark_stmt_necessary (stmt, true);
00319 return;
00320
00321 case MODIFY_EXPR:
00322 op = get_call_expr_in (stmt);
00323 if (op && TREE_SIDE_EFFECTS (op))
00324 {
00325 mark_stmt_necessary (stmt, true);
00326 return;
00327 }
00328
00329
00330
00331
00332 if (TREE_CODE (TREE_OPERAND (stmt, 0)) == EXC_PTR_EXPR
00333 || TREE_CODE (TREE_OPERAND (stmt, 0)) == FILTER_EXPR)
00334 {
00335 mark_stmt_necessary (stmt, true);
00336 return;
00337 }
00338 break;
00339
00340 case GOTO_EXPR:
00341 gcc_assert (!simple_goto_p (stmt));
00342 mark_stmt_necessary (stmt, true);
00343 return;
00344
00345 case COND_EXPR:
00346 gcc_assert (EDGE_COUNT (bb_for_stmt (stmt)->succs) == 2);
00347
00348
00349 case SWITCH_EXPR:
00350 if (! aggressive)
00351 mark_stmt_necessary (stmt, true);
00352 break;
00353
00354 default:
00355 break;
00356 }
00357
00358 ann = stmt_ann (stmt);
00359
00360
00361
00362
00363 if (ann->has_volatile_ops || is_ctrl_altering_stmt (stmt))
00364 {
00365 mark_stmt_necessary (stmt, true);
00366 return;
00367 }
00368
00369 if (is_hidden_global_store (stmt))
00370 {
00371 mark_stmt_necessary (stmt, true);
00372 return;
00373 }
00374
00375 return;
00376 }
00377
00378
00379
00380
00381
00382
00383
00384
00385 static void
00386 find_obviously_necessary_stmts (struct edge_list *el)
00387 {
00388 basic_block bb;
00389 block_stmt_iterator i;
00390 edge e;
00391
00392 FOR_EACH_BB (bb)
00393 {
00394 tree phi;
00395
00396
00397 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
00398 {
00399 NECESSARY (phi) = 0;
00400
00401
00402
00403
00404
00405
00406
00407 if (is_gimple_reg (PHI_RESULT (phi))
00408 && is_global_var (SSA_NAME_VAR (PHI_RESULT (phi))))
00409 mark_stmt_necessary (phi, true);
00410 }
00411
00412
00413 for (i = bsi_start (bb); ! bsi_end_p (i); bsi_next (&i))
00414 {
00415 tree stmt = bsi_stmt (i);
00416 NECESSARY (stmt) = 0;
00417 mark_stmt_if_obviously_necessary (stmt, el != NULL);
00418 }
00419 }
00420
00421 if (el)
00422 {
00423
00424
00425 FOR_EACH_BB (bb)
00426 {
00427 edge_iterator ei;
00428 FOR_EACH_EDGE (e, ei, bb->succs)
00429 if (e->flags & EDGE_DFS_BACK)
00430 mark_control_dependent_edges_necessary (e->dest, el);
00431 }
00432 }
00433 }
00434
00435
00436
00437
00438 static void
00439 mark_control_dependent_edges_necessary (basic_block bb, struct edge_list *el)
00440 {
00441 bitmap_iterator bi;
00442 unsigned edge_number;
00443
00444 gcc_assert (bb != EXIT_BLOCK_PTR);
00445
00446 if (bb == ENTRY_BLOCK_PTR)
00447 return;
00448
00449 EXECUTE_IF_CONTROL_DEPENDENT (bi, bb->index, edge_number)
00450 {
00451 tree t;
00452 basic_block cd_bb = INDEX_EDGE_PRED_BB (el, edge_number);
00453
00454 if (TEST_BIT (last_stmt_necessary, cd_bb->index))
00455 continue;
00456 SET_BIT (last_stmt_necessary, cd_bb->index);
00457
00458 t = last_stmt (cd_bb);
00459 if (t && is_ctrl_stmt (t))
00460 mark_stmt_necessary (t, true);
00461 }
00462 }
00463
00464
00465
00466
00467
00468
00469
00470 static void
00471 propagate_necessity (struct edge_list *el)
00472 {
00473 tree i;
00474 bool aggressive = (el ? true : false);
00475
00476 if (dump_file && (dump_flags & TDF_DETAILS))
00477 fprintf (dump_file, "\nProcessing worklist:\n");
00478
00479 while (VEC_length (tree, worklist) > 0)
00480 {
00481
00482 i = VEC_pop (tree, worklist);
00483
00484 if (dump_file && (dump_flags & TDF_DETAILS))
00485 {
00486 fprintf (dump_file, "processing: ");
00487 print_generic_stmt (dump_file, i, TDF_SLIM);
00488 fprintf (dump_file, "\n");
00489 }
00490
00491 if (aggressive)
00492 {
00493
00494
00495
00496 basic_block bb = bb_for_stmt (i);
00497 if (bb != ENTRY_BLOCK_PTR
00498 && ! TEST_BIT (visited_control_parents, bb->index))
00499 {
00500 SET_BIT (visited_control_parents, bb->index);
00501 mark_control_dependent_edges_necessary (bb, el);
00502 }
00503 }
00504
00505 if (TREE_CODE (i) == PHI_NODE)
00506 {
00507
00508
00509
00510
00511
00512
00513 int k;
00514 for (k = 0; k < PHI_NUM_ARGS (i); k++)
00515 {
00516 tree arg = PHI_ARG_DEF (i, k);
00517 if (TREE_CODE (arg) == SSA_NAME)
00518 mark_operand_necessary (arg, false);
00519 }
00520
00521 if (aggressive)
00522 {
00523 for (k = 0; k < PHI_NUM_ARGS (i); k++)
00524 {
00525 basic_block arg_bb = PHI_ARG_EDGE (i, k)->src;
00526 if (arg_bb != ENTRY_BLOCK_PTR
00527 && ! TEST_BIT (visited_control_parents, arg_bb->index))
00528 {
00529 SET_BIT (visited_control_parents, arg_bb->index);
00530 mark_control_dependent_edges_necessary (arg_bb, el);
00531 }
00532 }
00533 }
00534 }
00535 else
00536 {
00537
00538
00539
00540 ssa_op_iter iter;
00541 tree use;
00542
00543
00544
00545
00546
00547
00548 FOR_EACH_SSA_TREE_OPERAND (use, i, iter, SSA_OP_ALL_USES)
00549 mark_operand_necessary (use, false);
00550 }
00551 }
00552 }
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567 static void
00568 mark_really_necessary_kill_operand_phis (void)
00569 {
00570 basic_block bb;
00571 int i;
00572
00573
00574
00575 FOR_EACH_BB (bb)
00576 {
00577 block_stmt_iterator bsi;
00578 tree phi;
00579
00580 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
00581 {
00582 if (!is_gimple_reg (PHI_RESULT (phi)) && NECESSARY (phi))
00583 {
00584 for (i = 0; i < PHI_NUM_ARGS (phi); i++)
00585 mark_operand_necessary (PHI_ARG_DEF (phi, i), true);
00586 }
00587 }
00588
00589 for (bsi = bsi_last (bb); !bsi_end_p (bsi); bsi_prev (&bsi))
00590 {
00591 tree stmt = bsi_stmt (bsi);
00592
00593 if (NECESSARY (stmt))
00594 {
00595 use_operand_p use_p;
00596 ssa_op_iter iter;
00597 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter,
00598 SSA_OP_VIRTUAL_USES | SSA_OP_VIRTUAL_KILLS)
00599 {
00600 tree use = USE_FROM_PTR (use_p);
00601 mark_operand_necessary (use, true);
00602 }
00603 }
00604 }
00605 }
00606
00607
00608
00609 while (VEC_length (tree, worklist) > 0)
00610 {
00611 tree use = VEC_pop (tree, worklist);
00612
00613 for (i = 0; i < PHI_NUM_ARGS (use); i++)
00614 mark_operand_necessary (PHI_ARG_DEF (use, i), true);
00615 }
00616 }
00617
00618
00619
00620
00621
00622
00623
00624 static void
00625 eliminate_unnecessary_stmts (void)
00626 {
00627 basic_block bb;
00628 block_stmt_iterator i;
00629
00630 if (dump_file && (dump_flags & TDF_DETAILS))
00631 fprintf (dump_file, "\nEliminating unnecessary statements:\n");
00632
00633 clear_special_calls ();
00634 FOR_EACH_BB (bb)
00635 {
00636
00637 remove_dead_phis (bb);
00638 }
00639
00640 FOR_EACH_BB (bb)
00641 {
00642
00643 for (i = bsi_start (bb); ! bsi_end_p (i) ; )
00644 {
00645 tree t = bsi_stmt (i);
00646
00647 stats.total++;
00648
00649
00650 if (! NECESSARY (t))
00651 remove_dead_stmt (&i, bb);
00652 else
00653 {
00654 tree call = get_call_expr_in (t);
00655 if (call)
00656 notice_special_calls (call);
00657 bsi_next (&i);
00658 }
00659 }
00660 }
00661 }
00662
00663
00664
00665 static void
00666 remove_dead_phis (basic_block bb)
00667 {
00668 tree prev, phi;
00669
00670 prev = NULL_TREE;
00671 phi = phi_nodes (bb);
00672 while (phi)
00673 {
00674 stats.total_phis++;
00675
00676 if (! NECESSARY (phi))
00677 {
00678 tree next = PHI_CHAIN (phi);
00679
00680 if (dump_file && (dump_flags & TDF_DETAILS))
00681 {
00682 fprintf (dump_file, "Deleting : ");
00683 print_generic_stmt (dump_file, phi, TDF_SLIM);
00684 fprintf (dump_file, "\n");
00685 }
00686
00687 remove_phi_node (phi, prev);
00688 stats.removed_phis++;
00689 phi = next;
00690 }
00691 else
00692 {
00693 prev = phi;
00694 phi = PHI_CHAIN (phi);
00695 }
00696 }
00697 }
00698
00699
00700
00701
00702 static void
00703 remove_dead_stmt (block_stmt_iterator *i, basic_block bb)
00704 {
00705 tree t = bsi_stmt (*i);
00706 def_operand_p def_p;
00707
00708 ssa_op_iter iter;
00709
00710 if (dump_file && (dump_flags & TDF_DETAILS))
00711 {
00712 fprintf (dump_file, "Deleting : ");
00713 print_generic_stmt (dump_file, t, TDF_SLIM);
00714 fprintf (dump_file, "\n");
00715 }
00716
00717 stats.removed++;
00718
00719
00720
00721
00722
00723
00724
00725 if (is_ctrl_stmt (t))
00726 {
00727 basic_block post_dom_bb;
00728
00729
00730 gcc_assert (dom_computed[CDI_POST_DOMINATORS] == DOM_OK);
00731
00732 post_dom_bb = get_immediate_dominator (CDI_POST_DOMINATORS, bb);
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750 if (! post_dom_bb
00751 || post_dom_bb == EXIT_BLOCK_PTR
00752 || phi_nodes (post_dom_bb))
00753 ;
00754 else
00755 {
00756
00757 redirect_edge_and_branch (EDGE_SUCC (bb, 0), post_dom_bb);
00758 PENDING_STMT (EDGE_SUCC (bb, 0)) = NULL;
00759 }
00760 EDGE_SUCC (bb, 0)->probability = REG_BR_PROB_BASE;
00761 EDGE_SUCC (bb, 0)->count = bb->count;
00762
00763
00764
00765 EDGE_SUCC (bb, 0)->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
00766
00767
00768 EDGE_SUCC (bb, 0)->flags |= EDGE_FALLTHRU;
00769
00770
00771 while (!single_succ_p (bb))
00772 {
00773
00774
00775
00776
00777
00778 cfg_altered = true;
00779 remove_edge (EDGE_SUCC (bb, 1));
00780 }
00781 }
00782
00783 FOR_EACH_SSA_DEF_OPERAND (def_p, t, iter, SSA_OP_VIRTUAL_DEFS)
00784 {
00785 tree def = DEF_FROM_PTR (def_p);
00786 mark_sym_for_renaming (SSA_NAME_VAR (def));
00787 }
00788 bsi_remove (i, true);
00789 release_defs (t);
00790 }
00791
00792
00793
00794 static void
00795 print_stats (void)
00796 {
00797 if (dump_file && (dump_flags & (TDF_STATS|TDF_DETAILS)))
00798 {
00799 float percg;
00800
00801 percg = ((float) stats.removed / (float) stats.total) * 100;
00802 fprintf (dump_file, "Removed %d of %d statements (%d%%)\n",
00803 stats.removed, stats.total, (int) percg);
00804
00805 if (stats.total_phis == 0)
00806 percg = 0;
00807 else
00808 percg = ((float) stats.removed_phis / (float) stats.total_phis) * 100;
00809
00810 fprintf (dump_file, "Removed %d of %d PHI nodes (%d%%)\n",
00811 stats.removed_phis, stats.total_phis, (int) percg);
00812 }
00813 }
00814
00815
00816
00817 static void
00818 tree_dce_init (bool aggressive)
00819 {
00820 memset ((void *) &stats, 0, sizeof (stats));
00821
00822 if (aggressive)
00823 {
00824 int i;
00825
00826 control_dependence_map = XNEWVEC (bitmap, last_basic_block);
00827 for (i = 0; i < last_basic_block; ++i)
00828 control_dependence_map[i] = BITMAP_ALLOC (NULL);
00829
00830 last_stmt_necessary = sbitmap_alloc (last_basic_block);
00831 sbitmap_zero (last_stmt_necessary);
00832 }
00833
00834 processed = sbitmap_alloc (num_ssa_names + 1);
00835 sbitmap_zero (processed);
00836
00837 worklist = VEC_alloc (tree, heap, 64);
00838 cfg_altered = false;
00839 }
00840
00841
00842
00843 static void
00844 tree_dce_done (bool aggressive)
00845 {
00846 if (aggressive)
00847 {
00848 int i;
00849
00850 for (i = 0; i < last_basic_block; ++i)
00851 BITMAP_FREE (control_dependence_map[i]);
00852 free (control_dependence_map);
00853
00854 sbitmap_free (visited_control_parents);
00855 sbitmap_free (last_stmt_necessary);
00856 }
00857
00858 sbitmap_free (processed);
00859
00860 VEC_free (tree, heap, worklist);
00861 }
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877 static void
00878 perform_tree_ssa_dce (bool aggressive)
00879 {
00880 struct edge_list *el = NULL;
00881
00882 tree_dce_init (aggressive);
00883
00884 if (aggressive)
00885 {
00886
00887 timevar_push (TV_CONTROL_DEPENDENCES);
00888 calculate_dominance_info (CDI_POST_DOMINATORS);
00889 el = create_edge_list ();
00890 find_all_control_dependences (el);
00891 timevar_pop (TV_CONTROL_DEPENDENCES);
00892
00893 visited_control_parents = sbitmap_alloc (last_basic_block);
00894 sbitmap_zero (visited_control_parents);
00895
00896 mark_dfs_back_edges ();
00897 }
00898
00899 find_obviously_necessary_stmts (el);
00900
00901 propagate_necessity (el);
00902
00903 mark_really_necessary_kill_operand_phis ();
00904 eliminate_unnecessary_stmts ();
00905
00906 if (aggressive)
00907 free_dominance_info (CDI_POST_DOMINATORS);
00908
00909
00910
00911
00912 if (cfg_altered)
00913 free_dominance_info (CDI_DOMINATORS);
00914
00915
00916 if (dump_file)
00917 print_stats ();
00918
00919 tree_dce_done (aggressive);
00920
00921 free_edge_list (el);
00922 }
00923
00924
00925 static unsigned int
00926 tree_ssa_dce (void)
00927 {
00928 perform_tree_ssa_dce (false);
00929 return 0;
00930 }
00931
00932 static unsigned int
00933 tree_ssa_dce_loop (void)
00934 {
00935 perform_tree_ssa_dce (false);
00936 free_numbers_of_iterations_estimates (current_loops);
00937 scev_reset ();
00938 return 0;
00939 }
00940
00941 static unsigned int
00942 tree_ssa_cd_dce (void)
00943 {
00944 perform_tree_ssa_dce (optimize >= 2);
00945 return 0;
00946 }
00947
00948 static bool
00949 gate_dce (void)
00950 {
00951 return flag_tree_dce != 0;
00952 }
00953
00954 struct tree_opt_pass pass_dce =
00955 {
00956 "dce",
00957 gate_dce,
00958 tree_ssa_dce,
00959 NULL,
00960 NULL,
00961 0,
00962 TV_TREE_DCE,
00963 PROP_cfg | PROP_ssa | PROP_alias,
00964 0,
00965 0,
00966 0,
00967 TODO_dump_func
00968 | TODO_update_ssa
00969 | TODO_cleanup_cfg
00970 | TODO_ggc_collect
00971 | TODO_verify_ssa
00972 | TODO_remove_unused_locals,
00973 0
00974 };
00975
00976 struct tree_opt_pass pass_dce_loop =
00977 {
00978 "dceloop",
00979 gate_dce,
00980 tree_ssa_dce_loop,
00981 NULL,
00982 NULL,
00983 0,
00984 TV_TREE_DCE,
00985 PROP_cfg | PROP_ssa | PROP_alias,
00986 0,
00987 0,
00988 0,
00989 TODO_dump_func
00990 | TODO_update_ssa
00991 | TODO_cleanup_cfg
00992 | TODO_verify_ssa,
00993 0
00994 };
00995
00996 struct tree_opt_pass pass_cd_dce =
00997 {
00998 "cddce",
00999 gate_dce,
01000 tree_ssa_cd_dce,
01001 NULL,
01002 NULL,
01003 0,
01004 TV_TREE_CD_DCE,
01005 PROP_cfg | PROP_ssa | PROP_alias,
01006 0,
01007 0,
01008 0,
01009 TODO_dump_func
01010 | TODO_update_ssa
01011 | TODO_cleanup_cfg
01012 | TODO_ggc_collect
01013 | TODO_verify_ssa
01014 | TODO_verify_flow,
01015 0
01016 };