Index: include/clang/Basic/Specifiers.h =================================================================== --- include/clang/Basic/Specifiers.h +++ include/clang/Basic/Specifiers.h @@ -251,6 +251,7 @@ CC_PreserveMost, // __attribute__((preserve_most)) CC_PreserveAll, // __attribute__((preserve_all)) CC_AArch64VectorCall, // __attribute__((aarch64_vector_pcs)) + CC_AMDGPUVectorCall, // __attribute__((vectorcall)) }; /// Checks whether the given calling convention supports variadic Index: lib/AST/ItaniumMangle.cpp =================================================================== --- lib/AST/ItaniumMangle.cpp +++ lib/AST/ItaniumMangle.cpp @@ -2648,6 +2648,7 @@ return ""; case CC_X86VectorCall: + case CC_AMDGPUVectorCall: case CC_X86Pascal: case CC_X86RegCall: case CC_AAPCS: Index: lib/AST/Type.cpp =================================================================== --- lib/AST/Type.cpp +++ lib/AST/Type.cpp @@ -2826,6 +2826,7 @@ case CC_X86ThisCall: return "thiscall"; case CC_X86Pascal: return "pascal"; case CC_X86VectorCall: return "vectorcall"; + case CC_AMDGPUVectorCall: return "amdgpu_vectorcall"; case CC_Win64: return "ms_abi"; case CC_X86_64SysV: return "sysv_abi"; case CC_X86RegCall : return "regcall"; Index: lib/AST/TypePrinter.cpp =================================================================== --- lib/AST/TypePrinter.cpp +++ lib/AST/TypePrinter.cpp @@ -862,6 +862,7 @@ OS << " __attribute__((thiscall))"; break; case CC_X86VectorCall: + case CC_AMDGPUVectorCall: OS << " __attribute__((vectorcall))"; break; case CC_X86Pascal: Index: lib/Basic/Targets/AMDGPU.h =================================================================== --- lib/Basic/Targets/AMDGPU.h +++ lib/Basic/Targets/AMDGPU.h @@ -341,6 +341,7 @@ return CCCR_Warning; case CC_C: case CC_OpenCLKernel: + case CC_AMDGPUVectorCall: return CCCR_OK; } } Index: lib/CodeGen/CGCall.cpp =================================================================== --- lib/CodeGen/CGCall.cpp +++ lib/CodeGen/CGCall.cpp @@ -58,6 +58,7 @@ case CC_X86Pascal: return llvm::CallingConv::C; // TODO: Add support for __vectorcall to LLVM. case CC_X86VectorCall: return llvm::CallingConv::X86_VectorCall; + case CC_AMDGPUVectorCall: return llvm::CallingConv::C; case CC_AArch64VectorCall: return llvm::CallingConv::AArch64_VectorCall; case CC_SpirFunction: return llvm::CallingConv::SPIR_FUNC; case CC_OpenCLKernel: return CGM.getTargetCodeGenInfo().getOpenCLKernelCallingConv(); Index: lib/CodeGen/CGDebugInfo.cpp =================================================================== --- lib/CodeGen/CGDebugInfo.cpp +++ lib/CodeGen/CGDebugInfo.cpp @@ -1113,6 +1113,7 @@ static unsigned getDwarfCC(CallingConv CC) { switch (CC) { case CC_C: + case CC_AMDGPUVectorCall: // Avoid emitting DW_AT_calling_convention if the C convention was used. return 0; Index: lib/Sema/SemaDeclAttr.cpp =================================================================== --- lib/Sema/SemaDeclAttr.cpp +++ lib/Sema/SemaDeclAttr.cpp @@ -4568,7 +4568,8 @@ CC = CC_Swift; break; case ParsedAttr::AT_VectorCall: - CC = CC_X86VectorCall; + CC = Context.getTargetInfo().getTriple().isAMDGPU() + ? CC_AMDGPUVectorCall : CC_X86VectorCall; break; case ParsedAttr::AT_AArch64VectorPcs: CC = CC_AArch64VectorCall; Index: test/SemaCUDA/amdgpu-windows-vectorcall.cu =================================================================== --- /dev/null +++ test/SemaCUDA/amdgpu-windows-vectorcall.cu @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -triple amdgcn-amd-amdhsa -aux-triple x86_64-pc-windows-msvc -fms-compatibility -fcuda-is-device -fsyntax-only -verify %s + +// expected-no-diagnostics +template + struct A + { + }; + +template struct A<_Ret (__cdecl _Arg0::*)(_Types) > { }; +template struct A<_Ret (__vectorcall _Arg0::*)(_Types) > {}; +