diff options
author | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-05-11 11:13:27 +0000 |
---|---|---|
committer | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-05-11 11:13:27 +0000 |
commit | c41143fb1d63596ff2a0f6da741b4bae73b8be16 (patch) | |
tree | d70c0763693cfef7bc877f21e079986944261a5f /gcc/tree-ssa-dse.c | |
parent | eb0badc13724022c8828a55e516d0eecdc487cc3 (diff) | |
download | gcc-c41143fb1d63596ff2a0f6da741b4bae73b8be16.tar.gz |
2011-05-11 Basile Starynkevitch <basile@starynkevitch.net>
MELT branch merged with trunk rev 173647 using svnmerge
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/melt-branch@173652 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-dse.c')
-rw-r--r-- | gcc/tree-ssa-dse.c | 153 |
1 files changed, 13 insertions, 140 deletions
diff --git a/gcc/tree-ssa-dse.c b/gcc/tree-ssa-dse.c index 26a438d12b2..6d51dabced6 100644 --- a/gcc/tree-ssa-dse.c +++ b/gcc/tree-ssa-dse.c @@ -65,84 +65,14 @@ along with GCC; see the file COPYING3. If not see the CFG. */ -struct dse_global_data -{ - /* This is the global bitmap for store statements. - - Each statement has a unique ID. When we encounter a store statement - that we want to record, set the bit corresponding to the statement's - unique ID in this bitmap. */ - bitmap stores; -}; - -/* We allocate a bitmap-per-block for stores which are encountered - during the scan of that block. This allows us to restore the - global bitmap of stores when we finish processing a block. */ -struct dse_block_local_data -{ - bitmap stores; -}; - /* Bitmap of blocks that have had EH statements cleaned. We should remove their dead edges eventually. */ static bitmap need_eh_cleanup; static bool gate_dse (void); static unsigned int tree_ssa_dse (void); -static void dse_initialize_block_local_data (struct dom_walk_data *, - basic_block, - bool); static void dse_enter_block (struct dom_walk_data *, basic_block); -static void dse_leave_block (struct dom_walk_data *, basic_block); -static void record_voperand_set (bitmap, bitmap *, unsigned int); - -/* Returns uid of statement STMT. */ - -static unsigned -get_stmt_uid (gimple stmt) -{ - if (gimple_code (stmt) == GIMPLE_PHI) - return SSA_NAME_VERSION (gimple_phi_result (stmt)) - + gimple_stmt_max_uid (cfun); - - return gimple_uid (stmt); -} - -/* Set bit UID in bitmaps GLOBAL and *LOCAL, creating *LOCAL as needed. */ - -static void -record_voperand_set (bitmap global, bitmap *local, unsigned int uid) -{ - /* Lazily allocate the bitmap. Note that we do not get a notification - when the block local data structures die, so we allocate the local - bitmap backed by the GC system. */ - if (*local == NULL) - *local = BITMAP_GGC_ALLOC (); - - /* Set the bit in the local and global bitmaps. */ - bitmap_set_bit (*local, uid); - bitmap_set_bit (global, uid); -} - -/* Initialize block local data structures. */ -static void -dse_initialize_block_local_data (struct dom_walk_data *walk_data, - basic_block bb ATTRIBUTE_UNUSED, - bool recycled) -{ - struct dse_block_local_data *bd - = (struct dse_block_local_data *) - VEC_last (void_p, walk_data->block_data_stack); - - /* If we are given a recycled block local data structure, ensure any - bitmap associated with the block is cleared. */ - if (recycled) - { - if (bd->stores) - bitmap_clear (bd->stores); - } -} /* A helper of dse_optimize_stmt. Given a GIMPLE_ASSIGN in STMT, find a candidate statement *USE_STMT that @@ -251,9 +181,6 @@ dse_possible_dead_store_p (gimple stmt, gimple *use_stmt) continue walking until both stores have equal reference trees. */ while (!stmt_may_clobber_ref_p (temp, gimple_assign_lhs (stmt))); - if (!is_gimple_assign (temp)) - return false; - *use_stmt = temp; return true; @@ -272,9 +199,7 @@ dse_possible_dead_store_p (gimple stmt, gimple *use_stmt) post dominates the first store, then the first store is dead. */ static void -dse_optimize_stmt (struct dse_global_data *dse_gd, - struct dse_block_local_data *bd, - gimple_stmt_iterator gsi) +dse_optimize_stmt (gimple_stmt_iterator gsi) { gimple stmt = gsi_stmt (gsi); @@ -295,8 +220,6 @@ dse_optimize_stmt (struct dse_global_data *dse_gd, { gimple use_stmt; - record_voperand_set (dse_gd->stores, &bd->stores, gimple_uid (stmt)); - if (!dse_possible_dead_store_p (stmt, &use_stmt)) return; @@ -304,10 +227,10 @@ dse_optimize_stmt (struct dse_global_data *dse_gd, stores are to the same memory location or there is a chain of virtual uses from stmt and the stmt which stores to that same memory location, then we may have found redundant store. */ - if (bitmap_bit_p (dse_gd->stores, get_stmt_uid (use_stmt)) - && (operand_equal_p (gimple_assign_lhs (stmt), - gimple_assign_lhs (use_stmt), 0) - || stmt_kills_ref_p (use_stmt, gimple_assign_lhs (stmt)))) + if ((gimple_has_lhs (use_stmt) + && (operand_equal_p (gimple_assign_lhs (stmt), + gimple_get_lhs (use_stmt), 0))) + || stmt_kills_ref_p (use_stmt, gimple_assign_lhs (stmt))) { /* If use_stmt is or might be a nop assignment, e.g. for struct { ... } S a, b, *p; ... @@ -321,12 +244,7 @@ dse_optimize_stmt (struct dse_global_data *dse_gd, acts as a use as well as definition, so store in STMT is not dead. */ if (stmt != use_stmt - && !is_gimple_reg (gimple_assign_rhs1 (use_stmt)) - && !is_gimple_min_invariant (gimple_assign_rhs1 (use_stmt)) - /* ??? Should {} be invariant? */ - && gimple_assign_rhs_code (use_stmt) != CONSTRUCTOR - && refs_may_alias_p (gimple_assign_lhs (use_stmt), - gimple_assign_rhs1 (use_stmt))) + && ref_maybe_used_by_stmt_p (use_stmt, gimple_assign_lhs (stmt))) return; if (dump_file && (dump_flags & TDF_DETAILS)) @@ -351,52 +269,14 @@ dse_optimize_stmt (struct dse_global_data *dse_gd, } } -/* Record that we have seen the PHIs at the start of BB which correspond - to virtual operands. */ -static void -dse_record_phi (struct dse_global_data *dse_gd, - struct dse_block_local_data *bd, - gimple phi) -{ - if (!is_gimple_reg (gimple_phi_result (phi))) - record_voperand_set (dse_gd->stores, &bd->stores, get_stmt_uid (phi)); -} - static void -dse_enter_block (struct dom_walk_data *walk_data, basic_block bb) +dse_enter_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED, + basic_block bb) { - struct dse_block_local_data *bd - = (struct dse_block_local_data *) - VEC_last (void_p, walk_data->block_data_stack); - struct dse_global_data *dse_gd - = (struct dse_global_data *) walk_data->global_data; gimple_stmt_iterator gsi; for (gsi = gsi_last (bb_seq (bb)); !gsi_end_p (gsi); gsi_prev (&gsi)) - dse_optimize_stmt (dse_gd, bd, gsi); - for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) - dse_record_phi (dse_gd, bd, gsi_stmt (gsi)); -} - -static void -dse_leave_block (struct dom_walk_data *walk_data, - basic_block bb ATTRIBUTE_UNUSED) -{ - struct dse_block_local_data *bd - = (struct dse_block_local_data *) - VEC_last (void_p, walk_data->block_data_stack); - struct dse_global_data *dse_gd - = (struct dse_global_data *) walk_data->global_data; - bitmap stores = dse_gd->stores; - unsigned int i; - bitmap_iterator bi; - - /* Unwind the stores noted in this basic block. */ - if (bd->stores) - EXECUTE_IF_SET_IN_BITMAP (bd->stores, 0, i, bi) - { - bitmap_clear_bit (stores, i); - } + dse_optimize_stmt (gsi); } /* Main entry point. */ @@ -405,7 +285,6 @@ static unsigned int tree_ssa_dse (void) { struct dom_walk_data walk_data; - struct dse_global_data dse_gd; need_eh_cleanup = BITMAP_ALLOC (NULL); @@ -421,15 +300,12 @@ tree_ssa_dse (void) /* Dead store elimination is fundamentally a walk of the post-dominator tree and a backwards walk of statements within each block. */ walk_data.dom_direction = CDI_POST_DOMINATORS; - walk_data.initialize_block_local_data = dse_initialize_block_local_data; + walk_data.initialize_block_local_data = NULL; walk_data.before_dom_children = dse_enter_block; - walk_data.after_dom_children = dse_leave_block; + walk_data.after_dom_children = NULL; - walk_data.block_local_data_size = sizeof (struct dse_block_local_data); - - /* This is the main hash table for the dead store elimination pass. */ - dse_gd.stores = BITMAP_ALLOC (NULL); - walk_data.global_data = &dse_gd; + walk_data.block_local_data_size = 0; + walk_data.global_data = NULL; /* Initialize the dominator walker. */ init_walk_dominator_tree (&walk_data); @@ -440,9 +316,6 @@ tree_ssa_dse (void) /* Finalize the dominator walker. */ fini_walk_dominator_tree (&walk_data); - /* Release the main bitmap. */ - BITMAP_FREE (dse_gd.stores); - /* Removal of stores may make some EH edges dead. Purge such edges from the CFG as needed. */ if (!bitmap_empty_p (need_eh_cleanup)) |