hishiguro updated this revision to Diff 264836. hishiguro retitled this revision from "[OpenMP] Fix omp and clang pragmas" to "[OPENMP] Fix mixture of omp and clang pragmas". hishiguro added a comment. Herald added a reviewer: a.sidorin.
I checked that your comments are correct. I modified the source, and added a test. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D79921/new/ https://reviews.llvm.org/D79921 Files: clang/lib/CodeGen/CGStmtOpenMP.cpp clang/test/OpenMP/omp_with_loop_pragma.c Index: clang/test/OpenMP/omp_with_loop_pragma.c =================================================================== --- /dev/null +++ clang/test/OpenMP/omp_with_loop_pragma.c @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -verify -fopenmp -x c -emit-llvm %s -triple x86_64-unknown-linux -o - -femit-all-decls -disable-llvm-passes | FileCheck %s +// RUN: %clang_cc1 -verify -x c -emit-llvm %s -triple x86_64-unknown-linux -o - -femit-all-decls -disable-llvm-passes | FileCheck %s +// expected-no-diagnostics + +// CHECK: !{{[0-9]+}} = !{!"llvm.loop.vectorize.width", i32 1} +void sub(double * restrict a, double * restrict b, int n){ + int i; + +#pragma omp parallel for +#pragma clang loop vectorize(disable) + for(i=0;i<n;i++){ + a[i] = a[i] + b[i]; + } +} Index: clang/lib/CodeGen/CGStmtOpenMP.cpp =================================================================== --- clang/lib/CodeGen/CGStmtOpenMP.cpp +++ clang/lib/CodeGen/CGStmtOpenMP.cpp @@ -1730,8 +1730,19 @@ auto CondBlock = createBasicBlock("omp.inner.for.cond"); EmitBlock(CondBlock); const SourceRange R = S.getSourceRange(); - LoopStack.push(CondBlock, SourceLocToDebugLoc(R.getBegin()), - SourceLocToDebugLoc(R.getEnd())); + + // If attributes are attached, push to the basic block with them. + const OMPExecutableDirective *OMPED = dyn_cast<OMPExecutableDirective>(&S); + const CapturedStmt *ICS = OMPED->getInnermostCapturedStmt(); + const Stmt *SS = ICS->getCapturedStmt(); + const AttributedStmt *AS = dyn_cast_or_null<AttributedStmt>(SS); + if (AS) + LoopStack.push(CondBlock, CGM.getContext(), CGM.getCodeGenOpts(), + AS->getAttrs(), SourceLocToDebugLoc(R.getBegin()), + SourceLocToDebugLoc(R.getEnd())); + else + LoopStack.push(CondBlock, SourceLocToDebugLoc(R.getBegin()), + SourceLocToDebugLoc(R.getEnd())); // If there are any cleanups between here and the loop-exit scope, // create a block to stage a loop exit along.
Index: clang/test/OpenMP/omp_with_loop_pragma.c =================================================================== --- /dev/null +++ clang/test/OpenMP/omp_with_loop_pragma.c @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -verify -fopenmp -x c -emit-llvm %s -triple x86_64-unknown-linux -o - -femit-all-decls -disable-llvm-passes | FileCheck %s +// RUN: %clang_cc1 -verify -x c -emit-llvm %s -triple x86_64-unknown-linux -o - -femit-all-decls -disable-llvm-passes | FileCheck %s +// expected-no-diagnostics + +// CHECK: !{{[0-9]+}} = !{!"llvm.loop.vectorize.width", i32 1} +void sub(double * restrict a, double * restrict b, int n){ + int i; + +#pragma omp parallel for +#pragma clang loop vectorize(disable) + for(i=0;i<n;i++){ + a[i] = a[i] + b[i]; + } +} Index: clang/lib/CodeGen/CGStmtOpenMP.cpp =================================================================== --- clang/lib/CodeGen/CGStmtOpenMP.cpp +++ clang/lib/CodeGen/CGStmtOpenMP.cpp @@ -1730,8 +1730,19 @@ auto CondBlock = createBasicBlock("omp.inner.for.cond"); EmitBlock(CondBlock); const SourceRange R = S.getSourceRange(); - LoopStack.push(CondBlock, SourceLocToDebugLoc(R.getBegin()), - SourceLocToDebugLoc(R.getEnd())); + + // If attributes are attached, push to the basic block with them. + const OMPExecutableDirective *OMPED = dyn_cast<OMPExecutableDirective>(&S); + const CapturedStmt *ICS = OMPED->getInnermostCapturedStmt(); + const Stmt *SS = ICS->getCapturedStmt(); + const AttributedStmt *AS = dyn_cast_or_null<AttributedStmt>(SS); + if (AS) + LoopStack.push(CondBlock, CGM.getContext(), CGM.getCodeGenOpts(), + AS->getAttrs(), SourceLocToDebugLoc(R.getBegin()), + SourceLocToDebugLoc(R.getEnd())); + else + LoopStack.push(CondBlock, SourceLocToDebugLoc(R.getBegin()), + SourceLocToDebugLoc(R.getEnd())); // If there are any cleanups between here and the loop-exit scope, // create a block to stage a loop exit along.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits