[Openmp-commits] [flang] [mlir] [openmp] [Flang][OpenMP] Add support for interop construct (PR #203959)
Sairudra More via Openmp-commits
openmp-commits at lists.llvm.org
Fri Jul 3 00:03:57 PDT 2026
================
@@ -3711,6 +3711,98 @@ convertOmpTaskgroupOp(omp::TaskgroupOp tgOp, llvm::IRBuilderBase &builder,
return success();
}
+static LogicalResult
+convertOmpInteropInitOp(omp::InteropInitOp initOp, llvm::IRBuilderBase &builder,
+ LLVM::ModuleTranslation &moduleTranslation) {
+ if (!initOp.getDependVars().empty() || initOp.getDependKinds() ||
+ !initOp.getDependIterated().empty() || initOp.getDependIteratedKinds())
+ return initOp.emitError()
+ << "not yet implemented: Unhandled clause depend in "
+ << omp::InteropInitOp::getOperationName() << " operation";
+
+ llvm::OpenMPIRBuilder *ompBuilder = moduleTranslation.getOpenMPBuilder();
+ llvm::Value *interopVar =
+ moduleTranslation.lookupValue(initOp.getInteropVar());
+ llvm::Value *device = initOp.getDevice()
+ ? moduleTranslation.lookupValue(initOp.getDevice())
+ : nullptr;
+
+ // TODO: Handle depend clauses when supported.
+ llvm::Value *numDeps = llvm::ConstantInt::get(builder.getInt32Ty(), 0);
+ llvm::Value *depArray = llvm::ConstantPointerNull::get(builder.getPtrTy());
+ bool hasNowait = initOp.getNowait();
+
+ // Emit one call per interop type. The runtime expects a single type per call.
+ for (auto typeAttr : initOp.getInteropTypes()) {
+ auto interopTypeEnum = cast<omp::InteropTypeAttr>(typeAttr).getValue();
+ llvm::omp::OMPInteropType interopType;
+ switch (interopTypeEnum) {
+ case omp::InteropType::target:
+ interopType = llvm::omp::OMPInteropType::Target;
+ break;
+ case omp::InteropType::targetsync:
+ interopType = llvm::omp::OMPInteropType::TargetSync;
+ break;
+ }
+ ompBuilder->createOMPInteropInit(builder, interopVar, interopType, device,
----------------
Saieiei wrote:
Could we cast the `device` value to the runtime device-id type before passing it to `createOMPInteropInit`?
This currently crashes for a wider Fortran integer device expression:
```fortran
integer(8) :: dev
integer(omp_interop_kind) :: obj
!$omp interop device(dev) init(target: obj)
```
The runtime call expects an `i32` device argument, but the lowered value remains `i64`, which triggers a bad function-call signature assertion during LLVM IR generation. The regular `omp target device(i64)` path compiles successfully, so this looks specific to the interop translation path.
https://github.com/llvm/llvm-project/pull/203959
More information about the Openmp-commits
mailing list