HomePhabricator

[OPENMP] Fix mixture of omp and clang pragmas

Authored by hishiguro on May 21 2020, 7:34 PM.

Description

[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

Details

Committed
kawashima-fjMay 21 2020, 8:53 PM
Differential Revision
D79921: [OPENMP] Fix mixture of omp and clang pragmas
Parents
rG9b7fba142111: [docs][llvm-extract] Add missing alias/bb options
Branches
Unknown
Tags
Unknown