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.