Hi,
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?

The bug reproduced with ICF, but I suppose it will turn into ice on any C++ 
covariant
thunks taking scalar passed by reference.

ng double func1 (long double x)
{
  if (x > 0.0)
    return x;
  else if (x < 0.0)
    return -x;
  else
    return x;
}

long double func2 (long double x)
{
  if (x > 0.0)
    return x;
  else if (x < 0.0)
    return -x;
  else
    return x;
}

        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.  */

Reply via email to