Fix ICE with thunks taking scalars passed by reference
Jakub Jelinek
jakub@redhat.com
Tue Apr 7 11:30:00 GMT 2015
On Wed, Apr 01, 2015 at 08:32:04AM +0200, Jan Hubicka wrote:
> this patch solves ICE in the attached testcase on mingw32. The problem is that
> on Windows API long double is passed & returned by reference and while expanidng
> the tunk tail call, we get lost because we turn the parameter into SSA name and
> later need its address to pass it further.
>
> The patch extends hack https://gcc.gnu.org/ml/gcc-patches/2014-11/msg00423.html
> to handle not only non-registers but also registers.
>
> Bootstrapped/regtested ppc64-linux. OK?
I think it might be better to handle thunks the same way as other tail
calls, but
--- gcc/cgraphunit.c 2015-04-03 15:32:31.000000000 +0200
+++ gcc/cgraphunit.c 2015-04-07 13:02:16.537723725 +0200
@@ -1767,7 +1767,17 @@ cgraph_node::expand_thunk (bool output_a
/* Build return value. */
if (!DECL_BY_REFERENCE (resdecl))
- ret = gimple_build_return (restmp);
+ {
+ if (is_gimple_reg_type (restype)
+ && aggregate_value_p (resdecl, TREE_TYPE (thunk_fndecl)))
+ {
+ gimple stmt = gimple_build_assign (resdecl, restmp);
+ gsi_insert_after (&bsi, stmt, GSI_NEW_STMT);
+ ret = gimple_build_return (resdecl);
+ }
+ else
+ ret = gimple_build_return (restmp);
+ }
else
ret = gimple_build_return (resdecl);
(which generates the same GIMPLE code as say
long double func1 (long double x);
long double
func2 (long double x)
{
return func1 (x);
}
on both mingw and x86_64-linux) doesn't really work, because calls.c treats
calls in thunks differently from other calls - only in the thunks it takes
ADDR_EXPR of the parameter/result. Thus your patch is ok
for trunk, but please add the testcase into the testsuite.
> PR ipa/65540
> * calls.c (initialize_argument_information): When producing tail
> call also turn SSA_NAMES passed by references to original PARM_DECLs
> Index: calls.c
> ===================================================================
> --- calls.c (revision 221805)
> +++ calls.c (working copy)
> @@ -1321,6 +1321,15 @@ initialize_argument_information (int num
> && TREE_CODE (base) != SSA_NAME
> && (!DECL_P (base) || MEM_P (DECL_RTL (base)))))
> {
> + /* We may have turned the parameter value into an SSA name.
> + Go back to the original parameter so we can take the
> + 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);
> + gcc_assert (TREE_CODE (args[i].tree_value) == PARM_DECL);
> + }
> /* Argument setup code may have copied the value to register. We
> revert that optimization now because the tail call code must
> use the original location. */
Jakub
More information about the Gcc-patches
mailing list