On Thu, Nov 13, 2014 at 5:32 PM, Martin Jambor <mjam...@suse.cz> wrote: > Hi, > > this patch is that main part of the series, implementing propagation > of ipa_polymorphic_call_contexts. Although I tried to keep its size > checked, it is big because switching from binfos to contexts in ipa-cp > also requires changes in inlining heuristics. The patch also does not > do any speculative devirtualization as a part of ipa-cp, that is left > for later. > > Because contexts are more powerful and work also with multiple > inheritance, the type_preserved flag is no longer sufficient to guard > against dynamic type changes and so the appropriate checks were > changed to use the much more strict agg_preserved flag instead. > Alleviating such conservative treatment is also left fr future work. > As a consequence, I had to xfail a few testcases but I was able to > un-xfail one too. > > A very similar patch has passed bootstrap and testing on x86_64-linux, > testing of this exact one is under way. Honza has privately approved > the patch and asked me to commit it soon, so I will do that if this > testing turns out OK and after some additional tests on ppc64-aix and > 32bit i686-linux. > > Thanks, > > Martin > > > 2014-11-14 Martin Jambor <mjam...@suse.cz> > > * ipa-prop.h (ipa_get_jf_pass_through_type_preserved): use > agg_preserved flag instead. > (ipa_get_jf_ancestor_type_preserved): Likewise. > (ipa_node_params): Rename known_vals to known_csts, update all users. > New field known_contexts. > (ipa_get_indirect_edge_target): Update prototype. > (ipcp_poly_ctx_values_pool): Declare. > (ipa_context_from_jfunc): Likewise. > * ipa-inline.h (estimate_ipcp_clone_size_and_time): Updated prototype. > * cgraph.h (ipa_polymorphic_call_context): New method equal_to. New > parameter newline of method dump. > * ipa-cp.c (ctxlat): New field. > (ipcp_values_pool): Renamed to ipcp_cst_values_pool, updated all > users. > (ipcp_poly_ctx_values_pool):New variable. > (ipa_get_poly_ctx_lat): New function. > (print_ipcp_constant_value): New overloaded function for contexts. > (print_all_lattices): Also print contexts. > (ipa_topo_info): New field contexts; > (set_all_contains_variable): Also set the flag in the context lattice. > (initialize_node_lattices): Likewise for flag bottom. > (ipa_get_jf_ancestor_result): Removed BINFO handling. > (ipa_value_from_jfunc): Likewise. > (ipa_context_from_jfunc): New function. > (values_equal_for_ipcp_p): New overloaded function for contexts. > (allocate_and_init_ipcp_value): Construct the value. > (allocate_and_init_ipcp_value): New overloaded function for contexts. > (propagate_scalar_accross_jump_function): Removed handling of > KNOWN_TYPE jump functions. > (propagate_context_accross_jump_function): New function. > (propagate_constants_accross_call): Also propagate contexts. > (ipa_get_indirect_edge_target_1): Work on contexts rather than BINFOs. > (ipa_get_indirect_edge_target): Likewise. > (devirtualization_time_bonus): Likewise. > (gather_context_independent_values): Create and populate > known_contexts > vector rather than known_binfos. > (perform_estimation_of_a_value): Work on contexts rather than BINFOs. > (estimate_local_effects): Likewise. > (add_all_node_vals_to_toposort): Also add contexts to teir topological > sort. > (ipcp_propagate_stage): Also propagate effects of contexts. > (ipcp_discover_new_direct_edges): Receive and pass known_contexts to > ipa_get_indirect_edge_target_1. > (cgraph_edge_brings_value_p): New overloaded function for contexts. > (create_specialized_node): Work on contexts rather than BINFOs. > (find_more_contexts_for_caller_subset): New function. > (known_contexts_useful_p): New function. > (copy_useful_known_contexts): Likewise. > (modify_known_vectors_with_val): Likewise. > (ipcp_val_in_agg_replacements_p): Renamed to > ipcp_val_agg_replacement_ok_p, return true for all offset indicating > non-aggregate. > (ipcp_val_agg_replacement_ok_p): New overloaded function for contexts. > (decide_about_value): Work on contexts rather than BINFOs. > (decide_whether_version_node): Likewise. > (ipcp_driver): Initialize the new alloc pool. > * ipa-prop.c (ipa_print_node_jump_functions_for_edge): Prettify > printing of edge contexts. > (ipa_set_ancestor_jf): Replace assert with conditional setting of > type_preserved to false. > (update_jump_functions_after_inlining): Use access function instead of > reading agg_preserved directly. Store combined context in the > ancestor > case. > (try_make_edge_direct_virtual_call): Work on contexts rather than > BINFOs. > (update_indirect_edges_after_inlining): Get context from > ipa_context_from_jfunc. > (ipa_free_node_params_substructures): Free also known_contexts. > (ipa_free_all_structures_after_ipa_cp): Free the new alloc pool. > (ipa_free_all_structures_after_iinln): Likewise. > * ipa-inline-analysis.c (evaluate_properties_for_edge): Work on > contexts rather than BINFOs. > (estimate_edge_devirt_benefit): Likewise. > (estimate_edge_size_and_time): Likewise. > (estimate_calls_size_and_time): Likewise. > (estimate_node_size_and_time): Likewise. > (estimate_ipcp_clone_size_and_time): Likewise. > (do_estimate_edge_time): Likewise. > (do_estimate_edge_size): Likewise. > (do_estimate_edge_hints): Likewise. > * ipa-polymorphic-call.c (ipa_polymorphic_call_context::dump): New > parameter newline, ouput newline only when it is set. > (ipa_polymorphic_call_context::equal_to): New methods);
This caused: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64139 -- H.J.