Index: ipa-cp.c =================================================================== --- ipa-cp.c (revision 118142) +++ ipa-cp.c (working copy) @@ -449,7 +449,8 @@ constant_val_insert (tree fn, tree parm1, tree val) { struct function *func; - tree init_stmt, use_stmt; + tree init_stmt = NULL; + tree use_stmt; edge e_step; edge_iterator ei; imm_use_iterator imm_iter; @@ -460,34 +461,37 @@ cfun = func; current_function_decl = fn; - if (in_ssa_p && !TREE_ADDRESSABLE (parm1)) { if (!default_def (parm1)) return; - new_ssa = make_ssa_name (parm1, NULL); - init_stmt = - build2 (MODIFY_EXPR, void_type_node, - new_ssa /*default_def (parm1) */ , val); - TREE_OPERAND (init_stmt, 0) = new_ssa /*default_def (parm1) */ ; - SSA_NAME_DEF_STMT (new_ssa /*default_def (parm1) */ ) = init_stmt; + init_stmt = build2 (MODIFY_EXPR, void_type_node, new_ssa, val); + TREE_OPERAND (init_stmt, 0) = new_ssa; + SSA_NAME_DEF_STMT (new_ssa) = init_stmt; FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, default_def (parm1)) FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter) - SET_USE (use_p, new_ssa); + SET_USE (use_p, new_ssa); set_default_def (parm1, NULL); } else init_stmt = build2 (MODIFY_EXPR, void_type_node, parm1, val); + mark_new_vars_to_rename (init_stmt); - func = DECL_STRUCT_FUNCTION (fn); - cfun = func; - current_function_decl = fn; - - if (ENTRY_BLOCK_PTR_FOR_FUNCTION (func)->succs) - FOR_EACH_EDGE (e_step, ei, ENTRY_BLOCK_PTR_FOR_FUNCTION (func)->succs) - bsi_insert_on_edge_immediate (e_step, init_stmt); + if (init_stmt) + if (ENTRY_BLOCK_PTR_FOR_FUNCTION (func)->succs) + FOR_EACH_EDGE (e_step, ei, ENTRY_BLOCK_PTR_FOR_FUNCTION (func)->succs) + bsi_insert_on_edge_immediate (e_step, init_stmt); + if (in_ssa_p) + { + update_ssa (TODO_update_ssa); +#ifdef ENABLE_CHECKING + verify_ssa (true); +#endif + } + free_dominance_info (CDI_DOMINATORS); + free_dominance_info (CDI_POST_DOMINATORS); } /* build INTEGER_CST tree with type TREE_TYPE and @@ -893,17 +897,9 @@ replace_map = XCNEW (struct ipa_replace_map); gcc_assert (ipcp_type_is_const (type)); - if (type == CONST_VALUE_REF) + if (type != CONST_VALUE_REF && TREE_READONLY (parm_tree) + && !TREE_ADDRESSABLE (parm_tree)) { - const_val = - build_const_val (cvalue, type, TREE_TYPE (TREE_TYPE (parm_tree))); - replace_map->old_tree = parm_tree; - replace_map->new_tree = const_val; - replace_map->replace_p = true; - replace_map->ref_p = true; - } - else if (TREE_READONLY (parm_tree) && !TREE_ADDRESSABLE (parm_tree)) - { const_val = build_const_val (cvalue, type, TREE_TYPE (parm_tree)); replace_map->old_tree = parm_tree; replace_map->new_tree = const_val;