[clang] [CIR][HIP] Support managed variables (PR #230910)

Arseniy Obolenskiy via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 12 08:55:53 PDT 2026


================
@@ -3287,18 +3296,38 @@ void LoweringPreparePass::buildCUDARegisterVars(cir::CIRBaseBuilderTy &builder,
       llvm_unreachable("Texture registration NYI");
     }
 
-    if (regAttr.getIsManaged())
-      llvm_unreachable("Managed variable registration NYI");
+    // External managed variables are registered by their defining TU.
+    if (regAttr.getIsManaged() && global.isDeclaration())
+      continue;
 
     GlobalOp deviceNameStr = makeConstantString(regAttr.getDeviceSideName());
     mlir::Value deviceName = builder.createBitcast(
         builder.createGetGlobal(deviceNameStr), voidPtrTy);
     mlir::Value hostVar =
         builder.createBitcast(builder.createGetGlobal(global), voidPtrTy);
 
+    llvm::TypeSize size = dataLayout.getTypeAllocSize(global.getSymType());
+
+    if (regAttr.getIsManaged()) {
+      llvm::StringRef name = global.getSymName();
+      assert(name.ends_with(".managed") &&
+             "HIP managed variables not transformed");
+      auto managedVar = mlirModule.lookupSymbol<GlobalOp>(
+          name.drop_back(llvm::StringRef(".managed").size()));
+      mlir::Value managedPtr =
+          builder.createBitcast(builder.createGetGlobal(managedVar), voidPtrTy);
+      auto varSize = ConstantOp::create(
+          builder, loc, IntAttr::get(sizeTy, size.getFixedValue()));
+      auto align = ConstantOp::create(
+          builder, loc, IntAttr::get(intTy, global.getAlignment().value_or(1)));
+      builder.createCallOp(
+          loc, cudaRegisterManagedVar,
+          {fatbinHandle, managedPtr, hostVar, deviceName, varSize, align});
+      continue;
----------------
aobolensk wrote:

Done

https://github.com/llvm/llvm-project/pull/230910


More information about the cfe-commits mailing list