llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Pedro da Rosa Pinheiro (pedropiin) <details> <summary>Changes</summary> Implementing the lowering of the `if` clause for the `#pragma omp parallel` directive. The clause accepts an `Expr` and adapts the `mlir::omp::ParallelOp.getIfExprMutable()` accordingly. If the `Expr` is later evaluated to a non-zero value, the region is executed in parallel. Followed the same approach as the one in my other PR #<!-- -->202466 and based myself off of PR #<!-- -->172501 that implements the lowering for the `proc_bind` clause. Also following the adaptations done in PR #<!-- -->181841 to support the use of `UnrealizedConversionCast` when enabling the CIR pipeline. PR #<!-- -->196363 implemented a separate approach to deal with this, but got blocked. ### Evidence: Output of: `python3 build/bin/llvm-lit -sv clang/test/CIR/CodeGenOpenMP/parallel.c` ``` /CodeGenOpenMP/parallel.c llvm-lit: /home/pedro/dev/projects/llvm-project-fork/llvm/utils/lit/lit/llvm/config.py:569: note: using clang: /home/pedro/dev/projects/llvm-project-fork/build/bin/clang Testing Time: 0.05s Total Discovered Tests: 1 Passed: 1 (100.00%) ``` --- Full diff: https://github.com/llvm/llvm-project/pull/204999.diff 3 Files Affected: - (modified) clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp (+20) - (modified) clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp (+3) - (modified) clang/test/CIR/CodeGenOpenMP/parallel.c (+22) ``````````diff diff --git a/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp b/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp index a0f0ea9299c8d..5ed80c7a01b5f 100644 --- a/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp @@ -66,6 +66,26 @@ class OpenMPClauseCIREmitter final } } + void VisitOMPIfClause(const OMPIfClause *clause) { + if constexpr (std::is_same_v<OpTy, mlir::omp::ParallelOp>) { + Expr *ifExpr = clause->getCondition(); + mlir::Value ifValue = cgf.emitScalarExpr(ifExpr); + mlir::Location ifLoc = + cgf.cgm.getLoc(ifExpr->getBeginLoc()); + + mlir::Type stdBoolType = builder.getI1Type(); + + mlir::Value unrealizedCastIf = + mlir::UnrealizedConversionCastOp::create(builder, ifLoc, stdBoolType, ifValue).getResult(0); + + operation.getIfExprMutable().append(unrealizedCastIf); + } else { + cgf.cgm.errorNYI( + clause->getBeginLoc(), + "OMPProcBindClause unimplemented on this directive kind"); + } + } + void emitClauses(ArrayRef<const OMPClause *> clauses) { for (const auto *c : clauses) this->Visit(c); diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index c844375a000e0..2dc8dc45258dc 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -17,6 +17,7 @@ #include "mlir/Conversion/LLVMCommon/TypeConverter.h" #include "mlir/Conversion/OpenMPToLLVM/ConvertOpenMPToLLVM.h" +#include "mlir/Conversion/ReconcileUnrealizedCasts/ReconcileUnrealizedCasts.h" #include "mlir/Dialect/DLTI/DLTI.h" #include "mlir/Dialect/Func/IR/FuncOps.h" #include "mlir/Dialect/LLVMIR/LLVMDialect.h" @@ -3695,6 +3696,7 @@ void ConvertCIRToLLVMPass::runOnOperation() { mlir::populateOpenMPToLLVMConversionPatterns(converter, patterns); target.addIllegalDialect<mlir::BuiltinDialect, cir::CIRDialect, mlir::func::FuncDialect>(); + target.addLegalOp<mlir::UnrealizedConversionCastOp>(); llvm::SmallVector<mlir::Operation *> ops; ops.push_back(module); @@ -4935,6 +4937,7 @@ void populateCIRToLLVMPasses(mlir::OpPassManager &pm) { mlir::populateCIRPreLoweringPasses(pm); pm.addPass(mlir::omp::createMarkDeclareTargetPass()); pm.addPass(createConvertCIRToLLVMPass()); + pm.addPass(mlir::createReconcileUnrealizedCastsPass()); } std::unique_ptr<llvm::Module> diff --git a/clang/test/CIR/CodeGenOpenMP/parallel.c b/clang/test/CIR/CodeGenOpenMP/parallel.c index 36a48b38ee789..b3b82fbd3ea23 100644 --- a/clang/test/CIR/CodeGenOpenMP/parallel.c +++ b/clang/test/CIR/CodeGenOpenMP/parallel.c @@ -84,3 +84,25 @@ void proc_bind_parallel() { // CHECK-NEXT: omp.terminator // CHECK-NEXT: } } + +void if_parallel() { + // CHECK: omp.parallel if(%{{.*}}) { +#pragma omp parallel if (1) + {} + // CHECK-NEXT: omp.terminator + // CHECK-NEXT: } + +int validCondition = 10; + // CHECK: omp.parallel if(%{{.*}}) { +#pragma omp parallel if (validCondition) + {} + // CHECK-NEXT: omp.terminator + // CHECK-NEXT: } + +void *nullPtr = ((void *)0); + // CHECK: omp.parallel if(%{{.*}}) { +#pragma omp parallel if (nullPtr) + {} + // CHECK-NEXT: omp.terminator + // CHECK-NEXT: } +} `````````` </details> https://github.com/llvm/llvm-project/pull/204999 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
