On Mon, May 03, 2021 at 07:03:24PM +0200, Tom de Vries wrote: > + if (sctx->is_simt && !known_eq (sctx->max_vf, 1U)) > + { > + tree c = omp_find_clause (gimple_omp_for_clauses (ctx->stmt), > + OMP_CLAUSE_REDUCTION); > + if (c && OMP_CLAUSE_REDUCTION_PLACEHOLDER (c)) > + /* UDR reductions are not supported yet for SIMT, disable SIMT. */ > + sctx->max_vf = 1;
This isn't sufficient, you could have e.g. 2 reductions, the first non-UDR one and the second one with UDR. So it needs to be a for loop like: for (tree c = gimple_omp_for_clauses (ctx->stmt); c; c = OMP_CLAUSE_CHAIN (c)) if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION && OMP_CLAUSE_REDUCTION_PLACEHOLDER (c)) { /* UDR reductions are not supported yet for SIMT, disable SIMT. */ sctx->max_vf = 1; break; } (or with omp_find_clause used in two spots). Jakub