2006-10-18 Jan Hubicka PR middle-end/29299 * cfgexpand.c (expand_used_vars_for_block): Vars marked used by user are used. 2006-10-15 Jan Hubicka Richard Guenther PR middle-end/29299 * cgraphunit.c (cgraph_finalize_compilation_unit): Call process_function_and_variable_attributes on all variables, including those discovered during cgraph construction phase. * gcc.dg/pr29299.c: New testcase. --- gcc/cgraphunit.c (revision 117745) +++ gcc/cgraphunit.c (revision 117863) @@ -1055,6 +1055,7 @@ cgraph_finalize_compilation_unit (void) /* Keep track of already processed nodes when called multiple times for intermodule optimization. */ static struct cgraph_node *first_analyzed; + struct cgraph_node *first_processed = first_analyzed; static struct cgraph_varpool_node *first_analyzed_var; if (errorcount || sorrycount) @@ -1077,7 +1078,10 @@ cgraph_finalize_compilation_unit (void) } timevar_push (TV_CGRAPH); - process_function_and_variable_attributes (first_analyzed, first_analyzed_var); + process_function_and_variable_attributes (first_processed, + first_analyzed_var); + first_processed = cgraph_nodes; + first_analyzed_var = cgraph_varpool_nodes; cgraph_varpool_analyze_pending_decls (); if (cgraph_dump_file) { @@ -1119,11 +1123,16 @@ cgraph_finalize_compilation_unit (void) if (!edge->callee->reachable) cgraph_mark_reachable_node (edge->callee); + /* We finalize local static variables during constructing callgraph + edges. Process their attributes too. */ + process_function_and_variable_attributes (first_processed, + first_analyzed_var); + first_processed = cgraph_nodes; + first_analyzed_var = cgraph_varpool_nodes; cgraph_varpool_analyze_pending_decls (); } /* Collect entry points to the unit. */ - if (cgraph_dump_file) { fprintf (cgraph_dump_file, "Unit entry points:"); @@ -1163,7 +1172,6 @@ cgraph_finalize_compilation_unit (void) dump_cgraph (cgraph_dump_file); } first_analyzed = cgraph_nodes; - first_analyzed_var = cgraph_varpool_nodes; ggc_collect (); timevar_pop (TV_CGRAPH); } --- gcc/cfgexpand.c (revision 117745) +++ gcc/cfgexpand.c (revision 117863) @@ -764,7 +764,12 @@ expand_used_vars_for_block (tree block, /* Expand all variables at this level. */ for (t = BLOCK_VARS (block); t ; t = TREE_CHAIN (t)) - if (TREE_USED (t)) + if (TREE_USED (t) + /* Force local static variables to be output when marked by + used attribute. For unit-at-a-time, cgraph code already takes + care of this. */ + || (!flag_unit_at_a_time && TREE_STATIC (t) + && DECL_PRESERVE_P (t))) expand_one_var (t, toplevel); this_sv_num = stack_vars_num; --- gcc/testsuite/gcc.dg/pr29299.c (revision 0) +++ gcc/testsuite/gcc.dg/pr29299.c (revision 117863) @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O" } */ + +static int bof __attribute__((used)); +int foo() +{ + static int barbarbarbar __attribute__((used)); +}; + +/* { dg-final { scan-assembler "barbarbarbar" } } */