[Mlir-commits] [mlir] [flang][OpenMP] Translate OpenMP scopes when compiling for target device (PR #130078)
Kareem Ergawy
llvmlistbot at llvm.org
Fri Mar 7 00:25:13 PST 2025
================
@@ -5255,6 +5256,49 @@ convertTargetOpsInNest(Operation *op, llvm::IRBuilderBase &builder,
return WalkResult::interrupt();
return WalkResult::skip();
}
+
+ // Non-target ops might nest target-related ops, therefore, we
+ // translate them as non-OpenMP scopes. Translating them is needed by
+ // nested target-related ops since they might LLVM values defined in
+ // their parent non-target ops.
+ if (isa<omp::OpenMPDialect>(oper->getDialect()) &&
+ oper->getParentOfType<LLVM::LLVMFuncOp>() &&
+ !oper->getRegions().empty()) {
+
+ // TODO Handle other ops with entry block args.
+ if (auto wsloop = dyn_cast<omp::WsloopOp>(oper)) {
+ auto blockArgIface = cast<omp::BlockArgOpenMPOpInterface>(oper);
+ if (blockArgIface) {
+ forwardArgs(moduleTranslation,
+ blockArgIface.getPrivateBlockArgs(),
+ wsloop.getPrivateVars());
+ forwardArgs(moduleTranslation,
+ blockArgIface.getReductionBlockArgs(),
+ wsloop.getReductionVars());
+ }
+ }
+
+ if (auto loopNest = dyn_cast<omp::LoopNestOp>(oper)) {
+ for (auto iv : loopNest.getIVs()) {
+ // Create fake allocas just to maintain IR validity.
+ moduleTranslation.mapValue(
+ iv, builder.CreateAlloca(
+ moduleTranslation.convertType(iv.getType())));
+ }
+ }
+
+ for (Region ®ion : oper->getRegions()) {
+ auto result = convertOmpOpRegions(
+ region, oper->getName().getStringRef().str() + ".fake.region",
+ builder, moduleTranslation);
+ if (result.takeError())
+ return WalkResult::interrupt();
----------------
ergawy wrote:
First part works. Second one, we have to return `interrupt`. Did I miss something?
https://github.com/llvm/llvm-project/pull/130078
More information about the Mlir-commits
mailing list