[OPENMP] Fix mixture of omp and clang pragmas
Fixes PR45753 When a program that contains a loop to which both `omp parallel for` pragma and `clang loop` pragma are associated is compiled with the -fopenmp option, `clang loop` pragma did not take effect. The example below should not be vectorized by the `clang loop` pragma but it was actually vectorized. The cause is that `llvm.loop.vectorize.width` was not output to the IR when -fopenmp is specified. The fix attaches attributes if they exist for the loop. [example.c] ``` int a[100], b[100]; void foo() { #pragma omp parallel for #pragma clang loop vectorize(disable) for (int i = 0; i < 100; i++) a[i] += b[i] * i; } ``` [compile] ``` $ clang -O2 -fopenmp example.c -c -Rpass=vect example.c:3:11: remark: vectorized loop (vectorization width: 4, interleaved count: 2) [-Rpass=loop-vectorize] #pragma omp parallel for ^ ``` [IR with -fopenmp] ``` $ clang -O2 exmaple.c -S -emit-llvm -mllvm -disable-llvm-optzns -o - -fopenmp | grep 'vectorize\.width' ``` [IR with -fno-openmp] ``` $ clang -O2 example.c -S -emit-llvm -mllvm -disable-llvm-optzns -o - -fno-openmp | grep 'vectorize\.width' !7 = !{!"llvm.loop.vectorize.width", i32 1} ``` Differential Revision: https://reviews.llvm.org/D79921
Loading
Please sign in to comment