Index: clang/include/clang/Basic/TargetInfo.h =================================================================== --- clang/include/clang/Basic/TargetInfo.h +++ clang/include/clang/Basic/TargetInfo.h @@ -215,7 +215,10 @@ unsigned MaxOpenCLWorkGroupSize; bool SupportsOpenCLImages = false; - unsigned MaxOpenCLSupportedVersion = 100; + + /// Maximum supported device OpenCL version, corresponding to the values + /// expected for __OPENCL_VERSION__. If 0, the macro is not defined. + unsigned MaxOpenCLSupportedVersion = 0; // TargetInfo Constructor. Default initializes all fields. TargetInfo(const llvm::Triple &T); Index: clang/lib/Basic/Targets/AMDGPU.cpp =================================================================== --- clang/lib/Basic/Targets/AMDGPU.cpp +++ clang/lib/Basic/Targets/AMDGPU.cpp @@ -306,7 +306,13 @@ MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; SupportsOpenCLImages = true; - MaxOpenCLSupportedVersion = hasFlatAddressSpace() ? 200 : 120; + + // CL2.0 features require flat instruction support. ROCm supports CL2.0, but + // Clover does not. + const bool SupportsCL2 = hasFlatAddressSpace() && + (Triple.getOS() == llvm::Triple::AMDHSA || + Triple.getOS() == llvm::Triple::AMDPAL); + MaxOpenCLSupportedVersion = SupportsCL2 ? 200 : 120; } void AMDGPUTargetInfo::adjust(LangOptions &Opts) { Index: clang/lib/Frontend/InitPreprocessor.cpp =================================================================== --- clang/lib/Frontend/InitPreprocessor.cpp +++ clang/lib/Frontend/InitPreprocessor.cpp @@ -450,8 +450,10 @@ } } - Builder.defineMacro("__OPENCL_VERSION__", - Twine(TI.getMaxOpenCLSupportedVersion())); + if (TI.getMaxOpenCLSupportedVersion() != 0) { + Builder.defineMacro("__OPENCL_VERSION__", + Twine(TI.getMaxOpenCLSupportedVersion())); + } Builder.defineMacro("CL_VERSION_1_0", "100"); Builder.defineMacro("CL_VERSION_1_1", "110"); Index: clang/test/Preprocessor/predefined-macros.c =================================================================== --- clang/test/Preprocessor/predefined-macros.c +++ clang/test/Preprocessor/predefined-macros.c @@ -183,10 +183,21 @@ // CHECK-AMDGCN-GFX6: #define __IMAGE_SUPPORT__ 1 // CHECK-AMDGCN-GFX6: #define __OPENCL_VERSION__ 120{{$}} +// No set OS or mesa3d, assume CL1.2 // RUN: %clang_cc1 %s -E -dM -o - -x cl -triple amdgcn-unknown-unknown -target-cpu gfx700 \ // RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-AMDGCN-GFX7 +// RUN: %clang_cc1 %s -E -dM -o - -x cl -triple amdgcn-unknown-mesa3d -target-cpu gfx700 \ +// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-AMDGCN-GFX7 // CHECK-AMDGCN-GFX7: #define __IMAGE_SUPPORT__ 1 -// CHECK-AMDGCN-GFX7: #define __OPENCL_VERSION__ 200{{$}} +// CHECK-AMDGCN-GFX7: #define __OPENCL_VERSION__ 120{{$}} + +// Assume CL2.0 support for HSA and PAL +// RUN: %clang_cc1 %s -E -dM -o - -x cl -triple amdgcn-unknown-amdhsa -target-cpu gfx700 \ +// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-AMDGCN-AMDHSAPAL +// RUN: %clang_cc1 %s -E -dM -o - -x cl -triple amdgcn-unknown-amdpal -target-cpu gfx700 \ +// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-AMDGCN-AMDHSAPAL +// CHECK-AMDGCN-AMDHSAPAL: #define __IMAGE_SUPPORT__ 1 +// CHECK-AMDGCN-AMDHSAPAL: #define __OPENCL_VERSION__ 200{{$}} // RUN: %clang_cc1 %s -E -dM -o - -x hip -triple amdgcn-amd-amdhsa \