https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83490

--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
--- gcc/calls.c.jj      2017-12-18 14:57:24.000000000 +0100
+++ gcc/calls.c 2017-12-19 19:46:40.466045457 +0100
@@ -2382,7 +2382,12 @@ compute_argument_addresses (struct arg_d
              args[i].stack = gen_rtx_MEM (partial_mode, addr);
              set_mem_size (args[i].stack, units_on_stack);
            }
-         else
+         else if (TYPE_EMPTY_P (TREE_TYPE (args[i].tree_value)))
+           {
+             args[i].stack = gen_rtx_MEM (BLKmode, addr);
+             set_mem_size (args[i].stack, 0);
+           }
+         else  
            {
              args[i].stack = gen_rtx_MEM (args[i].mode, addr);
              set_mem_attributes (args[i].stack,

avoids the ICE.  But I think I prefer:
--- gcc/calls.c.jj      2017-12-18 14:57:24.000000000 +0100
+++ gcc/calls.c 2017-12-19 20:25:00.143659975 +0100
@@ -2365,6 +2365,9 @@ compute_argument_addresses (struct arg_d
              && args[i].partial == 0)
            continue;

+         if (TYPE_EMPTY_P (TREE_TYPE (args[i].tree_value)))
+           continue;
+
          /* Pointer Bounds are never passed on the stack.  */
          if (POINTER_BOUNDS_P (args[i].tree_value))
            continue;
which I'll bootstrap/regtest together with the testcase momentarily.

Reply via email to