This puts checking code into place that we do not put globals into referenced-vars (nor allocate var-annotations for them). It also fixes remaining cases in mudflap and matrix-reorg.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied. Richard. 2012-05-29 Richard Guenther <[email protected]> * tree-dfa.c (find_vars_r): Do not call add_referenced_vars for globals. (add_referenced_var_1): Re-organize. Assert we are not called for globals. (remove_referenced_var): Likewise. * varpool.c (add_new_static_var): Use create_tmp_var_raw. * tree-mudflap.c (execute_mudflap_function_ops): Do not call add_referenced_var on globals. * matrix-reorg.c (transform_access_sites): Likewise. Index: gcc/tree-dfa.c =================================================================== *** gcc/tree-dfa.c (revision 187830) --- gcc/tree-dfa.c (working copy) *************** find_vars_r (tree *tp, int *walk_subtree *** 430,436 **** /* If T is a regular variable that the optimizers are interested in, add it to the list of variables. */ ! else if (SSA_VAR_P (*tp)) add_referenced_var_1 (*tp, fn); /* Type, _DECL and constant nodes have no interesting children. --- 430,439 ---- /* If T is a regular variable that the optimizers are interested in, add it to the list of variables. */ ! else if ((TREE_CODE (*tp) == VAR_DECL ! && !is_global_var (*tp)) ! || TREE_CODE (*tp) == PARM_DECL ! || TREE_CODE (*tp) == RESULT_DECL) add_referenced_var_1 (*tp, fn); /* Type, _DECL and constant nodes have no interesting children. *************** add_referenced_var_1 (tree var, struct f *** 560,581 **** || TREE_CODE (var) == PARM_DECL || TREE_CODE (var) == RESULT_DECL); ! if (!(TREE_CODE (var) == VAR_DECL ! && VAR_DECL_IS_VIRTUAL_OPERAND (var)) ! && is_global_var (var)) ! return false; ! if (!*DECL_VAR_ANN_PTR (var)) ! *DECL_VAR_ANN_PTR (var) = ggc_alloc_cleared_var_ann_d (); ! ! /* Insert VAR into the referenced_vars hash table if it isn't present. */ if (referenced_var_check_and_insert (var, fn)) ! return true; return false; } ! /* Remove VAR from the list. */ void remove_referenced_var (tree var) --- 563,586 ---- || TREE_CODE (var) == PARM_DECL || TREE_CODE (var) == RESULT_DECL); ! gcc_checking_assert ((TREE_CODE (var) == VAR_DECL ! && VAR_DECL_IS_VIRTUAL_OPERAND (var)) ! || !is_global_var (var)); ! /* Insert VAR into the referenced_vars hash table if it isn't present ! and allocate its var-annotation. */ if (referenced_var_check_and_insert (var, fn)) ! { ! gcc_checking_assert (!*DECL_VAR_ANN_PTR (var)); ! *DECL_VAR_ANN_PTR (var) = ggc_alloc_cleared_var_ann_d (); ! return true; ! } return false; } ! /* Remove VAR from the list of referenced variables and clear its ! var-annotation. */ void remove_referenced_var (tree var) *************** remove_referenced_var (tree var) *** 585,598 **** void **loc; unsigned int uid = DECL_UID (var); ! /* Preserve var_anns of globals. */ ! if (!is_global_var (var) ! && (v_ann = var_ann (var))) ! { ! ggc_free (v_ann); ! *DECL_VAR_ANN_PTR (var) = NULL; ! } ! gcc_assert (DECL_P (var)); in.uid = uid; loc = htab_find_slot_with_hash (gimple_referenced_vars (cfun), &in, uid, NO_INSERT); --- 590,605 ---- void **loc; unsigned int uid = DECL_UID (var); ! gcc_checking_assert (TREE_CODE (var) == VAR_DECL ! || TREE_CODE (var) == PARM_DECL ! || TREE_CODE (var) == RESULT_DECL); ! ! gcc_checking_assert (!is_global_var (var)); ! ! v_ann = var_ann (var); ! ggc_free (v_ann); ! *DECL_VAR_ANN_PTR (var) = NULL; ! in.uid = uid; loc = htab_find_slot_with_hash (gimple_referenced_vars (cfun), &in, uid, NO_INSERT); Index: gcc/varpool.c =================================================================== *** gcc/varpool.c (revision 187830) --- gcc/varpool.c (working copy) *************** add_new_static_var (tree type) *** 449,455 **** tree new_decl; struct varpool_node *new_node; ! new_decl = create_tmp_var (type, NULL); DECL_NAME (new_decl) = create_tmp_var_name (NULL); TREE_READONLY (new_decl) = 0; TREE_STATIC (new_decl) = 1; --- 449,455 ---- tree new_decl; struct varpool_node *new_node; ! new_decl = create_tmp_var_raw (type, NULL); DECL_NAME (new_decl) = create_tmp_var_name (NULL); TREE_READONLY (new_decl) = 0; TREE_STATIC (new_decl) = 1; Index: gcc/tree-mudflap.c =================================================================== *** gcc/tree-mudflap.c (revision 187830) --- gcc/tree-mudflap.c (working copy) *************** execute_mudflap_function_ops (void) *** 427,436 **** push_gimplify_context (&gctx); - add_referenced_var (mf_cache_array_decl); - add_referenced_var (mf_cache_shift_decl); - add_referenced_var (mf_cache_mask_decl); - /* In multithreaded mode, don't cache the lookup cache parameters. */ if (! flag_mudflap_threads) mf_decl_cache_locals (); --- 427,432 ---- Index: gcc/matrix-reorg.c =================================================================== *** gcc/matrix-reorg.c (revision 187830) --- gcc/matrix-reorg.c (working copy) *************** transform_access_sites (void **slot, voi *** 1914,1920 **** num_elements = fold_build2 (MULT_EXPR, sizetype, fold_convert (sizetype, acc_info->index), fold_convert (sizetype, d_size)); - add_referenced_var (d_size); gsi = gsi_for_stmt (acc_info->stmt); tmp1 = force_gimple_operand_gsi (&gsi, num_elements, true, NULL, true, GSI_SAME_STMT); --- 1914,1919 ----
