================
@@ -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
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits