forked from OSchip/llvm-project
[hip] Remove `hip_pinned_shadow`.
Summary: - Use `device_builtin_surface` and `device_builtin_texture` for surface/texture reference support. So far, both the host and device use the same reference type, which could be revised later when interface/implementation is stablized. Reviewers: yaxunl Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D77583
This commit is contained in:
parent
e3b6059776
commit
c97be2c377
|
@ -322,7 +322,6 @@ class LangOpt<string name, code customCode = [{}]> {
|
||||||
def MicrosoftExt : LangOpt<"MicrosoftExt">;
|
def MicrosoftExt : LangOpt<"MicrosoftExt">;
|
||||||
def Borland : LangOpt<"Borland">;
|
def Borland : LangOpt<"Borland">;
|
||||||
def CUDA : LangOpt<"CUDA">;
|
def CUDA : LangOpt<"CUDA">;
|
||||||
def HIP : LangOpt<"HIP">;
|
|
||||||
def SYCL : LangOpt<"SYCLIsDevice">;
|
def SYCL : LangOpt<"SYCLIsDevice">;
|
||||||
def COnly : LangOpt<"", "!LangOpts.CPlusPlus">;
|
def COnly : LangOpt<"", "!LangOpts.CPlusPlus">;
|
||||||
def CPlusPlus : LangOpt<"CPlusPlus">;
|
def CPlusPlus : LangOpt<"CPlusPlus">;
|
||||||
|
@ -1052,13 +1051,6 @@ def CUDADevice : InheritableAttr {
|
||||||
let Documentation = [Undocumented];
|
let Documentation = [Undocumented];
|
||||||
}
|
}
|
||||||
|
|
||||||
def HIPPinnedShadow : InheritableAttr {
|
|
||||||
let Spellings = [GNU<"hip_pinned_shadow">, Declspec<"__hip_pinned_shadow__">];
|
|
||||||
let Subjects = SubjectList<[Var]>;
|
|
||||||
let LangOpts = [HIP];
|
|
||||||
let Documentation = [HIPPinnedShadowDocs];
|
|
||||||
}
|
|
||||||
|
|
||||||
def CUDADeviceBuiltin : IgnoredAttr {
|
def CUDADeviceBuiltin : IgnoredAttr {
|
||||||
let Spellings = [GNU<"device_builtin">, Declspec<"__device_builtin__">];
|
let Spellings = [GNU<"device_builtin">, Declspec<"__device_builtin__">];
|
||||||
let LangOpts = [CUDA];
|
let LangOpts = [CUDA];
|
||||||
|
|
|
@ -4613,18 +4613,6 @@ only call one function.
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
def HIPPinnedShadowDocs : Documentation {
|
|
||||||
let Category = DocCatType;
|
|
||||||
let Content = [{
|
|
||||||
The GNU style attribute __attribute__((hip_pinned_shadow)) or MSVC style attribute
|
|
||||||
__declspec(hip_pinned_shadow) can be added to the definition of a global variable
|
|
||||||
to indicate it is a HIP pinned shadow variable. A HIP pinned shadow variable can
|
|
||||||
be accessed on both device side and host side. It has external linkage and is
|
|
||||||
not initialized on device side. It has internal linkage and is initialized by
|
|
||||||
the initializer on host side.
|
|
||||||
}];
|
|
||||||
}
|
|
||||||
|
|
||||||
def CUDADeviceBuiltinSurfaceTypeDocs : Documentation {
|
def CUDADeviceBuiltinSurfaceTypeDocs : Documentation {
|
||||||
let Category = DocCatType;
|
let Category = DocCatType;
|
||||||
let Content = [{
|
let Content = [{
|
||||||
|
|
|
@ -1955,9 +1955,9 @@ void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV, bool SkipCheck) {
|
void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV) {
|
||||||
assert(SkipCheck || (!GV->isDeclaration() &&
|
assert(!GV->isDeclaration() &&
|
||||||
"Only globals with definition can force usage."));
|
"Only globals with definition can force usage.");
|
||||||
LLVMUsed.emplace_back(GV);
|
LLVMUsed.emplace_back(GV);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2520,7 +2520,6 @@ void CodeGenModule::EmitGlobal(GlobalDecl GD) {
|
||||||
!Global->hasAttr<CUDAGlobalAttr>() &&
|
!Global->hasAttr<CUDAGlobalAttr>() &&
|
||||||
!Global->hasAttr<CUDAConstantAttr>() &&
|
!Global->hasAttr<CUDAConstantAttr>() &&
|
||||||
!Global->hasAttr<CUDASharedAttr>() &&
|
!Global->hasAttr<CUDASharedAttr>() &&
|
||||||
!(LangOpts.HIP && Global->hasAttr<HIPPinnedShadowAttr>()) &&
|
|
||||||
!Global->getType()->isCUDADeviceBuiltinSurfaceType() &&
|
!Global->getType()->isCUDADeviceBuiltinSurfaceType() &&
|
||||||
!Global->getType()->isCUDADeviceBuiltinTextureType())
|
!Global->getType()->isCUDADeviceBuiltinTextureType())
|
||||||
return;
|
return;
|
||||||
|
@ -3928,10 +3927,8 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D,
|
||||||
D->getType()->isCUDADeviceBuiltinTextureType());
|
D->getType()->isCUDADeviceBuiltinTextureType());
|
||||||
// HIP pinned shadow of initialized host-side global variables are also
|
// HIP pinned shadow of initialized host-side global variables are also
|
||||||
// left undefined.
|
// left undefined.
|
||||||
bool IsHIPPinnedShadowVar =
|
if (getLangOpts().CUDA &&
|
||||||
getLangOpts().CUDAIsDevice && D->hasAttr<HIPPinnedShadowAttr>();
|
(IsCUDASharedVar || IsCUDAShadowVar || IsCUDADeviceShadowVar))
|
||||||
if (getLangOpts().CUDA && (IsCUDASharedVar || IsCUDAShadowVar ||
|
|
||||||
IsCUDADeviceShadowVar || IsHIPPinnedShadowVar))
|
|
||||||
Init = llvm::UndefValue::get(getTypes().ConvertType(ASTTy));
|
Init = llvm::UndefValue::get(getTypes().ConvertType(ASTTy));
|
||||||
else if (D->hasAttr<LoaderUninitializedAttr>())
|
else if (D->hasAttr<LoaderUninitializedAttr>())
|
||||||
Init = llvm::UndefValue::get(getTypes().ConvertType(ASTTy));
|
Init = llvm::UndefValue::get(getTypes().ConvertType(ASTTy));
|
||||||
|
@ -4039,8 +4036,7 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D,
|
||||||
// global variables become internal definitions. These have to
|
// global variables become internal definitions. These have to
|
||||||
// be internal in order to prevent name conflicts with global
|
// be internal in order to prevent name conflicts with global
|
||||||
// host variables with the same name in a different TUs.
|
// host variables with the same name in a different TUs.
|
||||||
if (D->hasAttr<CUDADeviceAttr>() || D->hasAttr<CUDAConstantAttr>() ||
|
if (D->hasAttr<CUDADeviceAttr>() || D->hasAttr<CUDAConstantAttr>()) {
|
||||||
D->hasAttr<HIPPinnedShadowAttr>()) {
|
|
||||||
Linkage = llvm::GlobalValue::InternalLinkage;
|
Linkage = llvm::GlobalValue::InternalLinkage;
|
||||||
// Shadow variables and their properties must be registered with CUDA
|
// Shadow variables and their properties must be registered with CUDA
|
||||||
// runtime. Skip Extern global variables, which will be registered in
|
// runtime. Skip Extern global variables, which will be registered in
|
||||||
|
@ -4087,15 +4083,7 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// HIPPinnedShadowVar should remain in the final code object irrespective of
|
GV->setInitializer(Init);
|
||||||
// whether it is used or not within the code. Add it to used list, so that
|
|
||||||
// it will not get eliminated when it is unused. Also, it is an extern var
|
|
||||||
// within device code, and it should *not* get initialized within device code.
|
|
||||||
if (IsHIPPinnedShadowVar)
|
|
||||||
addUsedGlobal(GV, /*SkipCheck=*/true);
|
|
||||||
else
|
|
||||||
GV->setInitializer(Init);
|
|
||||||
|
|
||||||
if (emitter)
|
if (emitter)
|
||||||
emitter->finalize(GV);
|
emitter->finalize(GV);
|
||||||
|
|
||||||
|
|
|
@ -1037,7 +1037,7 @@ public:
|
||||||
void MaybeHandleStaticInExternC(const SomeDecl *D, llvm::GlobalValue *GV);
|
void MaybeHandleStaticInExternC(const SomeDecl *D, llvm::GlobalValue *GV);
|
||||||
|
|
||||||
/// Add a global to a list to be added to the llvm.used metadata.
|
/// Add a global to a list to be added to the llvm.used metadata.
|
||||||
void addUsedGlobal(llvm::GlobalValue *GV, bool SkipCheck = false);
|
void addUsedGlobal(llvm::GlobalValue *GV);
|
||||||
|
|
||||||
/// Add a global to a list to be added to the llvm.compiler.used metadata.
|
/// Add a global to a list to be added to the llvm.compiler.used metadata.
|
||||||
void addCompilerUsedGlobal(llvm::GlobalValue *GV);
|
void addCompilerUsedGlobal(llvm::GlobalValue *GV);
|
||||||
|
|
|
@ -8407,23 +8407,13 @@ static bool requiresAMDGPUProtectedVisibility(const Decl *D,
|
||||||
(isa<FunctionDecl>(D) && D->hasAttr<CUDAGlobalAttr>()) ||
|
(isa<FunctionDecl>(D) && D->hasAttr<CUDAGlobalAttr>()) ||
|
||||||
(isa<VarDecl>(D) &&
|
(isa<VarDecl>(D) &&
|
||||||
(D->hasAttr<CUDADeviceAttr>() || D->hasAttr<CUDAConstantAttr>() ||
|
(D->hasAttr<CUDADeviceAttr>() || D->hasAttr<CUDAConstantAttr>() ||
|
||||||
D->hasAttr<HIPPinnedShadowAttr>()));
|
cast<VarDecl>(D)->getType()->isCUDADeviceBuiltinSurfaceType() ||
|
||||||
}
|
cast<VarDecl>(D)->getType()->isCUDADeviceBuiltinTextureType()));
|
||||||
|
|
||||||
static bool requiresAMDGPUDefaultVisibility(const Decl *D,
|
|
||||||
llvm::GlobalValue *GV) {
|
|
||||||
if (GV->getVisibility() != llvm::GlobalValue::HiddenVisibility)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return isa<VarDecl>(D) && D->hasAttr<HIPPinnedShadowAttr>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AMDGPUTargetCodeGenInfo::setTargetAttributes(
|
void AMDGPUTargetCodeGenInfo::setTargetAttributes(
|
||||||
const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &M) const {
|
const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &M) const {
|
||||||
if (requiresAMDGPUDefaultVisibility(D, GV)) {
|
if (requiresAMDGPUProtectedVisibility(D, GV)) {
|
||||||
GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
|
|
||||||
GV->setDSOLocal(false);
|
|
||||||
} else if (requiresAMDGPUProtectedVisibility(D, GV)) {
|
|
||||||
GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
|
GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
|
||||||
GV->setDSOLocal(true);
|
GV->setDSOLocal(true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -192,8 +192,9 @@ void AMDGCN::Linker::constructLldCommand(Compilation &C, const JobAction &JA,
|
||||||
const char *InputFileName) const {
|
const char *InputFileName) const {
|
||||||
// Construct lld command.
|
// Construct lld command.
|
||||||
// The output from ld.lld is an HSA code object file.
|
// The output from ld.lld is an HSA code object file.
|
||||||
ArgStringList LldArgs{
|
ArgStringList LldArgs{"-flavor", "gnu", "--no-undefined",
|
||||||
"-flavor", "gnu", "-shared", "-o", Output.getFilename(), InputFileName};
|
"-shared", "-o", Output.getFilename(),
|
||||||
|
InputFileName};
|
||||||
const char *Lld = Args.MakeArgString(getToolChain().GetProgramPath("lld"));
|
const char *Lld = Args.MakeArgString(getToolChain().GetProgramPath("lld"));
|
||||||
C.addCommand(std::make_unique<Command>(JA, *this, Lld, LldArgs, Inputs));
|
C.addCommand(std::make_unique<Command>(JA, *this, Lld, LldArgs, Inputs));
|
||||||
}
|
}
|
||||||
|
|
|
@ -6930,10 +6930,6 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D,
|
||||||
case ParsedAttr::AT_CUDAHost:
|
case ParsedAttr::AT_CUDAHost:
|
||||||
handleSimpleAttributeWithExclusions<CUDAHostAttr, CUDAGlobalAttr>(S, D, AL);
|
handleSimpleAttributeWithExclusions<CUDAHostAttr, CUDAGlobalAttr>(S, D, AL);
|
||||||
break;
|
break;
|
||||||
case ParsedAttr::AT_HIPPinnedShadow:
|
|
||||||
handleSimpleAttributeWithExclusions<HIPPinnedShadowAttr, CUDADeviceAttr,
|
|
||||||
CUDAConstantAttr>(S, D, AL);
|
|
||||||
break;
|
|
||||||
case ParsedAttr::AT_CUDADeviceBuiltinSurfaceType:
|
case ParsedAttr::AT_CUDADeviceBuiltinSurfaceType:
|
||||||
handleSimpleAttributeWithExclusions<CUDADeviceBuiltinSurfaceTypeAttr,
|
handleSimpleAttributeWithExclusions<CUDADeviceBuiltinSurfaceTypeAttr,
|
||||||
CUDADeviceBuiltinTextureTypeAttr>(S, D,
|
CUDADeviceBuiltinTextureTypeAttr>(S, D,
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
// RUN: %clang_cc1 -fcuda-is-device -ast-dump -ast-dump-filter tex -x hip %s | FileCheck -strict-whitespace %s
|
|
||||||
// RUN: %clang_cc1 -ast-dump -ast-dump-filter tex -x hip %s | FileCheck -strict-whitespace %s
|
|
||||||
struct textureReference {
|
|
||||||
int a;
|
|
||||||
};
|
|
||||||
|
|
||||||
// CHECK: HIPPinnedShadowAttr
|
|
||||||
template <class T, int texType, int hipTextureReadMode>
|
|
||||||
struct texture : public textureReference {
|
|
||||||
texture() { a = 1; }
|
|
||||||
};
|
|
||||||
|
|
||||||
__attribute__((hip_pinned_shadow)) texture<float, 1, 1> tex;
|
|
|
@ -38,7 +38,7 @@
|
||||||
// CHECK-SAME: "-filetype=obj"
|
// CHECK-SAME: "-filetype=obj"
|
||||||
// CHECK-SAME: "-o" [[OBJ_DEV_A_803:".*-gfx803-.*o"]]
|
// CHECK-SAME: "-o" [[OBJ_DEV_A_803:".*-gfx803-.*o"]]
|
||||||
|
|
||||||
// CHECK: [[LLD: ".*lld.*"]] "-flavor" "gnu" "-shared"
|
// CHECK: [[LLD: ".*lld.*"]] "-flavor" "gnu" "--no-undefined" "-shared"
|
||||||
// CHECK-SAME: "-o" "[[IMG_DEV_A_803:.*out]]" [[OBJ_DEV_A_803]]
|
// CHECK-SAME: "-o" "[[IMG_DEV_A_803:.*out]]" [[OBJ_DEV_A_803]]
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -67,7 +67,7 @@
|
||||||
// CHECK-SAME: "-filetype=obj"
|
// CHECK-SAME: "-filetype=obj"
|
||||||
// CHECK-SAME: "-o" [[OBJ_DEV_A_900:".*-gfx900-.*o"]]
|
// CHECK-SAME: "-o" [[OBJ_DEV_A_900:".*-gfx900-.*o"]]
|
||||||
|
|
||||||
// CHECK: [[LLD]] "-flavor" "gnu" "-shared"
|
// CHECK: [[LLD]] "-flavor" "gnu" "--no-undefined" "-shared"
|
||||||
// CHECK-SAME: "-o" "[[IMG_DEV_A_900:.*out]]" [[OBJ_DEV_A_900]]
|
// CHECK-SAME: "-o" "[[IMG_DEV_A_900:.*out]]" [[OBJ_DEV_A_900]]
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -112,7 +112,7 @@
|
||||||
// CHECK-SAME: "-filetype=obj"
|
// CHECK-SAME: "-filetype=obj"
|
||||||
// CHECK-SAME: "-o" [[OBJ_DEV_B_803:".*-gfx803-.*o"]]
|
// CHECK-SAME: "-o" [[OBJ_DEV_B_803:".*-gfx803-.*o"]]
|
||||||
|
|
||||||
// CHECK: [[LLD]] "-flavor" "gnu" "-shared"
|
// CHECK: [[LLD]] "-flavor" "gnu" "--no-undefined" "-shared"
|
||||||
// CHECK-SAME: "-o" "[[IMG_DEV_B_803:.*out]]" [[OBJ_DEV_B_803]]
|
// CHECK-SAME: "-o" "[[IMG_DEV_B_803:.*out]]" [[OBJ_DEV_B_803]]
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -141,7 +141,7 @@
|
||||||
// CHECK-SAME: "-filetype=obj"
|
// CHECK-SAME: "-filetype=obj"
|
||||||
// CHECK-SAME: "-o" [[OBJ_DEV_B_900:".*-gfx900-.*o"]]
|
// CHECK-SAME: "-o" [[OBJ_DEV_B_900:".*-gfx900-.*o"]]
|
||||||
|
|
||||||
// CHECK: [[LLD]] "-flavor" "gnu" "-shared"
|
// CHECK: [[LLD]] "-flavor" "gnu" "--no-undefined" "-shared"
|
||||||
// CHECK-SAME: "-o" "[[IMG_DEV_B_900:.*out]]" [[OBJ_DEV_B_900]]
|
// CHECK-SAME: "-o" "[[IMG_DEV_B_900:.*out]]" [[OBJ_DEV_B_900]]
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
// CHECK-SAME: "-filetype=obj"
|
// CHECK-SAME: "-filetype=obj"
|
||||||
// CHECK-SAME: "-o" [[OBJ_DEV1:".*-gfx803-.*o"]]
|
// CHECK-SAME: "-o" [[OBJ_DEV1:".*-gfx803-.*o"]]
|
||||||
|
|
||||||
// CHECK: [[LLD: ".*lld.*"]] "-flavor" "gnu" "-shared"
|
// CHECK: [[LLD: ".*lld.*"]] "-flavor" "gnu" "--no-undefined" "-shared"
|
||||||
// CHECK-SAME: "-o" "[[IMG_DEV1:.*out]]" [[OBJ_DEV1]]
|
// CHECK-SAME: "-o" "[[IMG_DEV1:.*out]]" [[OBJ_DEV1]]
|
||||||
|
|
||||||
// CHECK: [[CLANG]] "-cc1" "-triple" "amdgcn-amd-amdhsa"
|
// CHECK: [[CLANG]] "-cc1" "-triple" "amdgcn-amd-amdhsa"
|
||||||
|
@ -77,7 +77,7 @@
|
||||||
// CHECK-SAME: "-filetype=obj"
|
// CHECK-SAME: "-filetype=obj"
|
||||||
// CHECK-SAME: "-o" [[OBJ_DEV2:".*-gfx900-.*o"]]
|
// CHECK-SAME: "-o" [[OBJ_DEV2:".*-gfx900-.*o"]]
|
||||||
|
|
||||||
// CHECK: [[LLD]] "-flavor" "gnu" "-shared"
|
// CHECK: [[LLD]] "-flavor" "gnu" "--no-undefined" "-shared"
|
||||||
// CHECK-SAME: "-o" "[[IMG_DEV2:.*out]]" [[OBJ_DEV2]]
|
// CHECK-SAME: "-o" "[[IMG_DEV2:.*out]]" [[OBJ_DEV2]]
|
||||||
|
|
||||||
// CHECK: [[CLANG]] "-cc1" "-triple" "x86_64-unknown-linux-gnu"
|
// CHECK: [[CLANG]] "-cc1" "-triple" "x86_64-unknown-linux-gnu"
|
||||||
|
|
|
@ -61,7 +61,6 @@
|
||||||
// CHECK-NEXT: FlagEnum (SubjectMatchRule_enum)
|
// CHECK-NEXT: FlagEnum (SubjectMatchRule_enum)
|
||||||
// CHECK-NEXT: Flatten (SubjectMatchRule_function)
|
// CHECK-NEXT: Flatten (SubjectMatchRule_function)
|
||||||
// CHECK-NEXT: GNUInline (SubjectMatchRule_function)
|
// CHECK-NEXT: GNUInline (SubjectMatchRule_function)
|
||||||
// CHECK-NEXT: HIPPinnedShadow (SubjectMatchRule_variable)
|
|
||||||
// CHECK-NEXT: Hot (SubjectMatchRule_function)
|
// CHECK-NEXT: Hot (SubjectMatchRule_function)
|
||||||
// CHECK-NEXT: IBAction (SubjectMatchRule_objc_method_is_instance)
|
// CHECK-NEXT: IBAction (SubjectMatchRule_objc_method_is_instance)
|
||||||
// CHECK-NEXT: IFunc (SubjectMatchRule_function)
|
// CHECK-NEXT: IFunc (SubjectMatchRule_function)
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
// RUN: %clang_cc1 -triple amdgcn -fcuda-is-device -std=c++11 -fvisibility hidden -fapply-global-visibility-to-externs \
|
|
||||||
// RUN: -emit-llvm -o - -x hip %s -fsyntax-only -verify
|
|
||||||
// RUN: %clang_cc1 -triple x86_64 -std=c++11 \
|
|
||||||
// RUN: -emit-llvm -o - -x hip %s -fsyntax-only -verify
|
|
||||||
|
|
||||||
#define __device__ __attribute__((device))
|
|
||||||
#define __constant__ __attribute__((constant))
|
|
||||||
#define __hip_pinned_shadow__ __attribute((hip_pinned_shadow))
|
|
||||||
|
|
||||||
struct textureReference {
|
|
||||||
int a;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class T, int texType, int hipTextureReadMode>
|
|
||||||
struct texture : public textureReference {
|
|
||||||
texture() { a = 1; }
|
|
||||||
};
|
|
||||||
|
|
||||||
__hip_pinned_shadow__ texture<float, 2, 1> tex;
|
|
||||||
__device__ __hip_pinned_shadow__ texture<float, 2, 1> tex2; // expected-error{{'hip_pinned_shadow' and 'device' attributes are not compatible}}
|
|
||||||
// expected-error@-1{{dynamic initialization is not supported for __device__, __constant__, and __shared__ variables}}
|
|
||||||
// expected-note@-2{{conflicting attribute is here}}
|
|
||||||
__constant__ __hip_pinned_shadow__ texture<float, 2, 1> tex3; // expected-error{{'hip_pinned_shadow' and 'constant' attributes are not compatible}}
|
|
||||||
// expected-error@-1{{dynamic initialization is not supported for __device__, __constant__, and __shared__ variables}}
|
|
||||||
// expected-note@-2{{conflicting attribute is here}}
|
|
Loading…
Reference in New Issue