http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58482
Bug ID: 58482 Summary: gomp4: user defined reduction produce wrong result Product: gcc Version: 4.9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libgomp Assignee: unassigned at gcc dot gnu.org Reporter: vincenzo.innocente at cern dot ch CC: jakub at gcc dot gnu.org I acknowledge that my understanding of "omp declare" is still limited. Still the example below produces different result with and w/o -fopenmp gcc version 4.9.0 20130919 (experimental) [gomp-4_0-branch revision 202766] (GCC) pb-d-128-141-131-94:vectorize innocent$ c++ -std=c++11 ured_omp4.cpp -O -ftree-vectorizer-verbose=1; ./a.out 523776,-523776 pb-d-128-141-131-94:vectorize innocent$ c++ -std=c++11 ured_omp4.cpp -O -ftree-vectorizer-verbose=1 -fopenmp; ./a.out ured_omp4.cpp:26:8: note: loop turned into non-loop; it never loops ured_omp4.cpp:26:8: note: loop turned into non-loop; it never loops 523776,523776 cat ured_omp4.cpp #define Type float struct TwoInt { Type a=0; Type b=0; #pragma omp declare simd TwoInt & operator+=(TwoInt rh) { a+=rh.a; b-=rh.b; } #pragma omp declare simd TwoInt & add(TwoInt rh) { a+=rh.a; b-=rh.b; return *this; } }; #pragma omp declare reduction (foo:struct TwoInt: omp_out.add(omp_in)) TwoInt sum(Type const * q, int NN) { TwoInt s; #pragma omp simd reduction(foo:s) for (int i=0;i<NN;++i) { TwoInt l; l.a=q[i]; l.b = q[i]; s.add(l); } return s; } #include<iostream> int main() { constexpr int NN=1024; Type q[NN]; Type a=0; for (auto & e: q) e=a++; auto s = sum(q,NN); std::cout << s.a << "," << s.b << std::endl; return 0; }