This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix part of PR58712
- From: Markus Trippelsdorf <markus at trippelsdorf dot de>
- To: Richard Biener <richard dot guenther at gmail dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, Jan Hubicka <hubicka at ucw dot cz>
- Date: Fri, 18 Oct 2013 12:10:53 +0200
- Subject: Re: [PATCH] Fix part of PR58712
- Authentication-results: sourceware.org; auth=none
- References: <20131015103108 dot GA18500 at x4> <CAFiYyc2YomKCE1JZ8rs_KT8OB2FRDa1O+=x21CiZkbFiOxS6Nw at mail dot gmail dot com>
On 2013.10.15 at 12:49 +0200, Richard Biener wrote:
> On Tue, Oct 15, 2013 at 12:31 PM, Markus Trippelsdorf
> <markus@trippelsdorf.de> wrote:
> > Valgrind complains:
> > ==27870== Conditional jump or move depends on uninitialised value(s)
> > ==27870== at 0x557CDC: cgraph_create_edge_1(cgraph_node*, cgraph_node*, gimple_statement_d*, long, int) (cgraph.c:695)
> > ==27870== by 0x55882E: cgraph_create_edge(cgraph_node*, cgraph_node*, gimple_statement_d*, long, int) (cgraph.c:890)
> > ==27870== by 0x560891: cgraph_clone_edge(cgraph_edge*, cgraph_node*, gimple_statement_d*, unsigned int, long, int, bool) (cgraphclones.c:135)
> > ==27870== by 0x7F1F14: copy_body(copy_body_data*, long, int, basic_block_def*, basic_block_def*, basic_block_def*) (tree-inline.c:1741)
> > ...
> > ==27870== Uninitialised value was created by a client request
> > ==27870== at 0x50BBEE: ggc_internal_alloc_stat(unsigned long) (ggc-page.c:1339)
> > ==27870== by 0x557D92: cgraph_create_edge_1(cgraph_node*, cgraph_node*, gimple_statement_d*, long, int) (cgraph.c:842)
> > ==27870== by 0x55882E: cgraph_create_edge(cgraph_node*, cgraph_node*, gimple_statement_d*, long, int) (cgraph.c:890)
> > ==27870== by 0x560891: cgraph_clone_edge(cgraph_edge*, cgraph_node*, gimple_statement_d*, unsigned int, long, int, bool) (cgraphclones.c:135)
> > ,,,
> >
> > This happens because e->indirect_unknown_callee may be uninitialized in
> > cgraph_add_edge_to_call_site_hash. Fixed by initializing it earlier.
> >
> > LTO bootstrapped and tested on x86_64-unknown-linux-gnu.
> >
> > Please apply, if this looks reasonable.
>
> As we also have
>
> struct cgraph_edge *
> cgraph_create_indirect_edge (struct cgraph_node *caller, gimple call_stmt,
> int ecf_flags,
> gcov_type count, int freq)
> {
> struct cgraph_edge *edge = cgraph_create_edge_1 (caller, NULL, call_stmt,
> count, freq);
> tree target;
>
> edge->indirect_unknown_callee = 1;
>
> I'd rather change the cgraph_create_edge_1 interface to get an additional
> argument (the value to use for indirect_unknown_callee). Or maybe
> we can statically compute it from the current arguments already?
IOW something like this:
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 124ee0adf855..ccd73fa21b80 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -814,7 +814,8 @@ cgraph_set_call_stmt (struct cgraph_edge *e, gimple new_stmt,
static struct cgraph_edge *
cgraph_create_edge_1 (struct cgraph_node *caller, struct cgraph_node *callee,
- gimple call_stmt, gcov_type count, int freq)
+ gimple call_stmt, gcov_type count, int freq,
+ bool indir_unknown_callee)
{
struct cgraph_edge *edge;
@@ -874,6 +875,7 @@ cgraph_create_edge_1 (struct cgraph_node *caller, struct cgraph_node *callee,
edge->indirect_info = NULL;
edge->indirect_inlining_edge = 0;
edge->speculative = false;
+ edge->indirect_unknown_callee = indir_unknown_callee;
if (call_stmt && caller->call_site_hash)
cgraph_add_edge_to_call_site_hash (edge);
@@ -887,9 +889,8 @@ cgraph_create_edge (struct cgraph_node *caller, struct cgraph_node *callee,
gimple call_stmt, gcov_type count, int freq)
{
struct cgraph_edge *edge = cgraph_create_edge_1 (caller, callee, call_stmt,
- count, freq);
+ count, freq, false);
- edge->indirect_unknown_callee = 0;
initialize_inline_failed (edge);
edge->next_caller = callee->callers;
@@ -926,10 +927,9 @@ cgraph_create_indirect_edge (struct cgraph_node *caller, gimple call_stmt,
gcov_type count, int freq)
{
struct cgraph_edge *edge = cgraph_create_edge_1 (caller, NULL, call_stmt,
- count, freq);
+ count, freq, true);
tree target;
- edge->indirect_unknown_callee = 1;
initialize_inline_failed (edge);
edge->indirect_info = cgraph_allocate_init_indirect_info ();
--
Markus