042ae7d242
* cgraphbuild.c (cgraph_rebuild_references): Rebuild only non-speculative refs. * cgraph.c (cgraph_update_edge_in_call_site_hash): New function. (cgraph_add_edge_to_call_site_hash): Deal with speculative calls. (cgraph_set_call_stmt): Likewise. (cgraph_create_edge_1): Fix release checking compilatoin; clear lto_stmt_uid. (cgraph_free_edge): Free indirect info. (cgraph_turn_edge_to_speculative): New function. (cgraph_speculative_call_info): New function. (cgraph_make_edge_direct): Return direct edge; handle speculation. (cgraph_redirect_edge_call_stmt_to_callee): Expand speculative edges. (dump_cgraph_node): Dump speculation. (verify_edge_count_and_frequency): Accept speculative edges. (verify_edge_corresponds_to_fndecl): Handle partitioned cgraph. (verify_cgraph_node): Handle speculation. * cgraph.h (cgraph_edge): Add SPECULATIVE flag. (cgraph_set_call_stmt): Update prototype. (cgraph_make_edge_direct): Update prototype. (cgraph_speculative_call_info): Declare. * ipa-cp.c (ipcp_discover_new_direct_edges): Be ready for edge to change; update call of ipa_find_references. * ipa-ref.c (ipa_record_reference): Fix return value; clear lto_stmt_uid and speculative flags. (ipa_dump_references): Dump speculation. (ipa_clone_references): Clone speculative flag. (ipa_clone_referring): Likewise. (ipa_clone_ref): New function. (ipa_find_reference): Look into lto_stmt_uids (ipa_clear_stmts_in_references): Do not clear speculative calls. * ipa-ref.h (ipa_ref): Add lto_stmt_uid and speculative flags. (ipa_find_reference): Update declaration. (ipa_clone_ref): Declare. * lto-cgraph.c (lto_output_edge): Make lto_stmt_uids start from 0; stream speculative flag. (lto_output_ref): Stream statements uids and speculation. (input_ref): Likewise. (input_edge): Stream speuclation. * cgraphclones.c (cgraph_clone_edge): Clone speculation. (cgraph_set_call_stmt_including_clones): Handle speculation. * ipa-inline.c (heap_edge_removal_hook): New function. (inline_small_functions): Register it. * lto-streamer-in.c (fixup_call_stmt_edges_1): Bounds checking; also initialize refs. * ipa-prop.c (ipa_make_edge_direct_to_target): Be ready for edge to change. (try_make_edge_direct_simple_call): Likewise. (try_make_edge_direct_simple_call): Likewise. (update_indirect_edges_after_inlining): Likewise. (remove_described_reference): Look proper lto_stmt_uid. (propagate_controlled_uses): Likewise. (propagate_controlled_uses): Liekwise. * tree-inline.c (copy_bb): Copy speculative edges. (redirect_all_calls): New function. (copy_cfg_body): Do redirection after loop info is updated. (delete_unreachable_blocks_update_callgraph): Updadte speculation. From-SVN: r201632
82 lines
2.7 KiB
C
82 lines
2.7 KiB
C
/* IPA reference lists.
|
|
Copyright (C) 2010-2013 Free Software Foundation, Inc.
|
|
Contributed by Jan Hubicka
|
|
|
|
This file is part of GCC.
|
|
|
|
GCC is free software; you can redistribute it and/or modify it under
|
|
the terms of the GNU General Public License as published by the Free
|
|
Software Foundation; either version 3, or (at your option) any later
|
|
version.
|
|
|
|
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with GCC; see the file COPYING3. If not see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
struct cgraph_node;
|
|
struct varpool_node;
|
|
union symtab_node_def;
|
|
typedef union symtab_node_def *symtab_node;
|
|
typedef const union symtab_node_def *const_symtab_node;
|
|
|
|
|
|
/* How the reference is done. */
|
|
enum GTY(()) ipa_ref_use
|
|
{
|
|
IPA_REF_LOAD,
|
|
IPA_REF_STORE,
|
|
IPA_REF_ADDR,
|
|
IPA_REF_ALIAS
|
|
};
|
|
|
|
/* Record of reference in callgraph or varpool. */
|
|
struct GTY(()) ipa_ref
|
|
{
|
|
symtab_node referring;
|
|
symtab_node referred;
|
|
gimple stmt;
|
|
unsigned int lto_stmt_uid;
|
|
unsigned int referred_index;
|
|
ENUM_BITFIELD (ipa_ref_use) use:2;
|
|
unsigned int speculative:1;
|
|
};
|
|
|
|
typedef struct ipa_ref ipa_ref_t;
|
|
typedef struct ipa_ref *ipa_ref_ptr;
|
|
|
|
|
|
/* List of references. This is stored in both callgraph and varpool nodes. */
|
|
struct GTY(()) ipa_ref_list
|
|
{
|
|
/* Store actual references in references vector. */
|
|
vec<ipa_ref_t, va_gc> *references;
|
|
/* Referring is vector of pointers to references. It must not live in GGC space
|
|
or GGC will try to mark middle of references vectors. */
|
|
vec<ipa_ref_ptr> GTY((skip)) referring;
|
|
};
|
|
|
|
struct ipa_ref * ipa_record_reference (symtab_node,
|
|
symtab_node,
|
|
enum ipa_ref_use, gimple);
|
|
struct ipa_ref * ipa_maybe_record_reference (symtab_node, tree,
|
|
enum ipa_ref_use, gimple);
|
|
|
|
void ipa_remove_reference (struct ipa_ref *);
|
|
void ipa_remove_all_references (struct ipa_ref_list *);
|
|
void ipa_remove_all_referring (struct ipa_ref_list *);
|
|
void ipa_dump_references (FILE *, struct ipa_ref_list *);
|
|
void ipa_dump_referring (FILE *, struct ipa_ref_list *);
|
|
void ipa_clone_references (symtab_node, struct ipa_ref_list *);
|
|
void ipa_clone_referring (symtab_node, struct ipa_ref_list *);
|
|
struct ipa_ref * ipa_clone_ref (struct ipa_ref *, symtab_node, gimple);
|
|
bool ipa_ref_cannot_lead_to_return (struct ipa_ref *);
|
|
bool ipa_ref_has_aliases_p (struct ipa_ref_list *);
|
|
struct ipa_ref * ipa_find_reference (symtab_node, symtab_node, gimple, unsigned int);
|
|
void ipa_remove_stmt_references (symtab_node, gimple);
|
|
void ipa_clear_stmts_in_references (symtab_node);
|