See <http://gcc.gnu.org/ml/gcc-patches/2005-08/msg01433.html> and <http://gcc.gnu.org/ml/gcc/2005-08/msg00689.html>. Note this could also be considered a compile time hog for checking enabled case.
I thought there was a discussion in http://gcc.gnu.org/ml/gcc/2005-08/msg00692.html where the solution for dealing with releasing ssa names now that we have immediate use data available all the time is to simply add a lightning fast pass which removes unused ssa_names by zipping through the ssa_name table and releasing any which have no uses. I dont see much point in continuing to find places and add calls to release_defs when we can simply fix it for once and for all. we can add it as a pass, or simply as a TODO flag.
(In reply to comment #1) > where the solution for dealing with releasing ssa names now that we have > immediate use data available all the time is to simply add a lightning fast pass > which removes unused ssa_names by zipping through the ssa_name table and > releasing any which have no uses. That will not work as there is no way to tell if a SSA_NAME is used or not as the statement might have been removed too which is what all those release_defs do I have a pass which is not fast as it does a pass over the IR which removes unused/no alive SSA_NAMEs and I really don't want another pass over the IR going in as a TODO. I really only filed this bug to track this issue. Also an old point to this discussion where we do release_defs: http://gcc.gnu.org/ml/gcc-patches/2004-09/msg00252.html http://gcc.gnu.org/ml/gcc-patches/2004-09/msg01511.html In fact Diego added release_defs: http://gcc.gnu.org/ml/gcc-patches/2004-07/msg02132.html I don't know why people go back and forth on this issue without cleaning up.
Did you read the original thread? We aren't going back and forth over anything. Diego added release_defs in 08/2004 because we did not have immediate_use information freely available at the time. The current immeidate use code was added in spring of 2005, or something like that, so it is now freely available. All we need to do now is do a quick loop through the ssa_name table between selected (or even all) passes, and if there are no uses associated with that ssa_name we *know* it is unused since we are between passes. Then you simply call release_ssa_name() directly on that node. There are no passes over the IL and release_defs will go away too.
(In reply to comment #3) > Did you read the original thread? Well then you do it since you made this mess in the first place.
I don't understand. Exactly what mess did I make? We also probably have to set SSA_NAME_DEF_STMT to NULL in bsi_remove in order to be sure that an SSA name with no uses isn't actually associated with a stmt any more (you can have valid defs with no uses). It is set when the SSA_NAME is created, but I don't think that field ever gets cleared anywhere else.
Subject: Re: SSA_NAMEs are not released after no longer being used. On Sep 19, 2005, at 11:59 AM, amacleod at redhat dot com wrote: > We also probably have to set SSA_NAME_DEF_STMT to NULL in bsi_remove > in order to > be sure that an SSA name with no uses isn't actually associated with a > stmt any > more (you can have valid defs with no uses). It is set when the > SSA_NAME is > created, but I don't think that field ever gets cleared anywhere else. Except that does not work as mentioned before as people do bsi_remove and then bsi_insert on the same staement when moving the statement around. And isn't that the same thing as adding release_defs in bsi_remove? And that will not work for the SSA_NAMEs used for aliasing and then the variable becomes a gimple register. -- Pinski
Its not the same thing since we arent actually releasing an SSA_NAME until between passes. All we are doing is clearing the SSA_NAME_DEF_STMT field. True that inserting a stmt after bsi_remove will not set the SSA_NAME_DEF_STMT field back, but we could set it during the bsi_insert and bsi_replace routines. The operand scanner now sets all the defs, so its just a matter of loping over the defs and setting the field. I don't understand the last bit of your comment: "And that will not work for the SSA_NAMEs used for aliasing and then the variable becomes a gimple register." If we set SSA_NAME_DEF_FOR_STMT during inserts, and clear it during bsi_remove, does that resolve the issues you are referring to? Im simply trying to have a maintenance free mechanism for handling releasing ssa_names that doesn't involve having to find all the locations where they are free and calling a routine to free them. That is undesirable. We originally wanted to be able to just free them, but ran into some issues that couldn't be resolved at the time. I believe those problems can now be resolved. We had lazy updating of statements back then as well which made doing this fix during inserts impossible. That restriction is no longer present either. (except in DOM... it has a hacked up loop to allow lazy updating until it is fixed. I dont know if there is an issue there or not. The DOM fixup loop might also have to set SSA_NAME_DEF_FOR_STMT if it is cleared on modified stmts, I'm not sure.
Subject: Re: SSA_NAMEs are not released after no longer being used. On Sep 19, 2005, at 12:33 PM, amacleod at redhat dot com wrote: > "And that will not work for the SSA_NAMEs used for aliasing and then > the > variable becomes a gimple register." > > If we set SSA_NAME_DEF_FOR_STMT during inserts, and clear it during > bsi_remove, > does that resolve the issues you are referring to? We don't call bsi_remove for those statements so SSA_NAME_DEF_FOR_STMT is always set to that statement even though the SSA_NAME is unused. The testcase (-O1 -fno-tree-fre) from my orginal email on the subject: int f(void) { int i; int *j = &i; i = 1; return *j; } SSA form right before .alias2: # i_4 = V_MUST_DEF <i_3>; i = tt_2; D.1274_5 = tt_2; return tt_2; After: i_1 = tt_2; D.1274_5 = tt_2; return tt_2; Note that i_4 is not freed and its SSA_NAME_DEF_FOR_STMT is NULLd. Thanks, Andrew Pinski
Do you mean SSA_NAME_DEF_FOR_STMT for i_4 would NOT be NULLed since we didnt call bsi_remove on it? if it is NULL, then it has no uses and we can simply remove it with the trip through the SSA_NAME table. If it isn't NULL is when we have the problem that needs resolving. The operand cache has a list of any virtual defs that are being thrown away after processing each statement, we might be able to catch them all there, I'd have to check it out.
Actually, it occurs to me that we might be able to make the entire SSA_NAME_DEF_STMT process completely transparent, including the setting of it. The operand cache knows whenever an SSA_NAME is added to any stmt in the IL, either real or virtual. It also knows when one is removed. Between passes would then be appropriate time to remove any which are no longer in the IL. This should resolve any issues with trying find the right places to set or reset SSA_NAME_DEF_STMT In theory. :-) I'll take a look at it shortly and see what happens.
I'm fine with the releasessaname.diff.txt you aren't doing anything different than we normally do now. I prefer this over adding a flag to bsi_remove for sure. I looked into an alternative which follows up on the thread we had going. A better longer term solution is to have it all taken care of automatically. I got most of the way through implementing the automatic setting and clearing of SSA_NAME_DEF_STMT as stmts are processed by build_stmt_operands(). That is the one place where we know precisely when a stmt has entered and exited the IL. Then between passes it is trivial to check if SSA_NAME_DEF_STMT is NULL and free the ssa-name. I had it mostly working, but the changes are pretty invasive as no one ever has to set or clear SSA_NAME_DEF_STMT any more, its always simply "right". Its too invasive for stage 3 thats for sure. I'll revisit it when we get back to stage 1 and test out performance and whether its really what we want to do.
Actually this can cause compile time problems even with checking disabled because there are some passes which loop through all SSA_NAMEs.
(In reply to comment #11) > I had it mostly working, but the changes are pretty invasive as no one ever has > to set or clear SSA_NAME_DEF_STMT any more, its always simply "right". Its too > invasive for stage 3 thats for sure. I'll revisit it when we get back to stage 1 > and test out performance and whether its really what we want to do. Any activity on this? I am gently smashing into this problem and need to decide whether to work around it permanently.
Confirmed. The dead stmts hanging off unreleased (ex-VOP) SSA_NAMEs are a major annoyance.
Re. Comment #14 -- Fixed on AIB?
Yes indeed.
Subject: Bug 23940 Author: rguenth Date: Fri Apr 3 10:24:28 2009 New Revision: 145494 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=145494 Log: 2009-04-03 Richard Guenther <rguenther@suse.de> PR middle-end/13146 PR tree-optimization/23940 PR tree-optimization/33237 PR middle-end/33974 PR middle-end/34093 PR tree-optimization/36201 PR tree-optimization/36230 PR tree-optimization/38049 PR tree-optimization/38207 PR tree-optimization/38230 PR tree-optimization/38301 PR tree-optimization/38585 PR middle-end/38895 PR tree-optimization/38985 PR tree-optimization/39299 * tree-ssa-structalias.h: Remove. * tree-ssa-operands.h (NULL_USE_OPERAND_P): Make of type use_operand_p. (NULL_DEF_OPERAND_P): Make of type def_operand_p. (struct vuse_element_d): Remove. (struct vuse_vec_d): Likewise. (VUSE_VECT_NUM_ELEM, VUSE_VECT_ELEMENT_NC, VUSE_ELEMENT_PTR_NC, VUSE_ELEMENT_VAR_NC, VUSE_VECT_ELEMENT, VUSE_ELEMENT_PTR, SET_VUSE_VECT_ELEMENT, SET_VUSE_ELEMENT_VAR, SET_VUSE_ELEMENT_PTR, VUSE_ELEMENT_VAR): Likewise. (struct voptype_d): Likewise. (NUM_VOP_FREE_BUCKETS): Likewise. (struct ssa_operands): Remove vop_free_buckets and mpt_table fields. (struct stmt_operands_d): Remove. (VUSE_OP_PTR, VUSE_OP, SET_VUSE_OP, VUSE_NUM, VUSE_VECT, VDEF_RESULT_PTR, VDEF_RESULT, VDEF_OP_PTR, VDEF_OP, SET_VDEF_OP, VDEF_NUM, VDEF_VECT): Likewise. (copy_virtual_operands): Remove. (operand_build_cmp): Likewise. (create_ssa_artificial_load_stmt): Likewise. (enum ssa_op_iter_type): Remove ssa_op_iter_vdef. (struct ssa_operand_iterator_d): Remove vuses, vdefs, mayusesm vuse_index and mayuse_index members. Pack and move done and iter_type members to the front. (SSA_OP_VMAYUSE): Remove. (SSA_OP_VIRTUAL_USES): Adjust. (FOR_EACH_SSA_VDEF_OPERAND): Remove. (unlink_stmt_vdef): Declare. (add_to_addressable_set): Remove. * tree-vrp.c (stmt_interesting_for_vrp): Adjust. (vrp_visit_stmt): Likewise. * doc/tree-ssa.texi (Alias analysis): Update. * doc/invoke.texi (max-aliased-vops): Remove docs. (avg-aliased-vops): Likewise. * tree-into-ssa.c (syms_to_rename): Remove. (need_to_update_vops_p): Likewise. (need_to_initialize_update_ssa_p): Rename to ... (update_ssa_initialized_fn): ... this. Track function we are initialized for. (symbol_marked_for_renaming): Simplify. (add_new_name_mapping): Do not set need_to_update_vops_p. (dump_currdefs): Use SYMS_TO_RENAME. (rewrite_update_stmt): Always walk all uses/defs. (dump_update_ssa): Adjust. (init_update_ssa): Take function argument. Track what we are initialized for. (delete_update_ssa): Reset SYMS_TO_RENAME and update_ssa_initialized_fn. (create_new_def_for): Initialize for cfun, assert we are initialized for cfun. (mark_sym_for_renaming): Simplify. (mark_set_for_renaming): Do not initialize update-ssa. (need_ssa_update_p): Simplify. Take function argument. (name_mappings_registered_p): Assert we ask for the correct function. (name_registered_for_update_p): Likewise. (ssa_names_to_replace): Likewise. (release_ssa_name_after_update_ssa): Likewise. (update_ssa): Likewise. Use SYMS_TO_RENAME. (dump_decl_set): Do not print a newline. (debug_decl_set): Do it here. (dump_update_ssa): And here. * tree-ssa-loop-im.c (move_computations): Adjust. (movement_possibility): Likewise. (determine_max_movement): Likewise. (gather_mem_refs_stmt): Likewise. * tree-dump.c (dequeue_and_dump): Do not handle SYMBOL_MEMORY_TAG or NAME_MEMORY_TAG. * tree-complex.c (update_all_vops): Remove. (expand_complex_move): Adjust. * tree-ssa-loop-niter.c (chain_of_csts_start): Use NULL_TREE. Simplify test for memory referencing statement. Exclude non-invariant ADDR_EXPRs. * tree-pretty-print.c (dump_generic_node): Do not handle memory tags. * tree-loop-distribution.c (generate_memset_zero): Adjust. (rdg_flag_uses): Likewise. * tree-tailcall.c (suitable_for_tail_opt_p): Remove memory-tag related code. (tree_optimize_tail_calls_1): Also split the edge from the entry block if we have degenerate PHI nodes in the first basic block. * tree.c (init_ttree): Remove memory-tag related code. (tree_code_size): Likewise. (tree_node_structure): Likewise. (build7_stat): Re-write to be build6_stat. * tree.h (MTAG_P, TREE_MEMORY_TAG_CHECK, TMR_TAG): Remove. (SSA_VAR_P): Adjust. (struct tree_memory_tag): Remove. (struct tree_memory_partition_tag): Likewise. (union tree_node): Adjust. (build7): Re-write to be build6. * tree-pass.h (pass_reset_cc_flags): Remove. (TODO_update_address_taken): New flag. (pass_simple_dse): Remove. * ipa-cp.c (ipcp_update_callgraph): Update SSA form. * params.h (MAX_ALIASED_VOPS): Remove. (AVG_ALIASED_VOPS): Likewise. * omp-low.c (expand_omp_taskreg): Update SSA form. * tree-ssa-dse.c (dse_optimize_stmt): Properly query if the rhs aliases the lhs in a copy stmt. * tree-ssa-dse.c (struct address_walk_data): Remove. (memory_ssa_name_same): Likewise. (memory_address_same): Likewise. (get_kill_of_stmt_lhs): Likewise. (dse_possible_dead_store_p): Simplify, use the oracle. Handle unused stores. Look through PHI nodes into post-dominated regions. (dse_optimize_stmt): Simplify. Properly remove stores. (tree_ssa_dse): Compute dominators. (execute_simple_dse): Remove. (pass_simple_dse): Likewise. * ipa-reference.c (scan_stmt_for_static_refs): Open-code gimple_loaded_syms and gimple_stored_syms computation. * toplev.c (dump_memory_report): Dump alias and pta stats. * tree-ssa-sccvn.c (vn_reference_compute_hash): Simplify. (vn_reference_eq): Likewise. (vuses_to_vec, copy_vuses_from_stmt, vdefs_to_vec, copy_vdefs_from_stmt, shared_lookup_vops, shared_vuses_from_stmt, valueize_vuses): Remove. (get_def_ref_stmt_vuses): Simplify. Rename to ... (get_def_ref_stmt_vuse): ... this. (vn_reference_lookup_2): New function. (vn_reference_lookup_pieces): Use walk_non_aliased_vuses for walking equivalent vuses. Simplify. (vn_reference_lookup): Likewise. (vn_reference_insert): Likewise. (vn_reference_insert_pieces): Likewise. (visit_reference_op_call): Simplify. (visit_reference_op_load): Likewise. (visit_reference_op_store): Likewise. (init_scc_vn): Remove shared_lookup_vuses initialization. (free_scc_vn): Remove shared_lookup_vuses freeing. (sort_vuses, sort_vuses_heap): Remove. (get_ref_from_reference_ops): Export. * tree-ssa-sccvn.h (struct vn_reference_s): Replace vuses vector with single vuse pointer. (vn_reference_lookup_pieces, vn_reference_lookup, vn_reference_insert, vn_reference_insert_pieces): Adjust prototypes. (shared_vuses_from_stmt): Remove. (get_ref_from_reference_ops): Declare. * tree-ssa-loop-manip.c (slpeel_can_duplicate_loop_p): Adjust. * tree-ssa-copyrename.c (copy_rename_partition_coalesce): Remove memory-tag related code. * tree-ssa-ccp.c (get_symbol_constant_value): Remove memory-tag code. (likely_value): Add comment, skip static-chain of call statements. (surely_varying_stmt_p): Adjust. (gimplify_and_update_call_from_tree): Likewise. (execute_fold_all_builtins): Do not rebuild alias info. (gimplify_and_update_call_from_tree): Properly update VOPs. * tree-ssa-loop-ivopts.c (get_ref_tag): Remove. (copy_ref_info): Remove memory-tag related code. * tree-call-cdce.c (tree_call_cdce): Rename the VOP. * ipa-pure-const.c (check_decl): Remove memory-tag related code. (check_stmt): Open-code gimple_loaded_syms and gimple_stored_syms computation. * tree-ssa-dom.c (gimple_p): Remove typedef. (eliminate_redundant_computations): Adjust. (record_equivalences_from_stmt): Likewise. (avail_expr_hash): Likewise. (avail_expr_eq): Likewise. * tree-ssa-propagate.c (update_call_from_tree): Properly update VOPs. (stmt_makes_single_load): Likewise. (stmt_makes_single_store): Likewise. * tree-ssa-alias.c: Rewrite completely. (debug_memory_partitions, dump_mem_ref_stats, debug_mem_ref_stats, debug_mem_sym_stats, dump_mem_sym_stats_for_var, debug_all_mem_sym_stats, debug_mp_info, update_mem_sym_stats_from_stmt, delete_mem_ref_stats, create_tag_raw, dump_points_to_info, dump_may_aliases_for, debug_may_aliases_for, new_type_alias): Remove public functions. (pass_reset_cc_flags): Remove. (pass_build_alias): Move ... * tree-ssa-structalias.c (pass_build_alias): ... here. * tree-ssa-alias.c (may_be_aliased): Move ... * tree-flow-inline.h (may_be_aliased): ... here. tree-ssa-alias.c (struct count_ptr_d, count_ptr_derefs, count_uses_and_derefs): Move ... * gimple.c: ... here. * gimple.h (count_uses_and_derefs): Declare. * tree-ssa-alias.c (dump_alias_stats, ptr_deref_may_alias_global_p, ptr_deref_may_alias_decl_p, ptr_derefs_may_alias_p, same_type_for_tbaa, nonaliasing_component_refs_p, decl_refs_may_alias_p, indirect_ref_may_alias_decl_p, indirect_refs_may_alias_p, ref_maybe_used_by_call_p, ref_maybe_used_by_stmt_p, call_may_clobber_ref_p, stmt_may_clobber_ref_p, maybe_skip_until, get_continuation_for_phi, walk_non_aliased_vuses, walk_aliased_vdefs): New functions. * tree-dfa.c (refs_may_alias_p): Move ... * tree-ssa-alias.c (refs_may_alias_p): ... here. Extend. * tree-ssa-alias.h: New file. * tree-ssa-sink.c (is_hidden_global_store): Adjust. (statement_sink_location): Likewise. * opts.c (decode_options): Do not adjust max-aliased-vops or avg-aliased-vops values. * timevar.def (TV_TREE_MAY_ALIAS): Remove. (TV_CALL_CLOBBER): Likewise. (TV_FLOW_SENSITIVE): Likewise. (TV_FLOW_INSENSITIVE): Likewise. (TV_MEMORY_PARTITIONING): Likewise. (TV_ALIAS_STMT_WALK): New timevar. * tree-ssa-loop-ivcanon.c (empty_loop_p): Adjust. * tree-ssa-address.c (create_mem_ref_raw): Use build6. (get_address_description): Remove memory-tag related code. * tree-ssa-ifcombine.c (bb_no_side_effects_p): Adjust. * treestruct.def (TS_MEMORY_TAG, TS_MEMORY_PARTITION_TAG): Remove. * tree-eh.c (cleanup_empty_eh): Do not leave stale SSA_NAMEs and immediate uses in statements. Document. * gimple-pretty-print.c (dump_gimple_mem_ops): Adjust. (dump_symbols): Remove. (dump_gimple_mem_ops): Do not dump loaded or stored syms. * alias.c (get_deref_alias_set): New function split out from ... (get_alias_set): ... here. * alias.h (get_deref_alias_set): Declare. * tree-vect-data-refs.c (vect_create_data_ref_ptr): Remove unused type parameter. Remove restrict pointer handling. Create a ref-all pointer in case type-based alias sets do not conflict. (vect_analyze_data_refs): Remove SMT related code. * tree-vect-stmts.c (vectorizable_store): Re-instantiate TBAA assert. (vectorizable_load): Likewise. * tree-data-ref.h (struct dr_alias): Remove symbol_tag field. (DR_SYMBOL_TAG, DR_VOPS): Remove. * tree-data-ref.c (dr_may_alias_p): Use the alias-oracle. Ignore vops and SMTs. (dr_analyze_alias): Likewise.. (free_data_ref): Likewise. (create_data_ref): Likewise. (analyze_all_data_dependences): Likewise. (get_references_in_stmt): Adjust. * tree-flow-inline.h (gimple_aliases_computed_p, gimple_addressable_vars, gimple_call_clobbered_vars, gimple_call_used_vars, gimple_global_var, may_aliases, memory_partition, factoring_name_p, mark_call_clobbered, clear_call_clobbered, compare_ssa_operands_equal, symbol_mem_tag, set_symbol_mem_tag, gimple_mem_ref_stats): Remove. (gimple_vop): New function. (op_iter_next_use): Remove vuses and mayuses cases. (op_iter_next_def): Remove vdefs case. (op_iter_next_tree): Remove vuses, mayuses and vdefs cases. (clear_and_done_ssa_iter): Do not set removed fields. (op_iter_init): Likewise. Skip vuse and/or vdef if requested. Assert we are not iterating over vuses or vdefs if not also iterating over uses or defs. (op_iter_init_use): Likewise. (op_iter_init_def): Likewise. (op_iter_next_vdef): Remove. (op_iter_next_mustdef): Likewise. (op_iter_init_vdef): Likewise. (compare_ssa_operands_equal): Likewise. (link_use_stmts_after): Handle vuse operand. (is_call_used): Use is_call_clobbered. (is_call_clobbered): Global variables are always call clobbered, query the call-clobbers bitmap. (mark_call_clobbered): Ignore global variables. (clear_call_clobbered): Likewise. * tree-ssa-coalesce.c (create_outofssa_var_map): Adjust virtual operands sanity check. * tree.def (NAME_MEMORY_TAG, SYMBOL_MEMORY_TAG, MEMORY_PARTITION_TAG): Remove. (TARGET_MEM_REF): Remove TMR_TAG operand. * tree-dfa.c (add_referenced_var): Initialize call-clobber state. Remove call-clobber related code. (remove_referenced_var): Likewise. Do not clear mpt or symbol_mem_tag. (dump_variable): Do not dump SMTs, memory stats, may-aliases or partitions or escape reason. (get_single_def_stmt, get_single_def_stmt_from_phi, get_single_def_stmt_with_phi): Remove. (dump_referenced_vars): Tidy. (get_ref_base_and_extent): Allow bare decls. (collect_dfa_stats): Adjust. * graphite.c (rename_variables_in_stmt): Adjust. (graphite_copy_stmts_from_block): Likewise. (translate_clast): Likewise. * tree-ssa-pre.c (struct bb_bitmap_sets): Add expr_dies bitmap. (EXPR_DIES): New. (translate_vuse_through_block): Use the oracle. (phi_translate_1): Adjust. (value_dies_in_block_x): Use the oracle. Cache the outcome in EXPR_DIES. (valid_in_sets): Check if the VUSE for a REFERENCE is available. (eliminate): Do not remove stmts during elimination, instead queue and remove them afterwards. (do_pre): Do not rebuild alias info. (pass_pre): Run TODO_rebuild_alias before PRE. * tree-ssa-live.c (remove_unused_locals): Remove memory-tag code. * tree-sra.c (sra_walk_function): Use gimple_references_memory_p. (mark_all_v_defs_stmt): Remove. (mark_all_v_defs_seq): Adjust. (sra_replace): Likewise. (scalarize_use): Likewise. (scalarize_copy): Likewise. (scalarize_init): Likewise. (scalarize_ldst): Likewise. (todoflags): Remove. (tree_sra): Do not rebuild alias info. (tree_sra_early): Adjust. (pass_sra): Run TODO_update_address_taken before SRA. * tree-predcom.c (set_alias_info): Remove. (prepare_initializers_chain): Do not call it. (mark_virtual_ops_for_renaming): Adjust. (mark_virtual_ops_for_renaming_list): Remove. (initialize_root_vars): Adjust. (initialize_root_vars_lm): Likewise. (prepare_initializers_chain): Likewise. * tree-ssa-copy.c (may_propagate_copy): Remove memory-tag related code. (may_propagate_copy_into_stmt): Likewise. (merge_alias_info): Do nothing for now. (propagate_tree_value_into_stmt): Adjust. (stmt_may_generate_copy): Likewise. * tree-ssa-forwprop.c (tidy_after_forward_propagate_addr): Do not mark symbols for renaming. (forward_propagate_addr_expr): Match up push/pop_stmt_changes with the same statement, make sure to update the new pointed-to one. * tree-ssa-dce.c (eliminate_unnecessary_stmts): Do not copy call statements, do not mark symbols for renaming. (mark_operand_necessary): Dump something. (ref_may_be_aliased): New function. (mark_aliased_reaching_defs_necessary_1): New helper function. (mark_aliased_reaching_defs_necessary): Likewise. (mark_all_reaching_defs_necessary_1): Likewise. (mark_all_reaching_defs_necessary): Likewise. (propagate_necessity): Do not process virtual PHIs. For non-aliased loads mark all reaching definitions as necessary. For aliased loads and stores mark the immediate dominating aliased clobbers as necessary. (visited): New global static. (perform_tree_ssa_dce): Free visited bitmap after propagating necessity. (remove_dead_phis): Perform simple dead virtual PHI removal. (remove_dead_stmt): Properly unlink virtual operands when removing stores. (eliminate_unnecessary_stmts): Schedule PHI removal after stmt removal. * tree-ssa-ter.c (is_replaceable_p): Adjust. (process_replaceable): Likewise. (find_replaceable_in_bb): Likewise. * tree-ssa.c (verify_ssa_name): Verify all VOPs are based on the single gimple vop. (verify_flow_insensitive_alias_info): Remove. (verify_flow_sensitive_alias_info): Likewise. (verify_call_clobbering): Likewise. (verify_memory_partitions): Likewise. (verify_alias_info): Likewise. (verify_ssa): Adjust.. (execute_update_addresses_taken): Export. Update SSA manually. Optimize only when optimizing. Use a local bitmap. (pass_update_address_taken): Remove TODO_update_ssa, add TODO_dump_func. (pass_update_address_taken): Just use TODO_update_address_taken. (init_tree_ssa): Do not initialize addressable_vars. (verify_ssa): Verify new VUSE / VDEF properties. Verify that all stmts definitions have the stmt as SSA_NAME_DEF_STMT. Do not call verify_alias_info. (delete_tree_ssa): Clear the VUSE, VDEF operands. Do not free the loaded and stored syms bitmaps. Reset the escaped and callused solutions. Do not free addressable_vars. Remove memory-tag related code. (warn_uninitialized_var): Aliases are always available. * tree-ssa-loop-prefetch.c (gather_memory_references): Adjust. * lambda-code.c (can_put_in_inner_loop): Adjust. (can_put_after_inner_loop): Likewise. (perfect_nestify): Likewise. * tree-vect-stmts.c (vect_stmt_relevant_p): Adjust. (vect_gen_widened_results_half): Remove CALL_EXPR handling. (vectorizable_conversion): Do not mark symbols for renaming. * tree-inline.c (remap_gimple_stmt): Clear VUSE/VDEF. (expand_call_inline): Unlink the calls virtual operands before replacing it. (tree_function_versioning): Do not call update_ssa if we are not updating clones. Simplify. * tree-ssa-phiprop.c (phivn_valid_p): Adjust. (propagate_with_phi): Likewise.. * tree-outof-ssa.c (create_temp): Remove memory tag and call clobber code. Assert we are not aliased or global. * tree-flow.h: Include tree-ssa-alias.h (enum escape_type): Remove. (struct mem_sym_stats_d): Likewise. (struct mem_ref_stats_d): Likewise. (struct gimple_df): Add vop member. Remove global_var, call_clobbered_vars, call_used_vars, addressable_vars, aliases_compted_p and mem_ref_stats members. Add syms_to_rename, escaped and callused members. (struct ptr_info_def): Remove all members, add points-to solution member pt. (struct var_ann_d): Remove in_vuse_list, in_vdef_list, call_clobbered, escape_mask, mpt and symbol_mem_tag members. * Makefile.in (TREE_FLOW_H): Add tree-ssa-alias.h. (tree-ssa-structalias.o): Remove tree-ssa-structalias.h. (tree-ssa-alias.o): Likewise. (toplev.o): Add tree-ssa-alias.h (GTFILES): Remove tree-ssa-structalias.h, add tree-ssa-alias.h. * gimple.c (gimple_set_bb): Fix off-by-one error. (is_gimple_reg): Do not handle memory tags. (gimple_copy): Also copy virtual operands. Delay updating the statement. Do not reset loaded and stored syms. (gimple_set_stored_syms): Remove. (gimple_set_loaded_syms): Likewise. (gimple_call_copy_skip_args): Copy the virtual operands and mark the new statement modified. * tree-ssa-structalias.c (may_alias_p): Remove. (set_uids_in_ptset): Take the alias set to prune with as parameter. Fold in the alias test of may_alias_p. (compute_points_to_sets): Compute whether a ptr is dereferenced in a local sbitmap. (process_constraint): Deal with &ANYTHING on the lhs, reject all other ADDRESSOF constraints on the lhs. (get_constraint_for_component_ref): Assert that we don't get ADDRESSOF constraints from the base of the reference. Properly generate UNKNOWN_OFFSET for DEREF if needed. (struct variable_info): Remove collapsed_to member. (get_varinfo_fc): Remove. (new_var_info): Do not set collapsed_to. (dump_constraint): Do not follow cycles. (dump_constraint_graph): Likewise. (build_pred_graph): Likewise. (build_succ_graph): Likewise. (rewrite_constraints): Likewise. (do_simple_structure_copy): Remove. (do_rhs_deref_structure_copy): Remove. (do_lhs_deref_structure_copy): Remove. (collapse_rest_of_var): Remove. (do_structure_copy): Re-implement. (pta_stats): New global variable. (dump_pta_stats): New function. (struct constraint_expr): Make offset signed. (UNKNOWN_OFFSET): Define special value. (dump_constraint): Dump UNKNOWN_OFFSET as UNKNOWN. (solution_set_expand): New helper function split out from ... (do_sd_constraint): ... here. (solution_set_add): Handle UNKNOWN_OFFSET. Handle negative offsets. (do_ds_constraint): Likewise. (do_sd_constraint): Likewise. Do not special-case ESCAPED = *ESCAPED and CALLUSED = *CALLUSED. (set_union_with_increment): Make inc argument signed. (type_safe): Remove. (get_constraint_for_ptr_offset): Handle unknown and negative constant offsets. (first_vi_for_offset): Handle offsets before start. Bail out early for offsets beyond the variable extent. (first_or_preceding_vi_for_offset): New function. (init_base_vars): Add ESCAPED = ESCAPED + UNKNOWN_OFFSET constraint. Together with ESCAPED = *ESCAPED this properly computes reachability. (find_what_var_points_to): New function. (find_what_p_points_to): Implement in terms of find_what_var_points_to. (pt_solution_reset, pt_solution_empty_p, pt_solution_includes_global, pt_solution_includes_1, pt_solution_includes, pt_solutions_intersect_1, pt_solutions_intersect): New functions. (compute_call_used_vars): Remove. (compute_may_aliases): New main entry into PTA computation. * gimple.h (gimple_p): New typedef. (struct gimple_statement_base): Remove references_memory_p. (struct gimple_statement_with_memory_ops_base): Remove vdef_ops, vuse_ops, stores and loads members. Add vdef and vuse members. (gimple_vuse_ops, gimple_set_vuse_ops, gimple_vdef_ops, gimple_set_vdef_ops, gimple_loaded_syms, gimple_stored_syms, gimple_set_references_memory): Remove. (gimple_vuse_op, gimple_vdef_op, gimple_vuse, gimple_vdef, gimple_vuse_ptr, gimple_vdef_ptri, gimple_set_vuse, gimple_set_vdef): New functions. * tree-cfg.c (move_block_to_fn): Fix off-by-one error. (verify_expr): Allow RESULT_DECL. (gimple_duplicate_bb): Do not copy virtual operands. (gimple_duplicate_sese_region): Adjust. (gimple_duplicate_sese_tail): Likewise. (mark_virtual_ops_in_region): Remove. (move_sese_region_to_fn): Do not call it. * passes.c (init_optimization_passes): Remove pass_reset_cc_flags and pass_simple_dse. (execute_function_todo): Handle TODO_update_address_taken, call execute_update_addresses_taken for TODO_rebuild_alias. (execute_todo): Adjust. (execute_one_pass): Init dump files early. * ipa-struct-reorg.c (finalize_var_creation): Do not mark vars call-clobbered. (create_general_new_stmt): Clear vops. * tree-ssa-reassoc.c (get_rank): Adjust. * tree-vect-slp.c (vect_create_mask_and_perm): Do not mark symbols for renaming. * params.def (PARAM_MAX_ALIASED_VOPS): Remove. (PARAM_AVG_ALIASED_VOPS): Likewise. * tree-ssanames.c (init_ssanames): Allocate SYMS_TO_RENAME. (duplicate_ssa_name_ptr_info): No need to copy the shared bitmaps. * tree-ssa-operands.c: Simplify for new virtual operand representation. (operand_build_cmp, copy_virtual_operands, create_ssa_artificial_load_stmt, add_to_addressable_set, gimple_add_to_addresses_taken): Remove public functions. (unlink_stmt_vdef): New function. * gcc.dg/pr19633-1.c: Adjust. * gcc.dg/torture/pta-callused-1.c: Likewise. * gcc.dg/torture/pr39074-2.c: Likewise. * gcc.dg/torture/pr39074.c: Likewise. * gcc.dg/torture/pta-ptrarith-3.c: New testcase. * gcc.dg/torture/pr30375.c: Adjust. * gcc.dg/torture/pr33563.c: Likewise. * gcc.dg/torture/pr33870.c: Likewise. * gcc.dg/torture/pr33560.c: Likewise. * gcc.dg/torture/pta-structcopy-1.c: New testcase. * gcc.dg/torture/ssa-pta-fn-1.c: Likewise. * gcc.dg/tree-ssa/alias-15.c: Remove. * gcc.dg/tree-ssa/ssa-dce-4.c: New testcase. * gcc.dg/tree-ssa/pr26421.c: Adjust. * gcc.dg/tree-ssa/ssa-fre-10.c: XFAIL. * gcc.dg/tree-ssa/ssa-dce-5.c: New testcase. * gcc.dg/tree-ssa/pr23382.c: Adjust. * gcc.dg/tree-ssa/ssa-fre-20.c: New testcase. * gcc.dg/tree-ssa/alias-16.c: Adjust. * gcc.dg/tree-ssa/ssa-fre-13.c: Likewise. * gcc.dg/tree-ssa/ssa-fre-14.c: Likewise. * gcc.dg/tree-ssa/alias-18.c: Likewise. * gcc.dg/tree-ssa/ssa-fre-15.c: Likewise. * gcc.dg/tree-ssa/ssa-lim-3.c: Likewise. * gcc.dg/tree-ssa/alias-19.c: Likewise. * gcc.dg/tree-ssa/pta-ptrarith-1.c: New testcase. * gcc.dg/tree-ssa/pr13146.c: Likewise. * gcc.dg/tree-ssa/ssa-pre-23.c: Likewise. * gcc.dg/tree-ssa/pta-ptrarith-2.c: Likewise. * gcc.dg/tree-ssa/ssa-fre-18.c: Likewise. * gcc.dg/tree-ssa/ssa-pre-24.c: New XFAILed testcase. * gcc.dg/tree-ssa/ssa-fre-19.c: New testcase. * gcc.dg/tree-ssa/alias-20.c: Likewise. * gcc.dg/tree-ssa/ssa-dse-12.c: Likewise. * gcc.dg/tree-ssa/pr38895.c: Likewise. * gcc.dg/uninit-B.c: XFAIL. * gcc.dg/vect/no-vfa-vect-43.c: Adjust. * gcc.dg/uninit-pr19430.c: XFAIL. * g++.dg/tree-ssa/pr13146.C: New testcase. * g++.dg/opt/pr36187.C: Adjust. * g++.dg/torture/20090329-1.C: New testcase. Added: trunk/gcc/testsuite/g++.dg/torture/20090329-1.C - copied unchanged from r145492, branches/alias-improvements/gcc/testsuite/g++.dg/torture/20090329-1.C trunk/gcc/testsuite/g++.dg/tree-ssa/pr13146.C - copied unchanged from r145492, branches/alias-improvements/gcc/testsuite/g++.dg/tree-ssa/pr13146.C trunk/gcc/testsuite/gcc.dg/torture/pta-ptrarith-3.c - copied unchanged from r145492, branches/alias-improvements/gcc/testsuite/gcc.dg/torture/pta-ptrarith-3.c trunk/gcc/testsuite/gcc.dg/torture/pta-structcopy-1.c - copied unchanged from r145492, branches/alias-improvements/gcc/testsuite/gcc.dg/torture/pta-structcopy-1.c trunk/gcc/testsuite/gcc.dg/torture/ssa-pta-fn-1.c - copied unchanged from r145492, branches/alias-improvements/gcc/testsuite/gcc.dg/torture/ssa-pta-fn-1.c trunk/gcc/testsuite/gcc.dg/tree-ssa/alias-20.c - copied unchanged from r145492, branches/alias-improvements/gcc/testsuite/gcc.dg/tree-ssa/alias-20.c trunk/gcc/testsuite/gcc.dg/tree-ssa/pr13146.c - copied unchanged from r145492, branches/alias-improvements/gcc/testsuite/gcc.dg/tree-ssa/pr13146.c trunk/gcc/testsuite/gcc.dg/tree-ssa/pr38895.c - copied unchanged from r145492, branches/alias-improvements/gcc/testsuite/gcc.dg/tree-ssa/pr38895.c trunk/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-1.c - copied unchanged from r145492, branches/alias-improvements/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-1.c trunk/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-2.c - copied unchanged from r145492, branches/alias-improvements/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-2.c trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-4.c - copied unchanged from r145492, branches/alias-improvements/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-4.c trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-5.c - copied unchanged from r145492, branches/alias-improvements/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-5.c trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-12.c - copied unchanged from r145492, branches/alias-improvements/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-12.c trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-18.c - copied unchanged from r145492, branches/alias-improvements/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-18.c trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-19.c - copied unchanged from r145492, branches/alias-improvements/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-19.c trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-20.c - copied unchanged from r145492, branches/alias-improvements/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-20.c trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-23.c - copied unchanged from r145492, branches/alias-improvements/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-23.c trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-24.c - copied unchanged from r145492, branches/alias-improvements/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-24.c trunk/gcc/tree-ssa-alias.h - copied unchanged from r145492, branches/alias-improvements/gcc/tree-ssa-alias.h Removed: trunk/gcc/testsuite/gcc.dg/tree-ssa/alias-15.c trunk/gcc/tree-ssa-structalias.h Modified: trunk/gcc/ChangeLog trunk/gcc/Makefile.in trunk/gcc/alias.c trunk/gcc/alias.h trunk/gcc/doc/invoke.texi trunk/gcc/doc/tree-ssa.texi trunk/gcc/gimple-pretty-print.c trunk/gcc/gimple.c trunk/gcc/gimple.h trunk/gcc/graphite.c trunk/gcc/ipa-cp.c trunk/gcc/ipa-pure-const.c trunk/gcc/ipa-reference.c trunk/gcc/ipa-struct-reorg.c trunk/gcc/lambda-code.c trunk/gcc/omp-low.c trunk/gcc/opts.c trunk/gcc/params.def trunk/gcc/params.h trunk/gcc/passes.c trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/g++.dg/opt/pr36187.C trunk/gcc/testsuite/gcc.dg/pr19633-1.c trunk/gcc/testsuite/gcc.dg/torture/pr30375.c trunk/gcc/testsuite/gcc.dg/torture/pr33560.c trunk/gcc/testsuite/gcc.dg/torture/pr33563.c trunk/gcc/testsuite/gcc.dg/torture/pr33870.c trunk/gcc/testsuite/gcc.dg/torture/pr39074-2.c trunk/gcc/testsuite/gcc.dg/torture/pr39074.c trunk/gcc/testsuite/gcc.dg/torture/pta-callused-1.c trunk/gcc/testsuite/gcc.dg/tree-ssa/alias-16.c trunk/gcc/testsuite/gcc.dg/tree-ssa/alias-18.c trunk/gcc/testsuite/gcc.dg/tree-ssa/alias-19.c trunk/gcc/testsuite/gcc.dg/tree-ssa/pr23382.c trunk/gcc/testsuite/gcc.dg/tree-ssa/pr26421.c trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-10.c trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-13.c trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-14.c trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-15.c trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-3.c trunk/gcc/testsuite/gcc.dg/uninit-B.c trunk/gcc/testsuite/gcc.dg/uninit-pr19430.c trunk/gcc/testsuite/gcc.dg/vect/no-vfa-vect-43.c trunk/gcc/timevar.def trunk/gcc/toplev.c trunk/gcc/tree-call-cdce.c trunk/gcc/tree-cfg.c trunk/gcc/tree-complex.c trunk/gcc/tree-data-ref.c trunk/gcc/tree-data-ref.h trunk/gcc/tree-dfa.c trunk/gcc/tree-dump.c trunk/gcc/tree-eh.c trunk/gcc/tree-flow-inline.h trunk/gcc/tree-flow.h trunk/gcc/tree-inline.c trunk/gcc/tree-into-ssa.c trunk/gcc/tree-loop-distribution.c trunk/gcc/tree-outof-ssa.c trunk/gcc/tree-pass.h trunk/gcc/tree-predcom.c trunk/gcc/tree-pretty-print.c trunk/gcc/tree-sra.c trunk/gcc/tree-ssa-address.c trunk/gcc/tree-ssa-alias.c trunk/gcc/tree-ssa-ccp.c trunk/gcc/tree-ssa-coalesce.c trunk/gcc/tree-ssa-copy.c trunk/gcc/tree-ssa-copyrename.c trunk/gcc/tree-ssa-dce.c trunk/gcc/tree-ssa-dom.c trunk/gcc/tree-ssa-dse.c trunk/gcc/tree-ssa-forwprop.c trunk/gcc/tree-ssa-ifcombine.c trunk/gcc/tree-ssa-live.c trunk/gcc/tree-ssa-loop-im.c trunk/gcc/tree-ssa-loop-ivcanon.c trunk/gcc/tree-ssa-loop-ivopts.c trunk/gcc/tree-ssa-loop-niter.c trunk/gcc/tree-ssa-loop-prefetch.c trunk/gcc/tree-ssa-operands.c trunk/gcc/tree-ssa-operands.h trunk/gcc/tree-ssa-phiprop.c trunk/gcc/tree-ssa-pre.c trunk/gcc/tree-ssa-propagate.c trunk/gcc/tree-ssa-reassoc.c trunk/gcc/tree-ssa-sccvn.c trunk/gcc/tree-ssa-sccvn.h trunk/gcc/tree-ssa-sink.c trunk/gcc/tree-ssa-structalias.c trunk/gcc/tree-ssa-ter.c trunk/gcc/tree-ssa.c trunk/gcc/tree-ssanames.c trunk/gcc/tree-tailcall.c trunk/gcc/tree-vect-data-refs.c trunk/gcc/tree-vect-loop-manip.c trunk/gcc/tree-vect-slp.c trunk/gcc/tree-vect-stmts.c trunk/gcc/tree-vectorizer.h trunk/gcc/tree-vrp.c trunk/gcc/tree.c trunk/gcc/tree.def trunk/gcc/tree.h trunk/gcc/treestruct.def
Fixed for 4.5.