[flang-commits] [flang] [flang][cuda] Compute matching distance in generic resolution (PR #90774)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Wed May 1 13:58:35 PDT 2024
================
@@ -2492,6 +2492,89 @@ static bool CheckCompatibleArguments(
return true;
}
+// Compute the matching distance as described in section 3.2.3 of the CUDA
+// Fortran references.
+static int GetMatchingDistance(const characteristics::DummyArgument &dummy,
+ const std::optional<ActualArgument> &actual) {
+ std::optional<common::CUDADataAttr> actualDataAttr, dummyDataAttr;
+ if (actual) {
+ if (auto *expr{actual->UnwrapExpr()}) {
+ const auto *actualLastSymbol{evaluate::GetLastSymbol(*expr)};
+ if (actualLastSymbol) {
+ actualLastSymbol = &semantics::ResolveAssociations(*actualLastSymbol);
+ if (const auto *actualObject{actualLastSymbol
+ ? actualLastSymbol
+ ->detailsIf<semantics::ObjectEntityDetails>()
+ : nullptr}) {
+ actualDataAttr = actualObject->cudaDataAttr();
+ }
+ }
+ }
+ }
+
+ common::visit(common::visitors{
+ [&](const characteristics::DummyDataObject &object) {
+ dummyDataAttr = object.cudaDataAttr;
+ },
+ [&](const auto &) {},
+ },
+ dummy.u);
+
+ if (!dummyDataAttr) {
+ if (!actualDataAttr) {
+ return 0;
+ } else if (*actualDataAttr == common::CUDADataAttr::Device) {
+ return std::numeric_limits<int>::max();
+ } else if (*actualDataAttr == common::CUDADataAttr::Managed ||
+ *actualDataAttr == common::CUDADataAttr::Unified) {
+ return 3;
+ }
+ } else if (*dummyDataAttr == common::CUDADataAttr::Device) {
+ if (!actualDataAttr) {
+ return std::numeric_limits<int>::max();
+ } else if (*actualDataAttr == common::CUDADataAttr::Device) {
+ return 0;
+ } else if (*actualDataAttr == common::CUDADataAttr::Managed ||
+ *actualDataAttr == common::CUDADataAttr::Unified) {
+ return 2;
+ }
+ } else if (*dummyDataAttr == common::CUDADataAttr::Managed) {
+ if (!actualDataAttr || *actualDataAttr == common::CUDADataAttr::Device) {
+ return std::numeric_limits<int>::max();
+ } else if (*actualDataAttr == common::CUDADataAttr::Managed) {
+ return 0;
+ } else if (*actualDataAttr == common::CUDADataAttr::Unified) {
+ return 1;
+ }
+ } else if (*dummyDataAttr == common::CUDADataAttr::Unified) {
+ if (!actualDataAttr || *actualDataAttr == common::CUDADataAttr::Device) {
+ return std::numeric_limits<int>::max();
+ } else if (*actualDataAttr == common::CUDADataAttr::Managed) {
+ return 1;
+ } else if (*actualDataAttr == common::CUDADataAttr::Unified) {
+ return 0;
+ }
+ }
+ return std::numeric_limits<int>::max();
+}
+
+static int ComputeCudaMatchingDistance(
+ const characteristics::Procedure &procedure,
+ const ActualArguments &actuals) {
+ const auto &dummies{procedure.dummyArguments};
+ CHECK(dummies.size() == actuals.size());
+ int distance = 0;
+ for (std::size_t i{0}; i < dummies.size(); ++i) {
+ const characteristics::DummyArgument &dummy{dummies[i]};
+ const std::optional<ActualArgument> &actual{actuals[i]};
+ int d = GetMatchingDistance(dummy, actual);
----------------
klausler wrote:
Braces, please.
https://github.com/llvm/llvm-project/pull/90774
More information about the flang-commits
mailing list