diff options
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r-- | gcc/tree-inline.c | 50 |
1 files changed, 38 insertions, 12 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 6b6b78c..879292b 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -176,7 +176,7 @@ static int processing_debug_stmt = 0; static tree remap_ssa_name (tree name, copy_body_data *id) { - tree new_tree; + tree new_tree, var; tree *n; gcc_assert (TREE_CODE (name) == SSA_NAME); @@ -218,9 +218,38 @@ remap_ssa_name (tree name, copy_body_data *id) return name; } + /* Remap anonymous SSA names or SSA names of anonymous decls. */ + var = SSA_NAME_VAR (name); + if (!var + || (!SSA_NAME_IS_DEFAULT_DEF (name) + && TREE_CODE (var) == VAR_DECL + && !VAR_DECL_IS_VIRTUAL_OPERAND (var) + && DECL_ARTIFICIAL (var) + && DECL_IGNORED_P (var) + && !DECL_NAME (var))) + { + struct ptr_info_def *pi; + new_tree = make_ssa_name (remap_type (TREE_TYPE (name), id), NULL); + if (!var && SSA_NAME_IDENTIFIER (name)) + SET_SSA_NAME_VAR_OR_IDENTIFIER (new_tree, SSA_NAME_IDENTIFIER (name)); + insert_decl_map (id, name, new_tree); + SSA_NAME_OCCURS_IN_ABNORMAL_PHI (new_tree) + = SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name); + /* At least IPA points-to info can be directly transferred. */ + if (id->src_cfun->gimple_df + && id->src_cfun->gimple_df->ipa_pta + && (pi = SSA_NAME_PTR_INFO (name)) + && !pi->pt.anything) + { + struct ptr_info_def *new_pi = get_ptr_info (new_tree); + new_pi->pt = pi->pt; + } + return new_tree; + } + /* Do not set DEF_STMT yet as statement is not copied yet. We do that in copy_bb. */ - new_tree = remap_decl (SSA_NAME_VAR (name), id); + new_tree = remap_decl (var, id); /* We might've substituted constant or another SSA_NAME for the variable. @@ -229,7 +258,8 @@ remap_ssa_name (tree name, copy_body_data *id) inlining: this saves us from need to introduce PHI node in a case return value is just partly initialized. */ if ((TREE_CODE (new_tree) == VAR_DECL || TREE_CODE (new_tree) == PARM_DECL) - && (TREE_CODE (SSA_NAME_VAR (name)) != RESULT_DECL + && (!SSA_NAME_VAR (name) + || TREE_CODE (SSA_NAME_VAR (name)) != RESULT_DECL || !id->transform_return_to_modify)) { struct ptr_info_def *pi; @@ -259,7 +289,8 @@ remap_ssa_name (tree name, copy_body_data *id) regions of the CFG, but this is expensive to test. */ if (id->entry_bb && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name) - && TREE_CODE (SSA_NAME_VAR (name)) != PARM_DECL + && (!SSA_NAME_VAR (name) + || TREE_CODE (SSA_NAME_VAR (name)) != PARM_DECL) && (id->entry_bb != EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->dest || EDGE_COUNT (id->entry_bb->preds) != 1)) { @@ -1184,6 +1215,7 @@ remap_gimple_stmt (gimple stmt, copy_body_data *id) if (retval && (TREE_CODE (retval) != RESULT_DECL && (TREE_CODE (retval) != SSA_NAME + || ! SSA_NAME_VAR (retval) || TREE_CODE (SSA_NAME_VAR (retval)) != RESULT_DECL))) { copy = gimple_build_assign (id->retvar, retval); @@ -2474,14 +2506,8 @@ insert_init_stmt (copy_body_data *id, basic_block bb, gimple init_stmt) if (!is_gimple_debug (init_stmt) && MAY_HAVE_DEBUG_STMTS) { - tree var, def = gimple_assign_lhs (init_stmt); - - if (TREE_CODE (def) == SSA_NAME) - var = SSA_NAME_VAR (def); - else - var = def; - - insert_init_debug_bind (id, bb, var, def, init_stmt); + tree def = gimple_assign_lhs (init_stmt); + insert_init_debug_bind (id, bb, def, def, init_stmt); } } } |