ipa/111914 - perform parameter init after remapping types
Checks
Commit Message
The following addresses a mismatch in SSA name vs. symbol when
we emit a dummy assignment when not optimizing. The temporary
we create is not remapped by initialize_inlined_parameters because
we have no easy way to get at it. The following instead emits
the additional statement after we have remapped the type of
the replacement variable.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.
PR ipa/111914
* tree-inline.cc (setup_one_parameter): Move code emitting
a dummy load when not optimizing ...
(initialize_inlined_parameters): ... here to after when
we remapped the parameter type.
* gcc.dg/pr111914.c: New testcase.
---
gcc/testsuite/gcc.dg/pr111914.c | 14 ++++++++++++++
gcc/tree-inline.cc | 26 ++++++++++++++++++--------
2 files changed, 32 insertions(+), 8 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/pr111914.c
new file mode 100644
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99" } */
+
+__attribute__((always_inline))
+static inline void f(int n, int (*a())[n])
+{
+ /* Unused 'a'. */
+}
+
+void g(void)
+{
+ int (*a())[1];
+ f(1, a);
+}
@@ -3578,9 +3578,7 @@ setup_one_parameter (copy_body_data *id, tree p, tree value, tree fn,
STRIP_USELESS_TYPE_CONVERSION (rhs);
- /* If we are in SSA form properly remap the default definition
- or assign to a dummy SSA name if the parameter is unused and
- we are not optimizing. */
+ /* If we are in SSA form properly remap the default definition. */
if (gimple_in_ssa_p (cfun) && is_gimple_reg (p))
{
if (def)
@@ -3590,11 +3588,6 @@ setup_one_parameter (copy_body_data *id, tree p, tree value, tree fn,
SSA_NAME_IS_DEFAULT_DEF (def) = 0;
set_ssa_default_def (cfun, var, NULL);
}
- else if (!optimize)
- {
- def = make_ssa_name (var);
- init_stmt = gimple_build_assign (def, rhs);
- }
}
else if (!is_empty_type (TREE_TYPE (var)))
init_stmt = gimple_build_assign (var, rhs);
@@ -3653,6 +3646,23 @@ initialize_inlined_parameters (copy_body_data *id, gimple *stmt,
&& SSA_NAME_VAR (*defp) == var)
TREE_TYPE (*defp) = TREE_TYPE (var);
}
+ /* When not optimizing and the parameter is unused, assign to
+ a dummy SSA name. Do this after remapping the type above. */
+ else if (!optimize
+ && is_gimple_reg (p)
+ && i < gimple_call_num_args (stmt))
+ {
+ tree val = gimple_call_arg (stmt, i);
+ if (val != error_mark_node)
+ {
+ if (!useless_type_conversion_p (TREE_TYPE (p),
+ TREE_TYPE (val)))
+ val = force_value_to_type (TREE_TYPE (p), val);
+ def = make_ssa_name (var);
+ gimple *init_stmt = gimple_build_assign (def, val);
+ insert_init_stmt (id, bb, init_stmt);
+ }
+ }
}
}