Hi!

On x86_64-darwin, we ICE on one of the pr64307.c testcase, because
expand_thunk doesn't load non-gimple_val arguments into registers
for the first argument, only for all the other ones.
Supposedly normally thunks were meant to have this argument as pointer first
and thus it wasn't an issue, but in the -O0 -fipa-icf case a thunk is
created even for a non-method.

This patch fixes it by special-casing the first argument only if
this_adjusting - then we know it is a pointer that is being adjusted.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2015-01-26  Jakub Jelinek  <ja...@redhat.com>

        PR ipa/64776
        * cgraphunit.c (cgraph_node::expand_thunk): If not this_adjusting,
        handle the first argument in the same loop as all the other arguments.

--- gcc/cgraphunit.c.jj 2015-01-15 14:05:05.000000000 +0100
+++ gcc/cgraphunit.c    2015-01-26 17:26:18.629818527 +0100
@@ -1610,14 +1610,18 @@ cgraph_node::expand_thunk (bool output_a
       for (arg = a; arg; arg = DECL_CHAIN (arg))
         nargs++;
       auto_vec<tree> vargs (nargs);
+      i = 0;
+      arg = a;
       if (this_adjusting)
-        vargs.quick_push (thunk_adjust (&bsi, a, 1, fixed_offset,
-                                       virtual_offset));
-      else if (nargs)
-        vargs.quick_push (a);
+       {
+         vargs.quick_push (thunk_adjust (&bsi, a, 1, fixed_offset,
+                                         virtual_offset));
+         arg = DECL_CHAIN (a);
+         i = 1;
+       }
 
       if (nargs)
-        for (i = 1, arg = DECL_CHAIN (a); i < nargs; i++, arg = DECL_CHAIN 
(arg))
+       for (; i < nargs; i++, arg = DECL_CHAIN (arg))
          {
            tree tmp = arg;
            if (!is_gimple_val (arg))

        Jakub

Reply via email to