[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