[Bug c/28007] New: sse autovectorizer emits wrong code involving shifts

elronayellin at gmail dot com gcc-bugzilla@gcc.gnu.org
Mon Jun 12 23:22:00 GMT 2006


Here is a simple example which shows the bug when compiled with 
-arch i386 -O2 -msse3 -funroll-loops -ftree-vectorize -msse3-ftree-vectorize
and -funroll-loops

#include <cstdio>
#include <stdint.h>

int main (int, char * const) 
{
        const int count = 5;
        uint32_t x[count];
        for (int i = 0; i < count; ++i)
                x[i] = 1;

        for (int i = 0; i < count; ++i)
                x[i] = x[i] << 24;

        for (int i = 0; i < count; ++i)
                std::printf("%x ", x[i]);

    return 0;
}

The compiler is vectorizing the shifts in the loop, but it's generating the
wrong shift constant.  It's putting the shift value (24) into each element of
the __v4si vector instead of setting the __m128 value to 24.  These means that
each element is shifted by 8208 instead of 24 and the result is 0.

<+0029>  movdqa 8208,%xmm0
<+0037>  movdqa (%eax),%xmm1
<+0041>  pslld  %xmm0,%xmm1


-- 
           Summary: sse autovectorizer emits wrong code involving shifts
           Product: gcc
           Version: 4.0.1
            Status: UNCONFIRMED
          Severity: critical
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: elronayellin at gmail dot com


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



More information about the Gcc-bugs mailing list