http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57038
--- Comment #1 from Jan Hubicka <hubicka at gcc dot gnu.org> 2013-04-24 13:35:36 UTC --- Hmm, the failing test is: /* Be sure that we never try to duplicate partitioned symbol or add external symbol. */ gcc_assert (c != SYMBOL_EXTERNAL && (c == SYMBOL_DUPLICATE || !symbol_partitioned_p (node))); now the caller is: for (i = 0; i < n_nodes; i++) { if (symbol_partitioned_p ((symtab_node) order[i])) continue; current_order = order[i]->symbol.order; if (!flag_toplevel_reorder) while (varpool_pos < n_varpool_nodes && varpool_order[varpool_pos]->symbol.order < current_order) { if (!symbol_partitioned_p ((symtab_node) varpool_order[varpool_pos])) add_symbol_to_partition (partition, (symtab_node) varpool_order[varpool_pos]); varpool_pos++; } add_symbol_to_partition (partition, (symtab_node) order[i]); total_size -= inline_summary (order[i])->size; So what can fail here? Symbol_partitioned_p should be false because of the firs ttest in loop. So one should conclude that c==SYMBOL_EXTERNAL that is weird given that the order array is populated only with SYMBOL_PARTITIONED items. Can you, please, figure out what is value of c and symbol_partitioned_p test? Honza