https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87507
Bug ID: 87507 Summary: IRA unnecessarily uses non-volatile registers during register assignment Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: bergner at gcc dot gnu.org Target Milestone: --- Current trunk and GCC 7 (haven't tested anything else) unnecessarily use non-volatile regs forcing unneeded save/restore code, along with unnecessary reg moves. Using a different 128-bit type (ie, long double, etc.) for the struct field types, I see the code I would expect to see. I'm guessing this is a target issue (insn constraints?), so setting the Component to that for now. bergner@pike:~$ cat bug.c typedef struct { __int128_t i0; __int128_t i1; } i2_t; void foo (long cond, i2_t *dst, __int128_t src) { if (cond) { dst->i0 = src; dst->i1 = src; } } bergner@pike:~$ .../xgcc -B... -O2 -S bug.c bergner@pike:~$ cat bug2.s .file "bug.c" .abiversion 2 .section ".text" .align 2 .p2align 4,,15 .globl foo .type foo, @function foo: .LFB0: .cfi_startproc cmpdi 7,3,0 beqlr 7 std 30,-16(1) std 31,-8(1) .cfi_offset 30, -16 .cfi_offset 31, -8 mr 30,6 mr 31,5 addi 9,4,16 mr 10,30 mr 11,31 std 31,0(4) std 30,8(4) std 11,0(9) std 10,8(9) ld 30,-16(1) ld 31,-8(1) .cfi_restore 31 .cfi_restore 30 blr .long 0 .byte 0,0,0,0,0,2,0,0 .cfi_endproc .LFE0: .size foo,.-foo .ident "GCC: (GNU) 9.0.0 20181002 (experimental) [trunk revision 264800]" .section .note.GNU-stack,"",@progbits