Skip to content

Commit 8582750

Browse files
committed
[flang][cuda] Update c_loc with device variable to get host address
1 parent c0073a9 commit 8582750

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

flang/lib/Optimizer/Builder/IntrinsicCall.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3516,11 +3516,23 @@ static mlir::Value getAddrFromBox(fir::FirOpBuilder &builder,
35163516
return addr;
35173517
}
35183518

3519+
static void clocDeviceArgRewrite(fir::ExtendedValue arg) {
3520+
// Special case for device address in c_loc.
3521+
if (auto emboxOp = mlir::dyn_cast_or_null<fir::EmboxOp>(
3522+
fir::getBase(arg).getDefiningOp()))
3523+
if (auto declareOp = mlir::dyn_cast_or_null<hlfir::DeclareOp>(
3524+
emboxOp.getMemref().getDefiningOp()))
3525+
if (declareOp.getDataAttr() &&
3526+
declareOp.getDataAttr() == cuf::DataAttribute::Device)
3527+
emboxOp.getMemrefMutable().assign(declareOp.getMemref());
3528+
}
3529+
35193530
static fir::ExtendedValue
35203531
genCLocOrCFunLoc(fir::FirOpBuilder &builder, mlir::Location loc,
35213532
mlir::Type resultType, llvm::ArrayRef<fir::ExtendedValue> args,
35223533
bool isFunc = false, bool isDevLoc = false) {
35233534
assert(args.size() == 1);
3535+
clocDeviceArgRewrite(args[0]);
35243536
mlir::Value res = fir::AllocaOp::create(builder, loc, resultType);
35253537
mlir::Value resAddr;
35263538
if (isDevLoc)

0 commit comments

Comments
 (0)