https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85162

            Bug ID: 85162
           Summary: Vector extensions generating incorrect assembly
           Product: gcc
           Version: 6.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: milesbarr2 at gmail dot com
  Target Milestone: ---

Created attachment 43811
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=43811&action=edit
Preprocessed file

It is possible that I am misunderstanding an undefined behaviour because this
bug occurs with both GCC and Clang. In the code sample below there are two
functions which should be equivalent. The compiler appears to be optimizing
some valid vector comparisons out of existence as long as the pattern in the
code sample is followed. This happens with vectors of all types, all sizes, and
with all comparison operators (<, <=, >=, >).

Code sample:
typedef char V1 __attribute__ ((vector_size (1)));
int check1(V1 v) {
        return (v > 0)[0] > 0;
}

typedef char V2;
int check2(V2 v) {
        return (v > 0) > 0;
}

Generated assembly:
_check1:
LFB0:
        .cfi_startproc
        xorl    %eax, %eax
        ret
        .cfi_endproc
LFE0:
        .p2align 4,,15
        .globl  _check2
        .def    _check2;        .scl    2;      .type   32;     .endef
_check2:
LFB1:
        .cfi_startproc
        xorl    %eax, %eax
        cmpb    $0, 4(%esp)
        setg    %al
        ret
        .cfi_endproc
LFE1:
        .def    ___main;        .scl    2;      .type   32;     .endef
        .section        .text.startup,"x"
        .p2align 4,,15
        .globl  _main
        .def    _main;  .scl    2;      .type   32;     .endef

I am using MinGW GCC, but I tested all the compatible versions of GCC and Clang
on godbolt.org Compiler Explorer.

the exact version of GCC: MinGW GCC 6.3.0
the system type: Windows 10 
the options given when GCC was configured/built: N/A
the complete command line that triggers the bug: gcc test.c -O2 -save-temps -S
the compiler output (error messages, warnings, etc.): none
the output of gcc -v:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/6.3.0/lto-wrapper.exe
Target: mingw32
Configured with: ../src/gcc-6.3.0/configure --build=x86_64-pc-linux-gnu
--host=mingw32 --target=mingw32 --with-gmp=/mingw --with-mpfr --with-mpc=/mingw
--with-isl=/mingw --prefix=/mingw --disable-win32-registry --with-arch=i586
--with-tune=generic --enable-languages=c,c++,objc,obj-c++,fortran,ada
--with-pkgversion='MinGW.org GCC-6.3.0-1' --enable-static --enable-shared
--enable-threads --with-dwarf2 --disable-sjlj-exceptions
--enable-version-specific-runtime-libs --with-libiconv-prefix=/mingw
--with-libintl-prefix=/mingw --enable-libstdcxx-debug --enable-libgomp
--disable-libvtv --enable-nls
Thread model: win32
gcc version 6.3.0 (MinGW.org GCC-6.3.0-1)

Reply via email to