Razvan Lupusoru ab7217a089
[acc][flang] Add isDeviceData APIs for device data detection (#176219)
Add comprehensive APIs to detect device-resident data across OpenACC
type and operation interfaces. This enables passes to identify data that
is already on the device (e.g., CUF device/managed/constant memory, GPU
address spaces) and handle it appropriately.

New interface methods:
- PointerLikeType::isDeviceData(Value): Returns true if the pointer
points to device data.
- MappableType::isDeviceData(Value): Returns true if the variable
represents device data.
- GlobalVariableOpInterface::isDeviceData(): Returns true if the global
variable is device data.

New utilities in OpenACCUtils:
- acc::isDeviceValue(Value): Checks if a value represents device data by
querying type interfaces, PartialEntityAccessOpInterface for base
entities, and AddressOfGlobalOpInterface for global symbols.
- acc::isValidValueUse(Value, Region): Checks if a value is legal in an
OpenACC region by verifying it comes from a data operation, is only used
by private clauses, or is device data.

Updated isValidSymbolUse to check
GlobalVariableOpInterface::isDeviceData()
for symbols referencing device-resident globals.

FIR implementations check for CUF data attributes (device, managed,
constant, shared, unified) on operations, block arguments, and globals.
The implementation traces through fir.rebox, fir.embox, fir.declare,
hlfir.declare, and fir.address_of to find the underlying data source.

Memref implementations check for gpu::AddressSpaceAttr on the memref
type.

Updated ACCImplicitData to use acc::isDeviceValue for generating
acc.deviceptr clauses for device-resident data instead of
copyin/copyout.

Updated OpenACCSupport::isValidValueUse to fallback to the new
acc::isValidValueUse utility.
2026-01-15 20:56:26 +00:00

67 lines
2.3 KiB
C++

//===- OpenACCSupport.cpp - OpenACCSupport Implementation -----------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file implements the OpenACCSupport analysis interface.
//
//===----------------------------------------------------------------------===//
#include "mlir/Dialect/OpenACC/Analysis/OpenACCSupport.h"
#include "mlir/Dialect/OpenACC/OpenACCUtils.h"
namespace mlir {
namespace acc {
std::string OpenACCSupport::getVariableName(Value v) {
if (impl)
return impl->getVariableName(v);
return acc::getVariableName(v);
}
std::string OpenACCSupport::getRecipeName(RecipeKind kind, Type type,
Value var) {
if (impl)
return impl->getRecipeName(kind, type, var);
// The default implementation assumes that only type matters
// and the actual instance of variable is not relevant.
auto recipeName = acc::getRecipeName(kind, type);
if (recipeName.empty())
emitNYI(var ? var.getLoc() : UnknownLoc::get(type.getContext()),
"variable privatization (incomplete recipe name handling)");
return recipeName;
}
InFlightDiagnostic OpenACCSupport::emitNYI(Location loc, const Twine &message) {
if (impl)
return impl->emitNYI(loc, message);
return mlir::emitError(loc, "not yet implemented: " + message);
}
remark::detail::InFlightRemark
OpenACCSupport::emitRemark(Operation *op, const Twine &message,
llvm::StringRef category) {
if (impl)
return impl->emitRemark(op, message, category);
return acc::emitRemark(op, message, category);
}
bool OpenACCSupport::isValidSymbolUse(Operation *user, SymbolRefAttr symbol,
Operation **definingOpPtr) {
if (impl)
return impl->isValidSymbolUse(user, symbol, definingOpPtr);
return acc::isValidSymbolUse(user, symbol, definingOpPtr);
}
bool OpenACCSupport::isValidValueUse(Value v, Region &region) {
if (impl)
return impl->isValidValueUse(v, region);
return acc::isValidValueUse(v, region);
}
} // namespace acc
} // namespace mlir