llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
28.04k stars 11.58k forks source link

omp simd reduction "loop not vectorized" warning for a simple loop that even seems vectorized #39892

Closed llvmbot closed 5 years ago

llvmbot commented 5 years ago
Bugzilla Link 40546
Resolution FIXED
Resolved on Feb 05, 2019 04:52
Version 8.0
OS Linux
Blocks llvm/llvm-project#39678
Attachments compile with -fopenmp -O2
Reporter LLVM Bugzilla Contributor
CC @zmodem,@hfinkel,@Meinersbur
Fixed by commit(s) r353082

Extended Description

clang8 emits warning

"loop not vectorized: the optimizer was unable to perform the requested transformation; the transformation might be disabled or specified as part of an unsupported transformation ordering [-Wpass-failed=transform-warning]"

for the following example, when compiled with "-fopenmp -O2". The generated code is, however, vectorized and is almost identical to the code generated by clang7, which does not emit the warning. The same problem as in clang8 is in the current clang9 (and the emitted code is identical). clang6 produces similar code, vectorizes the loop, and does not emit the warning, either.

The warning is generated twice when compiling the example, with identical texts and code locations, and counted as "2 warnings".

int maybeNotFinite(double *x, unsigned n) { double s = 0;

#pragma omp simd reduction(+:s)
for (unsigned i = 0; i < n; i++)
    s += x[i];
return !finite(s);

}

tested on Ubuntu 18.04.1 with clang from apt.llvm.org clang version 8.0.0-svn352547-1~exp1~20190130015936.13 (branches/release_80) clang version 7.0.1-svn348686-1~exp1~20190113235231.54 (branches/release_70) clang version 9.0.0-svn352666-1~exp1+0~20190130204444.773~1.gbp5cc800 (trunk)

and on clang from Ubuntu 18.04.1 clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)

zmodem commented 5 years ago

Thanks for the report. See https://reviews.llvm.org/D57542 for a fix.

We should consider this for clang-8 as well.

Merged the fix in r353166, thanks.

Meinersbur commented 5 years ago

Thanks for the report. See https://reviews.llvm.org/D57542 for a fix.

We should consider this for clang-8 as well.

Meinersbur commented 5 years ago

LoopVectorize adds llvm.loop.isvectorized, but leaves llvm.loop.vectorize.enable which is reported (for the vectorized loop and the fallback). The function hasVectorizeTransformation considers this, but with different priorization. Working on it.