[Bug tree-optimization/31460] vectorizer failed to work on simple loop

hjl at lucon dot org gcc-bugzilla@gcc.gnu.org
Tue Apr 3 16:37:00 GMT 2007



------- Comment #2 from hjl at lucon dot org  2007-04-03 17:37 -------
For code:

typedef short vec_t;

extern __attribute__((aligned(16))) vec_t x [64];
extern __attribute__((aligned(16))) vec_t y [64];
extern __attribute__((aligned(16))) vec_t m [64];

void
foo ()
{
  int i;

  for (i = 0; i < 64; i++)
    if (x [i] < y [i])
      m [i] = y [i];
    else
      m [i] = x [i];
}

I am expecting:

.globl foo
        .type   foo, @function
foo:
.LFB2:
        movdqa  y(%rip), %xmm0
        movl    $16, %eax
        pmaxsw  x(%rip), %xmm0
        movdqa  %xmm0, m(%rip)
        .p2align 4,,7
.L2:
        movdqa  y(%rax), %xmm0
        pmaxsw  x(%rax), %xmm0
        movdqa  %xmm0, m(%rax)
        addq    $16, %rax
        cmpq    $128, %rax
        jne     .L2
        rep ; ret
.LFE2:
        .size   foo, .-foo

But I got

.globl foo
        .type   foo, @function
foo:
.LFB2:
        xorl    %ecx, %ecx
        .p2align 4,,7
.L2:
        movzwl  x(%rcx,%rcx), %edx
        movzwl  y(%rcx,%rcx), %eax
        cmpw    %ax, %dx
        cmovge  %edx, %eax
        movw    %ax, m(%rcx,%rcx)
        addq    $1, %rcx
        cmpq    $64, %rcx
        jne     .L2
        rep ; ret
.LFE2:
        .size   foo, .-foo


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31460



More information about the Gcc-bugs mailing list