https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80104
Martin Liška <marxin at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |ASSIGNED CC| |hubicka at ucw dot cz Ever confirmed|0 |1 --- Comment #1 from Martin Liška <marxin at gcc dot gnu.org> --- Problem is that we produce a thunk which has an invisible reference type of an argument. Optimized tree dumps looks as follows: ;; Function c (c, funcdef_no=3, decl_uid=2001, cgraph_uid=1, symbol_order=1) c (complex float b) { complex float arg.1; float retval.0; <bb 2> [100.00%]: arg.1_2 = b; retval.0_4 = a (arg.1_2); [tail call] return retval.0_4; } Problem is that without any optimization level, arg.1_2 isn't a default def. Following patch can fix that, but I'm not sure whether it's OK, or it's more a workaround? diff --git a/gcc/calls.c b/gcc/calls.c index 61caf4ca752..404f9e303b7 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -1745,8 +1745,15 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED, address. */ if (TREE_CODE (args[i].tree_value) == SSA_NAME) { - gcc_assert (SSA_NAME_IS_DEFAULT_DEF (args[i].tree_value)); - args[i].tree_value = SSA_NAME_VAR (args[i].tree_value); + if (SSA_NAME_IS_DEFAULT_DEF (args[i].tree_value)) + args[i].tree_value = SSA_NAME_VAR (args[i].tree_value); + else + { + gimple *g = SSA_NAME_DEF_STMT (args[i].tree_value); + if (gimple_assign_single_p (g)) + args[i].tree_value = gimple_assign_rhs1 (g); + } + gcc_assert (TREE_CODE (args[i].tree_value) == PARM_DECL); } /* Argument setup code may have copied the value to register. We