aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-inline.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2021-02-18 12:28:26 +0100
committerRichard Biener <rguenther@suse.de>2021-02-18 14:38:33 +0100
commit7ee164dcfe390fc030028db9112d44255637b1aa (patch)
tree977394736d876959c959abe07ea5c81028e6b03b /gcc/tree-inline.c
parenta2ef38b1f94dd108046e702ad46dcd8e9b34625e (diff)
downloadgcc-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.c21
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.