https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65540
Jan Hubicka <hubicka at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |hubicka at gcc dot gnu.org --- Comment #9 from Jan Hubicka <hubicka at gcc dot gnu.org> --- OK, hand written wrapper is produced as follows: f3 (long double x) { long double _3; <bb 2>: _3 = func2 (x_2(D)); [return slot optimization] <retval> = _3; return <retval>; } and create_wrapper produces: func1 (long double x) { long double retval.3; <bb 2>: retval.3_2 = func2 (x_1(D)); [return slot optimization] [tail call] return retval.3_2; } I suppose it is the tail call that fails here, but I think it is just missed optimization we do not produce it in the first case because the parameter also needs copying: f3: subq $72, %rsp .seh_stackalloc 72 .seh_endprologue fldt (%rdx) movq %rcx, %r8 leaq 32(%rsp), %rdx leaq 48(%rsp), %rcx fstpt 32(%rsp) call func2 movq %r8, %rax fldt 48(%rsp) fstpt (%r8) addq $72, %rsp ret compiling it as jmp func2 would definitly be an improvmeent! We die expanding address of the first parameter: #2 0x00000000104f6d5c in expand_expr_addr_expr_1 (exp=0x3fffaf921050, target=target@entry=0x0, tmode=tmode@entry=DImode, modifier=modifier@entry=EXPAND_NORMAL, as=as@entry=0 '\000') at ../../gcc/expr.c:7761 7761 gcc_assert (inner != exp); (gdb) p debug_tree (exp) <ssa_name 0x3fffaf921050 type <real_type 0x3fffaf8c1500 long double XF size <integer_cst 0x3fffaf880cf0 constant 128> unit size <integer_cst 0x3fffaf880d08 constant 16> align 128 symtab 0 alias set 1 canonical type 0x3fffaf8c1500 precision 80 pointer_to_this <pointer_type 0x3fffaf8c16f8>> visited var <parm_decl 0x3fffafa80000 x>def_stmt GIMPLE_NOP version 1> $1 = void Where clearly we have problem of copying it to SSA name. I suppose code in https://gcc.gnu.org/ml/gcc-patches/2014-11/msg00423.html may need to happen on non-aggregates, too