https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67558
Bug ID: 67558 Summary: [C++] OpenMP "if" clause does not utilize compile-time constants Product: gcc Version: 5.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: bisqwit at iki dot fi Target Milestone: --- Consider this example code. unsigned x; template<bool Threads> void plain_if(unsigned y) { if(Threads) { #pragma omp task firstprivate(y) shared(x) x = y >> 1; } else { x = y >> 1; } } template<bool Threads> void omp_if(unsigned y) { #pragma omp task if(Threads) firstprivate(y) shared(x) x = y >> 1; } void plain_if_false(unsigned y) { plain_if<false>(y); } void plain_if_true(unsigned y) { plain_if<true>(y); } void omp_if_false(unsigned y) { omp_if<false>(y); } void omp_if_true(unsigned y) { omp_if<true>(y); } plain_if and omp_if do essentially the same thing. In both of them, the template parameter "Threads" controls whether to create an OpenMP task for the action or not. However, when the code is compiled, all functions explicitly call GOMP_task, except plain_if<false>. It is clear that GCC treats a plain if() differently than an OpenMP if(). It is a case of lacking optimization.