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

            Bug ID: 118243
           Summary: Incorrect behaviour of complex types in omp parallel
                    regions under -O3
           Product: gcc
           Version: 14.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libgomp
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kobe.bruyninckx at kuleuven dot be
                CC: jakub at gcc dot gnu.org
  Target Milestone: ---

Created attachment 60001
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=60001&action=edit
preprocessed *.ii* file generated by adding -save-temps

When using complex types in a '#pragma omp parallel' region and compiling with
'-O3', GCC 14.2.0 sometimes "sets" them to zero.

GCC version:   14.2.0
System:        Ubuntu 22.04 (AMD 64)
Compilation:   g++ -o bugTest bugTest.cc -fopenmp -O3
Source file:

--- bugTest.cc
#include <iostream>

using complex_t = double __complex__;

struct A {
    complex_t value;
    A(double r) : value{r, 0} {}
};

void test(const complex_t &c, const int &x) {
    if (x < 0)
        std::cout << x;
    else
        std::cout << __real__ c;
}

int main() {
    #pragma omp parallel num_threads(1)
    {
        A a{0.123};        
        test(a.value, 123);
    }
}
--- end of bugTest.cc

Behaviour: The real part of 'c' is 0.123 but 0 is printed instead.

Additional comments: 
 - I have tested this with godbolt as well (https://godbolt.org/z/z5EE4zr1e, 
    https://godbolt.org/z/1bneeajqz);
 - The problem does not occur with GCC 12.4 on my machine;
 - On godbolt, the problem persists starting from version 13.1 up to 'trunk';
 - Using 'std::complex' instead of '__complex__' results in the same bug.

Compiler output:

--- output with '-v save-temps'

/usr/local/gcc-14.2.0/bin/g++-14.2.0 -v -save-temps -fopenmp -O3 bugTest.cc
Using built-in specs.
COLLECT_GCC=/usr/local/gcc-14.2.0/bin/g++-14.2.0
COLLECT_LTO_WRAPPER=/usr/local/gcc-14.2.0/libexec/gcc/x86_64-linux-gnu/14.2.0/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ./configure -v --build=x86_64-linux-gnu
--host=x86_64-linux-gnu --target=x86_64-linux-gnu
--prefix=/usr/local/gcc-14.2.0 --enable-checking=release
--enable-languages=c,c++ --disable-multilib --program-suffix=-14.2.0
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 14.2.0 (GCC) 
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-fopenmp' '-O3' '-shared-libgcc'
'-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'a-'
 /usr/local/gcc-14.2.0/libexec/gcc/x86_64-linux-gnu/14.2.0/cc1plus -E -quiet -v
-imultiarch x86_64-linux-gnu -D_GNU_SOURCE -D_REENTRANT bugTest.cc
-mtune=generic -march=x86-64 -fopenmp -O3 -fpch-preprocess -o a-bugTest.ii
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory
"/usr/local/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/14.2.0/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:

/usr/local/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/14.2.0/../../../../include/c++/14.2.0

/usr/local/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/14.2.0/../../../../include/c++/14.2.0/x86_64-linux-gnu

/usr/local/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/14.2.0/../../../../include/c++/14.2.0/backward
 /usr/local/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/14.2.0/include
 /usr/local/include
 /usr/local/gcc-14.2.0/include

/usr/local/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/14.2.0/include-fixed/x86_64-linux-gnu
 /usr/local/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/14.2.0/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-fopenmp' '-O3' '-shared-libgcc'
'-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'a-'
 /usr/local/gcc-14.2.0/libexec/gcc/x86_64-linux-gnu/14.2.0/cc1plus
-fpreprocessed a-bugTest.ii -quiet -dumpdir a- -dumpbase bugTest.cc
-dumpbase-ext .cc -mtune=generic -march=x86-64 -O3 -version -fopenmp -o
a-bugTest.s
GNU C++17 (GCC) version 14.2.0 (x86_64-linux-gnu)
        compiled by GNU C version 14.2.0, GMP version 6.2.1, MPFR version
4.1.0, MPC version 1.2.1, isl version none
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 8dc42b6e91b7c663c59d77ee8affe43d
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-fopenmp' '-O3' '-shared-libgcc'
'-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'a-'
 as -v --64 -o a-bugTest.o a-bugTest.s
GNU assembler version 2.38 (x86_64-linux-gnu) using BFD version (GNU Binutils
for Ubuntu) 2.38
COMPILER_PATH=/usr/local/gcc-14.2.0/libexec/gcc/x86_64-linux-gnu/14.2.0/:/usr/local/gcc-14.2.0/libexec/gcc/x86_64-linux-gnu/14.2.0/:/usr/local/gcc-14.2.0/libexec/gcc/x86_64-linux-gnu/:/usr/local/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/14.2.0/:/usr/local/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/local/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/14.2.0/:/usr/local/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/14.2.0/../../../../lib64/:/lib/x86_64-linux-gnu/:/lib/../lib64/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib64/:/usr/local/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/14.2.0/../../../:/lib/:/usr/lib/
Reading specs from
/usr/local/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/14.2.0/../../../../lib64/libgomp.spec
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-fopenmp' '-O3' '-shared-libgcc'
'-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'a.'
 /usr/local/gcc-14.2.0/libexec/gcc/x86_64-linux-gnu/14.2.0/collect2 -plugin
/usr/local/gcc-14.2.0/libexec/gcc/x86_64-linux-gnu/14.2.0/liblto_plugin.so
-plugin-opt=/usr/local/gcc-14.2.0/libexec/gcc/x86_64-linux-gnu/14.2.0/lto-wrapper
-plugin-opt=-fresolution=a.res -plugin-opt=-pass-through=-lgcc_s
-plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lpthread
-plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s
-plugin-opt=-pass-through=-lgcc --eh-frame-hdr -m elf_x86_64 -dynamic-linker
/lib64/ld-linux-x86-64.so.2 /lib/x86_64-linux-gnu/crt1.o
/lib/x86_64-linux-gnu/crti.o
/usr/local/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/14.2.0/crtbegin.o
-L/usr/local/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/14.2.0
-L/usr/local/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/14.2.0/../../../../lib64
-L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu
-L/usr/lib/../lib64
-L/usr/local/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/14.2.0/../../.. a-bugTest.o
-lstdc++ -lm -lgomp -lgcc_s -lgcc -lpthread -lc -lgcc_s -lgcc
/usr/local/gcc-14.2.0/lib/gcc/x86_64-linux-gnu/14.2.0/crtend.o
/lib/x86_64-linux-gnu/crtn.o
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-fopenmp' '-O3' '-shared-libgcc'
'-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'a.'

--- end output with '-v save-temps'

Reply via email to