diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-07-28 14:33:56 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-07-28 14:33:56 +0000 |
commit | 75a70cf95f65fe9204b15ad9aba31c571381d224 (patch) | |
tree | 2926705dd533a8904679724ab1cec40dfee45094 /gcc/tree-ssa-live.c | |
parent | d0a9db40355cf570989e2aca92ab2060df234926 (diff) | |
download | gcc-75a70cf95f65fe9204b15ad9aba31c571381d224.tar.gz |
2008-07-28 Richard Guenther <rguenther@suse.de>
Merge from gimple-tuples-branch.
* ChangeLog.tuples: ChangeLog from gimple-tuples-branch.
* gimple.def: New file.
* gsstruct.def: Likewise.
* gimple-iterator.c: Likewise.
* gimple-pretty-print.c: Likewise.
* tree-gimple.c: Removed. Merged into ...
* gimple.c: ... here. New file.
* tree-gimple.h: Removed. Merged into ...
* gimple.h: ... here. New file.
* Makefile.in: Add dependencies on GIMPLE_H and tree-iterator.h.
* configure.ac: Added support for ENABLE_GIMPLE_CHECKING and the
--enable-checking=gimple flag.
* config.in: Likewise.
* configure: Regenerated.
* tree-ssa-operands.h: Tuplified.
* tree-vrp.c: Likewise.
* tree-loop-linear.c: Likewise.
* tree-into-ssa.c: Likewise.
* tree-ssa-loop-im.c: Likewise.
* tree-dump.c: Likewise.
* tree-complex.c: Likewise.
* cgraphbuild.c: Likewise.
* tree-ssa-threadupdate.c: Likewise.
* tree-ssa-loop-niter.c: Likewise.
* tree-pretty-print.c: Likewise.
* tracer.c: Likewise.
* gengtype.c: Likewise.
* tree-loop-distribution.c: Likewise.
* tree-ssa-loop-unswitch.c: Likewise.
* cgraph.c: Likewise.
* cgraph.h: Likewise.
* tree-ssa-loop-manip.c: Likewise.
* value-prof.c: Likewise.
* tree-ssa-loop-ch.c: Likewise.
* tree-tailcall.c: Likewise.
* value-prof.h: Likewise.
* tree.c: Likewise.
* tree.h: Likewise.
* tree-pass.h: Likewise.
* ipa-cp.c: Likewise.
* tree-scalar-evolution.c: Likewise.
* tree-scalar-evolution.h: Likewise.
* target.h: Likewise.
* lambda-mat.c: Likewise.
* tree-phinodes.c: Likewise.
* diagnostic.h: Likewise.
* builtins.c: Likewise.
* tree-ssa-alias-warnings.c: Likewise.
* cfghooks.c: Likewise.
* fold-const.c: Likewise.
* cfghooks.h: Likewise.
* omp-low.c: Likewise.
* tree-ssa-dse.c: Likewise.
* ipa-reference.c: Likewise.
* tree-ssa-uncprop.c: Likewise.
* toplev.c: Likewise.
* tree-gimple.c: Likewise.
* tree-gimple.h: Likewise.
* tree-chrec.c: Likewise.
* tree-chrec.h: Likewise.
* tree-ssa-sccvn.c: Likewise.
* tree-ssa-sccvn.h: Likewise.
* cgraphunit.c: Likewise.
* tree-ssa-copyrename.c: Likewise.
* tree-ssa-ccp.c: Likewise.
* tree-ssa-loop-ivopts.c: Likewise.
* tree-nomudflap.c: Likewise.
* tree-call-cdce.c: Likewise.
* ipa-pure-const.c: Likewise.
* c-format.c: Likewise.
* tree-stdarg.c: Likewise.
* tree-ssa-math-opts.c: Likewise.
* tree-ssa-dom.c: Likewise.
* tree-nrv.c: Likewise.
* tree-ssa-propagate.c: Likewise.
* ipa-utils.c: Likewise.
* tree-ssa-propagate.h: Likewise.
* tree-ssa-alias.c: Likewise.
* gimple-low.c: Likewise.
* tree-ssa-sink.c: Likewise.
* ipa-inline.c: Likewise.
* c-semantics.c: Likewise.
* dwarf2out.c: Likewise.
* expr.c: Likewise.
* tree-ssa-loop-ivcanon.c: Likewise.
* predict.c: Likewise.
* tree-ssa-loop.c: Likewise.
* tree-parloops.c: Likewise.
* tree-ssa-address.c: Likewise.
* tree-ssa-ifcombine.c: Likewise.
* matrix-reorg.c: Likewise.
* c-decl.c: Likewise.
* tree-eh.c: Likewise.
* c-pretty-print.c: Likewise.
* lambda-trans.c: Likewise.
* function.c: Likewise.
* langhooks.c: Likewise.
* ebitmap.h: Likewise.
* tree-vectorizer.c: Likewise.
* function.h: Likewise.
* langhooks.h: Likewise.
* tree-vectorizer.h: Likewise.
* ipa-type-escape.c: Likewise.
* ipa-type-escape.h: Likewise.
* domwalk.c: Likewise.
* tree-if-conv.c: Likewise.
* profile.c: Likewise.
* domwalk.h: Likewise.
* tree-data-ref.c: Likewise.
* tree-data-ref.h: Likewise.
* tree-flow-inline.h: Likewise.
* tree-affine.c: Likewise.
* tree-vect-analyze.c: Likewise.
* c-typeck.c: Likewise.
* gimplify.c: Likewise.
* coretypes.h: Likewise.
* tree-ssa-phiopt.c: Likewise.
* calls.c: Likewise.
* tree-ssa-coalesce.c: Likewise.
* tree.def: Likewise.
* tree-dfa.c: Likewise.
* except.c: Likewise.
* except.h: Likewise.
* cfgexpand.c: Likewise.
* tree-cfgcleanup.c: Likewise.
* tree-ssa-pre.c: Likewise.
* tree-ssa-live.c: Likewise.
* tree-sra.c: Likewise.
* tree-ssa-live.h: Likewise.
* tree-predcom.c: Likewise.
* lambda.h: Likewise.
* tree-mudflap.c: Likewise.
* ipa-prop.c: Likewise.
* print-tree.c: Likewise.
* tree-ssa-copy.c: Likewise.
* ipa-prop.h: Likewise.
* tree-ssa-forwprop.c: Likewise.
* ggc-page.c: Likewise.
* c-omp.c: Likewise.
* tree-ssa-dce.c: Likewise.
* tree-vect-patterns.c: Likewise.
* tree-ssa-ter.c: Likewise.
* tree-nested.c: Likewise.
* tree-ssa.c: Likewise.
* lambda-code.c: Likewise.
* tree-ssa-loop-prefetch.c: Likewise.
* tree-inline.c: Likewise.
* tree-inline.h: Likewise.
* tree-iterator.c: Likewise.
* tree-optimize.c: Likewise.
* tree-ssa-phiprop.c: Likewise.
* tree-vect-transform.c: Likewise.
* tree-object-size.c: Likewise.
* tree-outof-ssa.c: Likewise.
* cfgloop.c: Likewise.
* system.h: Likewise.
* tree-profile.c: Likewise.
* cfgloop.h: Likewise.
* c-gimplify.c: Likewise.
* c-common.c: Likewise.
* tree-vect-generic.c: Likewise.
* tree-flow.h: Likewise.
* c-common.h: Likewise.
* basic-block.h: Likewise.
* tree-ssa-structalias.c: Likewise.
* tree-switch-conversion.c: Likewise.
* tree-ssa-structalias.h: Likewise.
* tree-cfg.c: Likewise.
* passes.c: Likewise.
* ipa-struct-reorg.c: Likewise.
* ipa-struct-reorg.h: Likewise.
* tree-ssa-reassoc.c: Likewise.
* cfgrtl.c: Likewise.
* varpool.c: Likewise.
* stmt.c: Likewise.
* tree-ssanames.c: Likewise.
* tree-ssa-threadedge.c: Likewise.
* langhooks-def.h: Likewise.
* tree-ssa-operands.c: Likewise.
* config/alpha/alpha.c: Likewise.
* config/frv/frv.c: Likewise.
* config/s390/s390.c: Likewise.
* config/m32c/m32c.c: Likewise.
* config/m32c/m32c-protos.h: Likewise.
* config/spu/spu.c: Likewise.
* config/sparc/sparc.c: Likewise.
* config/i386/i386.c: Likewise.
* config/sh/sh.c: Likewise.
* config/xtensa/xtensa.c: Likewise.
* config/stormy16/stormy16.c: Likewise.
* config/ia64/ia64.c: Likewise.
* config/rs6000/rs6000.c: Likewise.
* config/pa/pa.c: Likewise.
* config/mips/mips.c: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@138207 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-live.c')
-rw-r--r-- | gcc/tree-ssa-live.c | 111 |
1 files changed, 66 insertions, 45 deletions
diff --git a/gcc/tree-ssa-live.c b/gcc/tree-ssa-live.c index a5f75963da0..fa3834d21c5 100644 --- a/gcc/tree-ssa-live.c +++ b/gcc/tree-ssa-live.c @@ -403,8 +403,7 @@ static inline void mark_all_vars_used (tree *, void *data); /* Helper function for mark_all_vars_used, called via walk_tree. */ static tree -mark_all_vars_used_1 (tree *tp, int *walk_subtrees, - void *data) +mark_all_vars_used_1 (tree *tp, int *walk_subtrees, void *data) { tree t = *tp; enum tree_code_class c = TREE_CODE_CLASS (TREE_CODE (t)); @@ -412,8 +411,8 @@ mark_all_vars_used_1 (tree *tp, int *walk_subtrees, if (TREE_CODE (t) == SSA_NAME) t = SSA_NAME_VAR (t); - if ((IS_EXPR_CODE_CLASS (c) - || IS_GIMPLE_STMT_CODE_CLASS (c)) + + if (IS_EXPR_CODE_CLASS (c) && (b = TREE_BLOCK (t)) != NULL) TREE_USED (b) = true; @@ -584,6 +583,7 @@ remove_unused_locals (void) if (optimize) mark_scope_block_unused (DECL_INITIAL (current_function_decl)); + /* Assume all locals are unused. */ FOR_EACH_REFERENCED_VAR (t, rvi) var_ann (t)->used = false; @@ -591,23 +591,34 @@ remove_unused_locals (void) /* Walk the CFG marking all referenced symbols. */ FOR_EACH_BB (bb) { - block_stmt_iterator bsi; - tree phi, def; + gimple_stmt_iterator gsi; + size_t i; /* Walk the statements. */ - for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi)) - mark_all_vars_used (bsi_stmt_ptr (bsi), NULL); + for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) + { + gimple stmt = gsi_stmt (gsi); + tree b = gimple_block (stmt); + + if (b) + TREE_USED (b) = true; - for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi)) + for (i = 0; i < gimple_num_ops (stmt); i++) + mark_all_vars_used (gimple_op_ptr (gsi_stmt (gsi), i), NULL); + } + + for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) { use_operand_p arg_p; ssa_op_iter i; + tree def; + gimple phi = gsi_stmt (gsi); /* No point processing globals. */ - if (is_global_var (SSA_NAME_VAR (PHI_RESULT (phi)))) + if (is_global_var (SSA_NAME_VAR (gimple_phi_result (phi)))) continue; - def = PHI_RESULT (phi); + def = gimple_phi_result (phi); mark_all_vars_used (&def, NULL); FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_ALL_USES) @@ -822,7 +833,7 @@ static void set_var_live_on_entry (tree ssa_name, tree_live_info_p live) { int p; - tree stmt; + gimple stmt; use_operand_p use; basic_block def_bb = NULL; imm_use_iterator imm_iter; @@ -835,7 +846,7 @@ set_var_live_on_entry (tree ssa_name, tree_live_info_p live) stmt = SSA_NAME_DEF_STMT (ssa_name); if (stmt) { - def_bb = bb_for_stmt (stmt); + def_bb = gimple_bb (stmt); /* Mark defs in liveout bitmap temporarily. */ if (def_bb) bitmap_set_bit (live->liveout[def_bb->index], p); @@ -847,16 +858,16 @@ set_var_live_on_entry (tree ssa_name, tree_live_info_p live) add it to the list of live on entry blocks. */ FOR_EACH_IMM_USE_FAST (use, imm_iter, ssa_name) { - tree use_stmt = USE_STMT (use); + gimple use_stmt = USE_STMT (use); basic_block add_block = NULL; - if (TREE_CODE (use_stmt) == PHI_NODE) + if (gimple_code (use_stmt) == GIMPLE_PHI) { /* Uses in PHI's are considered to be live at exit of the SRC block as this is where a copy would be inserted. Check to see if it is defined in that block, or whether its live on entry. */ int index = PHI_ARG_INDEX_FROM_USE (use); - edge e = PHI_ARG_EDGE (use_stmt, index); + edge e = gimple_phi_arg_edge (use_stmt, index); if (e->src != ENTRY_BLOCK_PTR) { if (e->src != def_bb) @@ -866,7 +877,7 @@ set_var_live_on_entry (tree ssa_name, tree_live_info_p live) else { /* If its not defined in this block, its live on entry. */ - basic_block use_bb = bb_for_stmt (use_stmt); + basic_block use_bb = gimple_bb (use_stmt); if (use_bb != def_bb) add_block = use_bb; } @@ -891,9 +902,6 @@ set_var_live_on_entry (tree ssa_name, tree_live_info_p live) void calculate_live_on_exit (tree_live_info_p liveinfo) { - unsigned i; - int p; - tree t, phi; basic_block bb; edge e; edge_iterator ei; @@ -905,20 +913,29 @@ calculate_live_on_exit (tree_live_info_p liveinfo) /* Set all the live-on-exit bits for uses in PHIs. */ FOR_EACH_BB (bb) { + gimple_stmt_iterator gsi; + size_t i; + /* Mark the PHI arguments which are live on exit to the pred block. */ - for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi)) - for (i = 0; i < (unsigned)PHI_NUM_ARGS (phi); i++) - { - t = PHI_ARG_DEF (phi, i); - if (TREE_CODE (t) != SSA_NAME) - continue; - p = var_to_partition (liveinfo->map, t); - if (p == NO_PARTITION) - continue; - e = PHI_ARG_EDGE (phi, i); - if (e->src != ENTRY_BLOCK_PTR) - bitmap_set_bit (liveinfo->liveout[e->src->index], p); - } + for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) + { + gimple phi = gsi_stmt (gsi); + for (i = 0; i < gimple_phi_num_args (phi); i++) + { + tree t = PHI_ARG_DEF (phi, i); + int p; + + if (TREE_CODE (t) != SSA_NAME) + continue; + + p = var_to_partition (liveinfo->map, t); + if (p == NO_PARTITION) + continue; + e = gimple_phi_arg_edge (phi, i); + if (e->src != ENTRY_BLOCK_PTR) + bitmap_set_bit (liveinfo->liveout[e->src->index], p); + } + } /* Add each successors live on entry to this bock live on exit. */ FOR_EACH_EDGE (e, ei, bb->succs) @@ -1067,7 +1084,7 @@ verify_live_on_entry (tree_live_info_p live) { unsigned i; tree var; - tree phi, stmt; + gimple stmt; basic_block bb; edge e; int num; @@ -1091,13 +1108,13 @@ verify_live_on_entry (tree_live_info_p live) bitmap loe; var = partition_to_var (map, i); stmt = SSA_NAME_DEF_STMT (var); - tmp = bb_for_stmt (stmt); + tmp = gimple_bb (stmt); d = gimple_default_def (cfun, SSA_NAME_VAR (var)); loe = live_on_entry (live, e->dest); if (loe && bitmap_bit_p (loe, i)) { - if (!IS_EMPTY_STMT (stmt)) + if (!gimple_nop_p (stmt)) { num++; print_generic_expr (stderr, var, TDF_SLIM); @@ -1105,7 +1122,7 @@ verify_live_on_entry (tree_live_info_p live) if (tmp) fprintf (stderr, " in BB%d, ", tmp->index); fprintf (stderr, "by:\n"); - print_generic_expr (stderr, stmt, TDF_SLIM); + print_gimple_stmt (stderr, stmt, 0, TDF_SLIM); fprintf (stderr, "\nIt is also live-on-entry to entry BB %d", entry_block); fprintf (stderr, " So it appears to have multiple defs.\n"); @@ -1116,7 +1133,8 @@ verify_live_on_entry (tree_live_info_p live) { num++; print_generic_expr (stderr, var, TDF_SLIM); - fprintf (stderr, " is live-on-entry to BB%d ",entry_block); + fprintf (stderr, " is live-on-entry to BB%d ", + entry_block); if (d) { fprintf (stderr, " but is not the default def of "); @@ -1133,15 +1151,18 @@ verify_live_on_entry (tree_live_info_p live) { /* The only way this var shouldn't be marked live on entry is if it occurs in a PHI argument of the block. */ - int z, ok = 0; - for (phi = phi_nodes (e->dest); - phi && !ok; - phi = PHI_CHAIN (phi)) + size_t z; + bool ok = false; + gimple_stmt_iterator gsi; + for (gsi = gsi_start_phis (e->dest); + !gsi_end_p (gsi) && !ok; + gsi_next (&gsi)) { - for (z = 0; z < PHI_NUM_ARGS (phi); z++) - if (var == PHI_ARG_DEF (phi, z)) + gimple phi = gsi_stmt (gsi); + for (z = 0; z < gimple_phi_num_args (phi); z++) + if (var == gimple_phi_arg_def (phi, z)) { - ok = 1; + ok = true; break; } } |