[Mlir-commits] [mlir] [OpenMP]Support for lowering masked op (PR #98401)
Anchu Rajendran S
llvmlistbot at llvm.org
Thu Jul 11 10:23:04 PDT 2024
https://github.com/anchuraj updated https://github.com/llvm/llvm-project/pull/98401
>From 2cc94deaa85d8e4984a11cee4e3dbb00ef28c405 Mon Sep 17 00:00:00 2001
From: Anchu Rajendran <asudhaku at amd.com>
Date: Wed, 10 Jul 2024 17:08:41 -0500
Subject: [PATCH 1/2] [OpenMP]Support for lowering masked op
---
.../OpenMP/OpenMPToLLVMIRTranslation.cpp | 40 +++++++++++++++++++
mlir/test/Target/LLVMIR/openmp-llvm.mlir | 29 ++++++++++++++
2 files changed, 69 insertions(+)
diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
index 0c9c699a1f390..591900723e2e9 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
@@ -264,6 +264,43 @@ static llvm::omp::ProcBindKind getProcBindKind(omp::ClauseProcBindKind kind) {
llvm_unreachable("Unknown ClauseProcBindKind kind");
}
+/// Converts an OpenMP 'masked' operation into LLVM IR using OpenMPIRBuilder.
+static LogicalResult
+convertOmpMasked(Operation &opInst, llvm::IRBuilderBase &builder,
+ LLVM::ModuleTranslation &moduleTranslation) {
+ auto maskedOp = cast<omp::MaskedOp>(opInst);
+ using InsertPointTy = llvm::OpenMPIRBuilder::InsertPointTy;
+ // TODO: support error propagation in OpenMPIRBuilder and use it instead of
+ // relying on captured variables.
+ LogicalResult bodyGenStatus = success();
+
+ auto bodyGenCB = [&](InsertPointTy allocaIP, InsertPointTy codeGenIP) {
+ // MaskedOp has only one region associated with it.
+ auto ®ion = maskedOp.getRegion();
+ builder.restoreIP(codeGenIP);
+ convertOmpOpRegions(region, "omp.masked.region", builder, moduleTranslation,
+ bodyGenStatus);
+ };
+
+ // TODO: Perform finalization actions for variables. This has to be
+ // called for variables which have destructors/finalizers.
+ auto finiCB = [&](InsertPointTy codeGenIP) {};
+
+ llvm::Value *filterVal = nullptr;
+ if (auto filterVar = maskedOp.getFilteredThreadId()) {
+ filterVal = moduleTranslation.lookupValue(filterVar);
+ } else {
+ llvm::LLVMContext &llvmContext = builder.getContext();
+ filterVal =
+ llvm::ConstantInt::get(llvm::Type::getInt32Ty(llvmContext), /*V=*/0);
+ }
+ assert(filterVal != nullptr);
+ llvm::OpenMPIRBuilder::LocationDescription ompLoc(builder);
+ builder.restoreIP(moduleTranslation.getOpenMPBuilder()->createMasked(
+ ompLoc, bodyGenCB, finiCB, filterVal));
+ return success();
+}
+
/// Converts an OpenMP 'master' operation into LLVM IR using OpenMPIRBuilder.
static LogicalResult
convertOmpMaster(Operation &opInst, llvm::IRBuilderBase &builder,
@@ -3330,6 +3367,9 @@ convertHostOrTargetOperation(Operation *op, llvm::IRBuilderBase &builder,
.Case([&](omp::ParallelOp op) {
return convertOmpParallel(op, builder, moduleTranslation);
})
+ .Case([&](omp::MaskedOp) {
+ return convertOmpMasked(*op, builder, moduleTranslation);
+ })
.Case([&](omp::MasterOp) {
return convertOmpMaster(*op, builder, moduleTranslation);
})
diff --git a/mlir/test/Target/LLVMIR/openmp-llvm.mlir b/mlir/test/Target/LLVMIR/openmp-llvm.mlir
index dfeaf4be33adb..188e570d01465 100644
--- a/mlir/test/Target/LLVMIR/openmp-llvm.mlir
+++ b/mlir/test/Target/LLVMIR/openmp-llvm.mlir
@@ -310,6 +310,35 @@ llvm.func @test_omp_master() -> () {
// -----
+// CHECK-LABEL: define void @test_omp_masked({{.*}})
+llvm.func @test_omp_masked(%arg0: i32)-> () {
+// CHECK: call void {{.*}}@__kmpc_fork_call{{.*}} @{{.*}})
+// CHECK: omp.par.region1:
+ omp.parallel {
+ omp.masked filter(%arg0: i32) {
+// CHECK: [[OMP_THREAD_3_4:%.*]] = call i32 @__kmpc_global_thread_num(ptr @{{[0-9]+}})
+// CHECK: {{[0-9]+}} = call i32 @__kmpc_masked(ptr @{{[0-9]+}}, i32 [[OMP_THREAD_3_4]], i32 %{{[0-9]+}})
+// CHECK: omp.masked.region
+// CHECK: call void @__kmpc_end_masked(ptr @{{[0-9]+}}, i32 [[OMP_THREAD_3_4]])
+// CHECK: br label %omp_region.end
+ omp.terminator
+ }
+ omp.terminator
+ }
+ omp.parallel {
+ omp.parallel {
+ omp.masked filter(%arg0: i32){
+ omp.terminator
+ }
+ omp.terminator
+ }
+ omp.terminator
+ }
+ llvm.return
+}
+
+// -----
+
// CHECK: %struct.ident_t = type
// CHECK: @[[$loc:.*]] = private unnamed_addr constant {{.*}} c";unknown;unknown;{{[0-9]+}};{{[0-9]+}};;\00"
// CHECK: @[[$loc_struct:.*]] = private unnamed_addr constant %struct.ident_t {{.*}} @[[$loc]] {{.*}}
>From 9ddf970cefbf14a86e887bbca33be99eda077795 Mon Sep 17 00:00:00 2001
From: Anchu Rajendran <asudhaku at amd.com>
Date: Thu, 11 Jul 2024 12:22:42 -0500
Subject: [PATCH 2/2] R2: Removing unnecessary code
---
mlir/test/Target/LLVMIR/openmp-llvm.mlir | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/mlir/test/Target/LLVMIR/openmp-llvm.mlir b/mlir/test/Target/LLVMIR/openmp-llvm.mlir
index 188e570d01465..4a42737491a7f 100644
--- a/mlir/test/Target/LLVMIR/openmp-llvm.mlir
+++ b/mlir/test/Target/LLVMIR/openmp-llvm.mlir
@@ -325,15 +325,6 @@ llvm.func @test_omp_masked(%arg0: i32)-> () {
}
omp.terminator
}
- omp.parallel {
- omp.parallel {
- omp.masked filter(%arg0: i32){
- omp.terminator
- }
- omp.terminator
- }
- omp.terminator
- }
llvm.return
}
More information about the Mlir-commits
mailing list