https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104952
--- Comment #2 from Tom de Vries <vries at gcc dot gnu.org> --- I think the problem can be seen already at omp-lower, in the body of the butterfly loop. Let's first look at what we have if we use reduction op '|': ... D.2173 = .GOMP_SIMT_VF (); D.2164 = 1; D.2161 = 0; goto <D.2175>; <D.2174>: D.2165 = D.2163; D.2165 = D.2163; D.2166 = .GOMP_SIMT_XCHG_BFLY (D.2165, D.2164); D.2167 = D.2165 | D.2166; D.2163 = D.2167; D.2164 = D.2164 << 1; <D.2175>: if (D.2164 < D.2173) goto <D.2174>; else goto <D.2176>; <D.2176>: ... Fairly straightforward, we have a loop, runs a couple of times, first a shuffle (GOMP_SIMT_XCHG_BFLY), then an update (D.2167 = D.2165 | D.2166). Now compare that with reduction op '||': ... D.2183 = .GOMP_SIMT_VF (); D.2164 = 1; D.2161 = 0; goto <D.2185>; <D.2184>: D.2169 = D.2163; D.2170 = (_Bool) D.2169; if (D.2170 != 0) goto <D.2166>; else goto <D.2171>; <D.2171>: D.2169 = D.2163; D.2172 = .GOMP_SIMT_XCHG_BFLY (D.2169, D.2164); D.2173 = (_Bool) D.2172; if (D.2173 != 0) goto <D.2166>; else goto <D.2167>; <D.2166>: iftmp.5 = 1; goto <D.2168>; <D.2167>: iftmp.5 = 0; <D.2168>: D.2163 = iftmp.5; D.2164 = D.2164 << 1; <D.2185>: if (D.2164 < D.2183) goto <D.2184>; else goto <D.2186>; <D.2186>: ... The shuffle is now conditional. I think the shuffle is inserted too late, in the middle of the update rather than before.