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-sink.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-sink.c')
-rw-r--r-- | gcc/tree-ssa-sink.c | 112 |
1 files changed, 54 insertions, 58 deletions
diff --git a/gcc/tree-ssa-sink.c b/gcc/tree-ssa-sink.c index ebf54e2070b..e56cce0edb1 100644 --- a/gcc/tree-ssa-sink.c +++ b/gcc/tree-ssa-sink.c @@ -28,7 +28,7 @@ along with GCC; see the file COPYING3. If not see #include "diagnostic.h" #include "tree-inline.h" #include "tree-flow.h" -#include "tree-gimple.h" +#include "gimple.h" #include "tree-dump.h" #include "timevar.h" #include "fibheap.h" @@ -82,18 +82,18 @@ static struct we return NULL. */ static basic_block -find_bb_for_arg (tree phi, tree def) +find_bb_for_arg (gimple phi, tree def) { - int i; + size_t i; bool foundone = false; basic_block result = NULL; - for (i = 0; i < PHI_NUM_ARGS (phi); i++) + for (i = 0; i < gimple_phi_num_args (phi); i++) if (PHI_ARG_DEF (phi, i) == def) { if (foundone) return NULL; foundone = true; - result = PHI_ARG_EDGE (phi, i)->src; + result = gimple_phi_arg_edge (phi, i)->src; } return result; } @@ -107,9 +107,9 @@ find_bb_for_arg (tree phi, tree def) used in, so that you only have one place you can sink it to. */ static bool -all_immediate_uses_same_place (tree stmt) +all_immediate_uses_same_place (gimple stmt) { - tree firstuse = NULL_TREE; + gimple firstuse = NULL; ssa_op_iter op_iter; imm_use_iterator imm_iter; use_operand_p use_p; @@ -119,7 +119,7 @@ all_immediate_uses_same_place (tree stmt) { FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var) { - if (firstuse == NULL_TREE) + if (firstuse == NULL) firstuse = USE_STMT (use_p); else if (firstuse != USE_STMT (use_p)) @@ -134,16 +134,16 @@ all_immediate_uses_same_place (tree stmt) but we still must avoid moving them around. */ bool -is_hidden_global_store (tree stmt) +is_hidden_global_store (gimple stmt) { /* Check virtual definitions. If we get here, the only virtual - definitions we should see are those generated by assignment + definitions we should see are those generated by assignment or call statements. */ if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_VIRTUAL_DEFS)) { tree lhs; - gcc_assert (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT); + gcc_assert (is_gimple_assign (stmt) || is_gimple_call (stmt)); /* Note that we must not check the individual virtual operands here. In particular, if this is an aliased store, we could @@ -170,7 +170,8 @@ is_hidden_global_store (tree stmt) address is a pointer, we check if its name tag or symbol tag is a global variable. Otherwise, we check if the base variable is a global. */ - lhs = GIMPLE_STMT_OPERAND (stmt, 0); + lhs = gimple_get_lhs (stmt); + if (REFERENCE_CLASS_P (lhs)) lhs = get_base_address (lhs); @@ -200,7 +201,7 @@ is_hidden_global_store (tree stmt) /* Find the nearest common dominator of all of the immediate uses in IMM. */ static basic_block -nearest_common_dominator_of_uses (tree stmt) +nearest_common_dominator_of_uses (gimple stmt) { bitmap blocks = BITMAP_ALLOC (NULL); basic_block commondom; @@ -216,18 +217,18 @@ nearest_common_dominator_of_uses (tree stmt) { FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var) { - tree usestmt = USE_STMT (use_p); + gimple usestmt = USE_STMT (use_p); basic_block useblock; - if (TREE_CODE (usestmt) == PHI_NODE) + if (gimple_code (usestmt) == GIMPLE_PHI) { int idx = PHI_ARG_INDEX_FROM_USE (use_p); - useblock = PHI_ARG_EDGE (usestmt, idx)->src; + useblock = gimple_phi_arg_edge (usestmt, idx)->src; } else { - useblock = bb_for_stmt (usestmt); + useblock = gimple_bb (usestmt); } /* Short circuit. Nothing dominates the entry block. */ @@ -249,23 +250,22 @@ nearest_common_dominator_of_uses (tree stmt) /* Given a statement (STMT) and the basic block it is currently in (FROMBB), determine the location to sink the statement to, if any. - Returns true if there is such location; in that case, TOBB is set to the - basic block of the location, and TOBSI points to the statement before - that STMT should be moved. */ + Returns true if there is such location; in that case, TOGSI points to the + statement before that STMT should be moved. */ static bool -statement_sink_location (tree stmt, basic_block frombb, basic_block *tobb, - block_stmt_iterator *tobsi) +statement_sink_location (gimple stmt, basic_block frombb, + gimple_stmt_iterator *togsi) { - tree use, def; + gimple use; + tree def; use_operand_p one_use = NULL_USE_OPERAND_P; basic_block sinkbb; use_operand_p use_p; def_operand_p def_p; ssa_op_iter iter; - stmt_ann_t ann; - tree rhs; imm_use_iterator imm_iter; + enum tree_code code; FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS) { @@ -281,9 +281,8 @@ statement_sink_location (tree stmt, basic_block frombb, basic_block *tobb, if (one_use == NULL_USE_OPERAND_P) return false; - if (TREE_CODE (stmt) != GIMPLE_MODIFY_STMT) + if (gimple_code (stmt) != GIMPLE_ASSIGN) return false; - rhs = GIMPLE_STMT_OPERAND (stmt, 1); /* There are a few classes of things we can't or don't move, some because we don't have code to handle it, some because it's not profitable and some @@ -305,13 +304,13 @@ statement_sink_location (tree stmt, basic_block frombb, basic_block *tobb, sunk. */ - ann = stmt_ann (stmt); + code = gimple_assign_rhs_code (stmt); if (stmt_ends_bb_p (stmt) - || TREE_SIDE_EFFECTS (rhs) - || TREE_CODE (rhs) == EXC_PTR_EXPR - || TREE_CODE (rhs) == FILTER_EXPR + || gimple_has_side_effects (stmt) + || code == EXC_PTR_EXPR + || code == FILTER_EXPR || is_hidden_global_store (stmt) - || ann->has_volatile_ops + || gimple_has_volatile_ops (stmt) || !ZERO_SSA_OPERANDS (stmt, SSA_OP_VUSE)) return false; @@ -365,20 +364,19 @@ statement_sink_location (tree stmt, basic_block frombb, basic_block *tobb, fprintf (dump_file, "Common dominator of all uses is %d\n", commondom->index); } - *tobb = commondom; - *tobsi = bsi_after_labels (commondom); + *togsi = gsi_after_labels (commondom); return true; } use = USE_STMT (one_use); - if (TREE_CODE (use) != PHI_NODE) + if (gimple_code (use) != GIMPLE_PHI) { - sinkbb = bb_for_stmt (use); + sinkbb = gimple_bb (use); if (sinkbb == frombb || sinkbb->loop_depth > frombb->loop_depth || sinkbb->loop_father != frombb->loop_father) return false; - *tobb = sinkbb; - *tobsi = bsi_for_stmt (use); + + *togsi = gsi_for_stmt (use); return true; } @@ -399,14 +397,13 @@ statement_sink_location (tree stmt, basic_block frombb, basic_block *tobb, If the use is a phi, and is in the same bb as the def, we can't sink it. */ - if (bb_for_stmt (use) == frombb) + if (gimple_bb (use) == frombb) return false; if (sinkbb == frombb || sinkbb->loop_depth > frombb->loop_depth || sinkbb->loop_father != frombb->loop_father) return false; - *tobb = sinkbb; - *tobsi = bsi_after_labels (sinkbb); + *togsi = gsi_after_labels (sinkbb); return true; } @@ -417,7 +414,7 @@ static void sink_code_in_bb (basic_block bb) { basic_block son; - block_stmt_iterator bsi; + gimple_stmt_iterator gsi; edge_iterator ei; edge e; bool last = true; @@ -432,50 +429,49 @@ sink_code_in_bb (basic_block bb) if (e->flags & EDGE_ABNORMAL) goto earlyout; - for (bsi = bsi_last (bb); !bsi_end_p (bsi);) + for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi);) { - tree stmt = bsi_stmt (bsi); - block_stmt_iterator tobsi; - basic_block tobb; + gimple stmt = gsi_stmt (gsi); + gimple_stmt_iterator togsi; - if (!statement_sink_location (stmt, bb, &tobb, &tobsi)) + if (!statement_sink_location (stmt, bb, &togsi)) { - if (!bsi_end_p (bsi)) - bsi_prev (&bsi); + if (!gsi_end_p (gsi)) + gsi_prev (&gsi); last = false; continue; } if (dump_file) { fprintf (dump_file, "Sinking "); - print_generic_expr (dump_file, stmt, TDF_VOPS); + print_gimple_stmt (dump_file, stmt, 0, TDF_VOPS); fprintf (dump_file, " from bb %d to bb %d\n", - bb->index, tobb->index); + bb->index, (gsi_bb (togsi))->index); } /* If this is the end of the basic block, we need to insert at the end of the basic block. */ - if (bsi_end_p (tobsi)) - bsi_move_to_bb_end (&bsi, tobb); + if (gsi_end_p (togsi)) + gsi_move_to_bb_end (&gsi, gsi_bb (togsi)); else - bsi_move_before (&bsi, &tobsi); + gsi_move_before (&gsi, &togsi); sink_stats.sunk++; /* If we've just removed the last statement of the BB, the - bsi_end_p() test below would fail, but bsi_prev() would have + gsi_end_p() test below would fail, but gsi_prev() would have succeeded, and we want it to succeed. So we keep track of whether we're at the last statement and pick up the new last statement. */ if (last) { - bsi = bsi_last (bb); + gsi = gsi_last_bb (bb); continue; } last = false; - if (!bsi_end_p (bsi)) - bsi_prev (&bsi); + if (!gsi_end_p (gsi)) + gsi_prev (&gsi); } earlyout: |