aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-inline.c
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2020-05-04 13:53:54 +0200
committerMartin Jambor <mjambor@suse.cz>2020-05-04 13:53:54 +0200
commit375a77925c320a273d3b1ef3182f29f31aaa8edf (patch)
tree1c2973771045109699c92bea00436b7492f9f33e /gcc/tree-inline.c
parent8ea03e9016cbca5a7ee2b4befa4d5c32467b0982 (diff)
downloadgcc-375a77925c320a273d3b1ef3182f29f31aaa8edf.zip
gcc-375a77925c320a273d3b1ef3182f29f31aaa8edf.tar.gz
gcc-375a77925c320a273d3b1ef3182f29f31aaa8edf.tar.bz2
tree-inline: Simplify IPA-CP type conversion (PR 93385)
when callers and callees do not quite agree on the type of a parameter, usually with ill-defined K&R or with smilarly wrong LTO input, IPA-CP can attempt to try and substitute a wrong type for a parameter (see e.g. gcc.dg/torture/pr48063.c). Function tree_function_versioning attempts to handle this in order not to create invalid gimple but it then creates the mapping using setup_one_parameter which also handles the same situation to avoid similar problems when inlining and in more defined way. So this patch simply removes the conversion attempts in tree_function_versioning itself. It is helpful for my upcoming fix of PR 93385 because then I do not need to teach ipa_param_body_adjustments to distinguish between successful and unsuccessful mappings - setup_one_parameter uses force_value_to_type for conversions which simly maps the worst cases to zero. 2020-05-04 Martin Jambor <mjambor@suse.cz> PR ipa/93385 * tree-inline.c (tree_function_versioning): Leave any type conversion of replacements to setup_one_parameter and its friend force_value_to_type.
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r--gcc/tree-inline.c42
1 files changed, 5 insertions, 37 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 69ca8e9..32c49ae 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -6261,46 +6261,14 @@ tree_function_versioning (tree old_decl, tree new_decl,
p = new_param_indices[p];
tree parm;
- tree req_type, new_type;
-
for (parm = DECL_ARGUMENTS (old_decl); p;
parm = DECL_CHAIN (parm))
p--;
- tree old_tree = parm;
- req_type = TREE_TYPE (parm);
- new_type = TREE_TYPE (replace_info->new_tree);
- if (!useless_type_conversion_p (req_type, new_type))
- {
- if (fold_convertible_p (req_type, replace_info->new_tree))
- replace_info->new_tree
- = fold_build1 (NOP_EXPR, req_type, replace_info->new_tree);
- else if (TYPE_SIZE (req_type) == TYPE_SIZE (new_type))
- replace_info->new_tree
- = fold_build1 (VIEW_CONVERT_EXPR, req_type,
- replace_info->new_tree);
- else
- {
- if (dump_file)
- {
- fprintf (dump_file, " const ");
- print_generic_expr (dump_file,
- replace_info->new_tree);
- fprintf (dump_file,
- " can't be converted to param ");
- print_generic_expr (dump_file, parm);
- fprintf (dump_file, "\n");
- }
- old_tree = NULL;
- }
- }
-
- if (old_tree)
- {
- init = setup_one_parameter (&id, old_tree, replace_info->new_tree,
- id.src_fn, NULL, &vars);
- if (init)
- init_stmts.safe_push (init);
- }
+ gcc_assert (parm);
+ init = setup_one_parameter (&id, parm, replace_info->new_tree,
+ id.src_fn, NULL, &vars);
+ if (init)
+ init_stmts.safe_push (init);
}
ipa_param_body_adjustments *param_body_adjs = NULL;