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.

Reply via email to