[clang] [OpenMP][CIR] Implement basic 'parallel' lowering + some clause infra (PR #172308)
Erich Keane via cfe-commits
cfe-commits at lists.llvm.org
Mon Dec 15 06:44:59 PST 2025
================
@@ -0,0 +1,63 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Emit OpenMP clause nodes as CIR code.
+//
+//===----------------------------------------------------------------------===//
+
+#include "CIRGenFunction.h"
+#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
+
+using namespace clang;
+using namespace clang::CIRGen;
+
+namespace {
+template <typename OpTy>
+class OpenMPClauseCIREmitter final
+ : public ConstOMPClauseVisitor<OpenMPClauseCIREmitter<OpTy>> {
+ OpTy &operation;
+ CIRGen::CIRGenFunction &cgf;
+ CIRGen::CIRGenBuilderTy &builder;
+
+public:
+ OpenMPClauseCIREmitter(OpTy &operation, CIRGen::CIRGenFunction &cgf,
+ CIRGen::CIRGenBuilderTy &builder)
+ : operation(operation), cgf(cgf), builder(builder) {}
+
+ void VisitOMPClause(const OMPClause *clause) {
+ cgf.cgm.errorNYI(clause->getBeginLoc(), "OpenMPClause ",
+ clause->getClauseKind());
+ }
+
+ void emitClauses(ArrayRef<const OMPClause *> clauses) {
+ for (const auto *c : clauses)
+ this->Visit(c);
+ }
+};
+template <typename OpTy>
+auto makeClauseEmitter(OpTy &op, CIRGen::CIRGenFunction &cgf,
+ CIRGen::CIRGenBuilderTy &builder) {
+ return OpenMPClauseCIREmitter<OpTy>(op, cgf, builder);
+}
+} // namespace
+
+template <typename Op>
+void CIRGenFunction::emitOpenMPClauses(Op &op,
+ ArrayRef<const OMPClause *> clauses) {
+ mlir::OpBuilder::InsertionGuard guardCase(builder);
+ builder.setInsertionPoint(op);
+ makeClauseEmitter(op, *this, builder).emitClauses(clauses);
+}
+
+// We're defining the template for this in a .cpp file, so we have to explicitly
+// specialize the templates.
+#define EXPL_SPEC(N) \
+ template void CIRGenFunction::emitOpenMPClauses<N>( \
+ N &, ArrayRef<const OMPClause *>);
+EXPL_SPEC(mlir::omp::ParallelOp)
----------------
erichkeane wrote:
I did the same thing here for OpenACC, we'll end up having to manually instantiate each of these (though it is pretty trivial to do so), but it means a significant build-time improvement by only instantiating the visitors 1x.
https://github.com/llvm/llvm-project/pull/172308
More information about the cfe-commits
mailing list