mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-18 19:06:44 +00:00
[flang][cuda] Allow SHARED actual to DEVICE dummy (#115215)
Update the compatibility rules to allow SHARED actual argument passed to DEVICE dummy argument. Emit a warning in that case.
This commit is contained in:
parent
29a5c054e6
commit
30d80009e5
@ -118,7 +118,8 @@ static constexpr IgnoreTKRSet ignoreTKRAll{IgnoreTKR::Type, IgnoreTKR::Kind,
|
||||
std::string AsFortran(IgnoreTKRSet);
|
||||
|
||||
bool AreCompatibleCUDADataAttrs(std::optional<CUDADataAttr>,
|
||||
std::optional<CUDADataAttr>, IgnoreTKRSet, bool allowUnifiedMatchingRule,
|
||||
std::optional<CUDADataAttr>, IgnoreTKRSet, std::optional<std::string> *,
|
||||
bool allowUnifiedMatchingRule,
|
||||
const LanguageFeatureControl *features = nullptr);
|
||||
|
||||
static constexpr char blankCommonObjectName[] = "__BLNK__";
|
||||
|
@ -103,7 +103,8 @@ std::string AsFortran(IgnoreTKRSet tkr) {
|
||||
/// dummy argument attribute while `y` represents the actual argument attribute.
|
||||
bool AreCompatibleCUDADataAttrs(std::optional<CUDADataAttr> x,
|
||||
std::optional<CUDADataAttr> y, IgnoreTKRSet ignoreTKR,
|
||||
bool allowUnifiedMatchingRule, const LanguageFeatureControl *features) {
|
||||
std::optional<std::string> *warning, bool allowUnifiedMatchingRule,
|
||||
const LanguageFeatureControl *features) {
|
||||
bool isCudaManaged{features
|
||||
? features->IsEnabled(common::LanguageFeature::CudaManaged)
|
||||
: false};
|
||||
@ -134,8 +135,12 @@ bool AreCompatibleCUDADataAttrs(std::optional<CUDADataAttr> x,
|
||||
} else {
|
||||
if (*x == CUDADataAttr::Device) {
|
||||
if ((y &&
|
||||
(*y == CUDADataAttr::Managed || *y == CUDADataAttr::Unified)) ||
|
||||
(*y == CUDADataAttr::Managed || *y == CUDADataAttr::Unified ||
|
||||
*y == CUDADataAttr::Shared)) ||
|
||||
(!y && (isCudaUnified || isCudaManaged))) {
|
||||
if (y && *y == CUDADataAttr::Shared && warning) {
|
||||
*warning = "SHARED attribute ignored"s;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
} else if (*x == CUDADataAttr::Managed) {
|
||||
|
@ -371,7 +371,7 @@ bool DummyDataObject::IsCompatibleWith(const DummyDataObject &actual,
|
||||
}
|
||||
if (!attrs.test(Attr::Value) &&
|
||||
!common::AreCompatibleCUDADataAttrs(cudaDataAttr, actual.cudaDataAttr,
|
||||
ignoreTKR,
|
||||
ignoreTKR, warning,
|
||||
/*allowUnifiedMatchingRule=*/false)) {
|
||||
if (whyNot) {
|
||||
*whyNot = "incompatible CUDA data attributes";
|
||||
@ -1771,7 +1771,7 @@ bool DistinguishUtils::Distinguishable(
|
||||
x.intent != common::Intent::In) {
|
||||
return true;
|
||||
} else if (!common::AreCompatibleCUDADataAttrs(x.cudaDataAttr, y.cudaDataAttr,
|
||||
x.ignoreTKR | y.ignoreTKR,
|
||||
x.ignoreTKR | y.ignoreTKR, nullptr,
|
||||
/*allowUnifiedMatchingRule=*/false)) {
|
||||
return true;
|
||||
} else if (features_.IsEnabled(
|
||||
|
@ -976,8 +976,9 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
|
||||
actualDataAttr = common::CUDADataAttr::Device;
|
||||
}
|
||||
}
|
||||
std::optional<std::string> warning;
|
||||
if (!common::AreCompatibleCUDADataAttrs(dummyDataAttr, actualDataAttr,
|
||||
dummy.ignoreTKR,
|
||||
dummy.ignoreTKR, &warning,
|
||||
/*allowUnifiedMatchingRule=*/true, &context.languageFeatures())) {
|
||||
auto toStr{[](std::optional<common::CUDADataAttr> x) {
|
||||
return x ? "ATTRIBUTES("s +
|
||||
@ -988,6 +989,10 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
|
||||
"%s has %s but its associated actual argument has %s"_err_en_US,
|
||||
dummyName, toStr(dummyDataAttr), toStr(actualDataAttr));
|
||||
}
|
||||
if (warning && context.ShouldWarn(common::UsageWarning::CUDAUsage)) {
|
||||
messages.Say(common::UsageWarning::CUDAUsage, "%s"_warn_en_US,
|
||||
std::move(*warning));
|
||||
}
|
||||
}
|
||||
|
||||
// Warning for breaking F'2023 change with character allocatables
|
||||
|
18
flang/test/Semantics/cuf17.cuf
Normal file
18
flang/test/Semantics/cuf17.cuf
Normal file
@ -0,0 +1,18 @@
|
||||
! RUN: bbc -emit-hlfir -fcuda %s 2>&1 | FileCheck %s
|
||||
|
||||
module mod1
|
||||
contains
|
||||
|
||||
attributes(device) subroutine sub1(adev)
|
||||
real, device :: adev(10)
|
||||
end
|
||||
|
||||
attributes(global) subroutine sub2()
|
||||
real, shared :: adev(10)
|
||||
!WARNING: SHARED attribute ignored
|
||||
call sub1(adev)
|
||||
end subroutine
|
||||
|
||||
end module
|
||||
|
||||
! CHECK: warning: SHARED attribute ignored
|
Loading…
x
Reference in New Issue
Block a user