Index: clang/include/clang/Basic/TargetInfo.h =================================================================== --- clang/include/clang/Basic/TargetInfo.h +++ clang/include/clang/Basic/TargetInfo.h @@ -1704,6 +1704,9 @@ : std::optional(); } + /// Whether to support HIP image/texture API's. + virtual bool hasHIPImageSupport() const { return true; } + protected: /// Copy type and layout related info. void copyAuxTarget(const TargetInfo *Aux); Index: clang/lib/Basic/Targets/AMDGPU.h =================================================================== --- clang/lib/Basic/Targets/AMDGPU.h +++ clang/lib/Basic/Targets/AMDGPU.h @@ -46,6 +46,9 @@ /// Whether to use cumode or WGP mode. True for cumode. False for WGP mode. bool CUMode; + /// Whether having image instructions. + bool HasImage = false; + /// Target ID is device name followed by optional feature name postfixed /// by plus or minus sign delimitted by colon, e.g. gfx908:xnack+:sramecc-. /// If the target ID contains feature+, map it to true. @@ -450,6 +453,10 @@ CUMode = true; else if (F == "-cumode") CUMode = false; + else if (F == "+image-insts") + HasImage = true; + else if (F == "-image-insts") + HasImage = false; bool IsOn = F.front() == '+'; StringRef Name = StringRef(F).drop_front(); if (!llvm::is_contained(TargetIDFeatures, Name)) @@ -470,6 +477,8 @@ return getCanonicalTargetID(getArchNameAMDGCN(GPUKind), OffloadArchFeatures); } + + bool hasHIPImageSupport() const override { return HasImage; } }; } // namespace targets Index: clang/lib/Frontend/InitPreprocessor.cpp =================================================================== --- clang/lib/Frontend/InitPreprocessor.cpp +++ clang/lib/Frontend/InitPreprocessor.cpp @@ -583,8 +583,11 @@ Builder.defineMacro("__HIP_MEMORY_SCOPE_WORKGROUP", "3"); Builder.defineMacro("__HIP_MEMORY_SCOPE_AGENT", "4"); Builder.defineMacro("__HIP_MEMORY_SCOPE_SYSTEM", "5"); - if (LangOpts.CUDAIsDevice) + if (LangOpts.CUDAIsDevice) { Builder.defineMacro("__HIP_DEVICE_COMPILE__"); + if (!TI.hasHIPImageSupport()) + Builder.defineMacro("__HIP_NO_IMAGE_SUPPORT", "1"); + } if (LangOpts.GPUDefaultStream == LangOptions::GPUDefaultStreamKind::PerThread) Builder.defineMacro("HIP_API_PER_THREAD_DEFAULT_STREAM"); Index: clang/test/Driver/hip-macros.hip =================================================================== --- clang/test/Driver/hip-macros.hip +++ clang/test/Driver/hip-macros.hip @@ -42,3 +42,20 @@ // WARN-CUMODE-NOT: warning: ignoring '-mno-cumode' option as it is not currently supported for processor 'gfx906' [-Woption-ignored] // CUMODE-ON-DAG: #define __AMDGCN_CUMODE__ 1 // CUMODE-OFF-DAG: #define __AMDGCN_CUMODE__ 0 + +// RUN: %clang -E -dM --offload-arch=gfx90a --cuda-device-only -nogpuinc -nogpulib \ +// RUN: %s 2>&1 | FileCheck --check-prefix=IMAGE %s +// RUN: %clang -E -dM --offload-arch=gfx1100 --cuda-device-only -nogpuinc -nogpulib \ +// RUN: %s 2>&1 | FileCheck --check-prefix=IMAGE %s +// RUN: %clang -E -dM --offload-arch=gfx940 --cuda-device-only -nogpuinc -nogpulib \ +// RUN: %s 2>&1 | FileCheck --check-prefix=NOIMAGE %s +// RUN: %clang -E -dM --offload-arch=gfx941 --cuda-device-only -nogpuinc -nogpulib \ +// RUN: %s 2>&1 | FileCheck --check-prefix=NOIMAGE %s +// RUN: %clang -E -dM --offload-arch=gfx942 --cuda-device-only -nogpuinc -nogpulib \ +// RUN: %s 2>&1 | FileCheck --check-prefix=NOIMAGE %s +// RUN: %clang -E -dM --offload-arch=gfx1100 --cuda-device-only -nogpuinc -nogpulib \ +// RUN: -Xclang -target-feature="-image-insts" %s 2>&1 | FileCheck --check-prefix=IMAGE %s +// RUN: %clang -E -dM --offload-arch=gfx940 --cuda-device-only -nogpuinc -nogpulib \ +// RUN: -Xclang -target-feature="+image-insts" %s 2>&1 | FileCheck --check-prefix=IMAGE %s +// IMAGE-NOT: #define __HIP_NO_IMAGE_SUPPORT +// NOIMAGE: #define __HIP_NO_IMAGE_SUPPORT 1 Index: llvm/lib/TargetParser/TargetParser.cpp =================================================================== --- llvm/lib/TargetParser/TargetParser.cpp +++ llvm/lib/TargetParser/TargetParser.cpp @@ -280,6 +280,7 @@ Features["gfx10-3-insts"] = true; Features["gfx11-insts"] = true; Features["atomic-fadd-rtn-insts"] = true; + Features["image-insts"] = true; break; case GK_GFX1036: case GK_GFX1035: @@ -302,6 +303,7 @@ Features["gfx9-insts"] = true; Features["gfx10-insts"] = true; Features["gfx10-3-insts"] = true; + Features["image-insts"] = true; Features["s-memrealtime"] = true; Features["s-memtime-inst"] = true; break; @@ -323,6 +325,7 @@ Features["gfx8-insts"] = true; Features["gfx9-insts"] = true; Features["gfx10-insts"] = true; + Features["image-insts"] = true; Features["s-memrealtime"] = true; Features["s-memtime-inst"] = true; break; @@ -334,7 +337,27 @@ Features["atomic-ds-pk-add-16-insts"] = true; Features["atomic-flat-pk-add-16-insts"] = true; Features["atomic-global-pk-add-bf16-inst"] = true; - [[fallthrough]]; + Features["gfx90a-insts"] = true; + Features["atomic-buffer-global-pk-add-f16-insts"] = true; + Features["atomic-fadd-rtn-insts"] = true; + Features["dot3-insts"] = true; + Features["dot4-insts"] = true; + Features["dot5-insts"] = true; + Features["dot6-insts"] = true; + Features["mai-insts"] = true; + Features["dl-insts"] = true; + Features["dot1-insts"] = true; + Features["dot2-insts"] = true; + Features["dot7-insts"] = true; + Features["dot10-insts"] = true; + Features["gfx9-insts"] = true; + Features["gfx8-insts"] = true; + Features["16-bit-insts"] = true; + Features["dpp"] = true; + Features["s-memrealtime"] = true; + Features["ci-insts"] = true; + Features["s-memtime-inst"] = true; + break; case GK_GFX90A: Features["gfx90a-insts"] = true; Features["atomic-buffer-global-pk-add-f16-insts"] = true; @@ -382,6 +405,7 @@ case GK_GFX602: case GK_GFX601: case GK_GFX600: + Features["image-insts"] = true; Features["s-memtime-inst"] = true; break; case GK_NONE: