diff options
author | Richard Biener <rguenther@suse.de> | 2021-02-18 12:28:26 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2021-02-18 14:38:33 +0100 |
commit | 7ee164dcfe390fc030028db9112d44255637b1aa (patch) | |
tree | 977394736d876959c959abe07ea5c81028e6b03b /gcc/tree-inline.c | |
parent | a2ef38b1f94dd108046e702ad46dcd8e9b34625e (diff) | |
download | gcc-7ee164dcfe390fc030028db9112d44255637b1aa.zip gcc-7ee164dcfe390fc030028db9112d44255637b1aa.tar.gz gcc-7ee164dcfe390fc030028db9112d44255637b1aa.tar.bz2 |
middle-end/99122 - Issues with VLA parameter inlining
The following instructs IPA not to inline calls with VLA parameters
and adjusts inlining not to create invalid view-converted VLA
parameters on mismatch and makes the error_mark paths with debug
stmts actually work.
The first part avoids the ICEs with the testcases already.
2021-02-18 Richard Biener <rguenther@suse.de>
PR middle-end/99122
* ipa-fnsummary.c (analyze_function_body): Set
CIF_FUNCTION_NOT_INLINABLE for VLA parameter calls.
* tree-inline.c (insert_init_debug_bind): Pass NULL for
error_mark_node values.
(force_value_to_type): Do not build V_C_Es for WITH_SIZE_EXPR
values.
(setup_one_parameter): Delay force_value_to_type until when
it's needed.
* gcc.dg/pr99122-1.c: New testcase.
* gcc.dg/pr99122-2.c: Likewise.
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r-- | gcc/tree-inline.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index a710fa5..01a08cf 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -3352,7 +3352,10 @@ insert_init_debug_bind (copy_body_data *id, base_stmt = gsi_stmt (gsi); } - note = gimple_build_debug_bind (tracked_var, unshare_expr (value), base_stmt); + note = gimple_build_debug_bind (tracked_var, + value == error_mark_node + ? NULL_TREE : unshare_expr (value), + base_stmt); if (bb) { @@ -3418,7 +3421,9 @@ force_value_to_type (tree type, tree value) 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)) + if (TREE_CODE (value) == WITH_SIZE_EXPR) + return error_mark_node; + else 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 @@ -3434,15 +3439,9 @@ setup_one_parameter (copy_body_data *id, tree p, tree value, tree fn, { gimple *init_stmt = NULL; tree var; - tree rhs = value; tree def = (gimple_in_ssa_p (cfun) ? ssa_default_def (id->src_cfun, p) : NULL); - if (value - && value != error_mark_node - && !useless_type_conversion_p (TREE_TYPE (p), TREE_TYPE (value))) - 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 function. */ @@ -3501,6 +3500,12 @@ setup_one_parameter (copy_body_data *id, tree p, tree value, tree fn, if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (p))) TREE_READONLY (var) = 0; + tree rhs = value; + if (value + && value != error_mark_node + && !useless_type_conversion_p (TREE_TYPE (p), TREE_TYPE (value))) + rhs = force_value_to_type (TREE_TYPE (p), value); + /* If there is no setup required and we are in SSA, take the easy route replacing all SSA names representing the function parameter by the SSA name passed to function. |