diff options
author | Martin Jambor <mjambor@suse.cz> | 2019-09-30 10:18:59 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2019-09-30 10:18:59 +0200 |
commit | be525d9221f61c17e0fa34823ffd1624b0f8518a (patch) | |
tree | 8674735d0491388b7801692da4d645704aa61b17 /gcc/tree-inline.c | |
parent | 15bbad92434a184a0baac0c93c7111e6e7fcd9c2 (diff) |
[PR 91853] Prevent IPA-SRA ICEs on type-mismatched calls
2019-09-30 Martin Jambor <mjambor@suse.cz>
PR ipa/91853
* tree-inline.c (force_value_to_type): New function.
(setup_one_parameter): Use force_value_to_type to convert type.
* tree-inline.c (force_value_to_type): Declare.
* ipa-param-manipulation.c (ipa_param_adjustments::modify_call): Deal
with register type mismatches.
testsuite/
* gcc.dg/ipa/pr91853.c: New test.
From-SVN: r276296
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r-- | gcc/tree-inline.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 500037c9f3f..d6920f48693 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -3333,6 +3333,29 @@ insert_init_stmt (copy_body_data *id, basic_block bb, gimple *init_stmt) } } +/* Deal with mismatched formal/actual parameters, in a rather brute-force way + if need be (which should only be necessary for invalid programs). Attempt + to convert VAL to TYPE and return the result if it is possible, just return + a zero constant of the given type if it fails. */ + +tree +force_value_to_type (tree type, tree value) +{ + /* If we can match up types by promotion/demotion do so. */ + if (fold_convertible_p (type, value)) + return fold_convert (type, value); + + /* ??? For valid programs we should not end up here. + Still if we end up with truly mismatched types here, fall back + to using a VIEW_CONVERT_EXPR or a literal zero to not leak invalid + GIMPLE to the following passes. */ + if (!is_gimple_reg_type (TREE_TYPE (value)) + || TYPE_SIZE (type) == TYPE_SIZE (TREE_TYPE (value))) + return fold_build1 (VIEW_CONVERT_EXPR, type, value); + else + return build_zero_cst (type); +} + /* Initialize parameter P with VALUE. If needed, produce init statement at the end of BB. When BB is NULL, we return init statement to be output later. */ @@ -3349,23 +3372,7 @@ setup_one_parameter (copy_body_data *id, tree p, tree value, tree fn, if (value && value != error_mark_node && !useless_type_conversion_p (TREE_TYPE (p), TREE_TYPE (value))) - { - /* If we can match up types by promotion/demotion do so. */ - if (fold_convertible_p (TREE_TYPE (p), value)) - rhs = fold_convert (TREE_TYPE (p), value); - else - { - /* ??? For valid programs we should not end up here. - Still if we end up with truly mismatched types here, fall back - to using a VIEW_CONVERT_EXPR or a literal zero to not leak invalid - GIMPLE to the following passes. */ - if (!is_gimple_reg_type (TREE_TYPE (value)) - || TYPE_SIZE (TREE_TYPE (p)) == TYPE_SIZE (TREE_TYPE (value))) - rhs = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (p), value); - else - rhs = build_zero_cst (TREE_TYPE (p)); - } - } + rhs = force_value_to_type (TREE_TYPE (p), value); /* Make an equivalent VAR_DECL. Note that we must NOT remap the type here since the type of this decl must be visible to the calling |