https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89849
Bug ID: 89849 Summary: Worse code at O3 because of slp Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: amker at gcc dot gnu.org Target Milestone: --- Hi, This is the code sample from scovit@IRC: struct ciao { long a; long b; }; //__declspec(noinline) __attribute((noinline)) struct ciao square(int num) { struct ciao beta; beta.a = num; beta.b = num*num; return beta; } int main(int a) { struct ciao tje = square(a); return tje.a * tje.b; } O3 generates: square: .LFB0: .cfi_startproc movslq %edi, %rax imull %edi, %edi movq %rax, %xmm0 movslq %edi, %rdi movq %rdi, %xmm1 punpcklqdq %xmm1, %xmm0 movaps %xmm0, -24(%rsp) movq -24(%rsp), %rax movq -16(%rsp), %rdx ret .cfi_endproc .LFE0: .size square, .-square .section .text.startup,"ax",@progbits .p2align 4 .globl main .type main, @function main: .LFB1: .cfi_startproc subq $8, %rsp .cfi_def_cfa_offset 16 call square addq $8, %rsp .cfi_def_cfa_offset 8 imull %edx, %eax ret While O1/O2 generate: square: .LFB0: .cfi_startproc movslq %edi, %rax imull %edi, %edi movslq %edi, %rdx ret .cfi_endproc .LFE0: .size square, .-square .globl main .type main, @function main: .LFB1: .cfi_startproc call square imull %edx, %eax ret Looks like SLP gives: square (int num) { vector(2) long int * vectp.7; vector(2) long int * vectp.6; struct ciao D.1917; long int _1; int _2; long int _3; vector(2) long int _8; vector(2) long int vect_cst__9; <bb 2> [local count: 1073741824]: _1 = (long int) num_4(D); _2 = num_4(D) * num_4(D); _3 = (long int) _2; _8 = {_1, _3}; vect_cst__9 = _8; MEM[(struct ciao *)&D.1917] = vect_cst__9; return D.1917; } And latter passes failed to resolve it.