r226548 - Introduce SPIR calling conventions.
Alexander Kornienko
alexfh at google.com
Tue Jan 20 02:46:03 PST 2015
On Tue, Jan 20, 2015 at 11:33 AM, Alexander Kornienko <alexfh at google.com>
wrote:
>
>
> On Tue, Jan 20, 2015 at 7:44 AM, Sameer Sahasrabuddhe <
> sameer.sahasrabuddhe at amd.com> wrote:
>
>> Author: sameerds
>> Date: Tue Jan 20 00:44:32 2015
>> New Revision: 226548
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=226548&view=rev
>> Log:
>> Introduce SPIR calling conventions.
>>
>> This implements Section 3.7 from the SPIR 1.2 spec:
>>
>> SPIR kernels should use "spir_kernel" calling convention.
>> Non-kernel functions use "spir_func" calling convention. All
>> other calling conventions are disallowed.
>>
>> The patch works only for OpenCL source. Any other uses will need
>> to ensure that kernels are assigned the spir_kernel calling
>> convention correctly.
>>
>>
>> Added:
>> cfe/trunk/test/CodeGenOpenCL/spir-calling-conv.cl
>> Modified:
>> cfe/trunk/include/clang/Basic/Specifiers.h
>> cfe/trunk/lib/AST/ASTContext.cpp
>> cfe/trunk/lib/AST/Type.cpp
>> cfe/trunk/lib/AST/TypePrinter.cpp
>> cfe/trunk/lib/Basic/Targets.cpp
>> cfe/trunk/lib/CodeGen/CGCall.cpp
>> cfe/trunk/lib/Sema/SemaType.cpp
>> cfe/trunk/tools/libclang/CXType.cpp
>>
>> Modified: cfe/trunk/include/clang/Basic/Specifiers.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Specifiers.h?rev=226548&r1=226547&r2=226548&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/Specifiers.h (original)
>> +++ cfe/trunk/include/clang/Basic/Specifiers.h Tue Jan 20 00:44:32 2015
>> @@ -210,7 +210,9 @@ namespace clang {
>> CC_AAPCS, // __attribute__((pcs("aapcs")))
>> CC_AAPCS_VFP, // __attribute__((pcs("aapcs-vfp")))
>> CC_PnaclCall, // __attribute__((pnaclcall))
>> - CC_IntelOclBicc // __attribute__((intel_ocl_bicc))
>> + CC_IntelOclBicc, // __attribute__((intel_ocl_bicc))
>> + CC_SpirFunction, // default for OpenCL functions on SPIR target
>> + CC_SpirKernel // inferred for OpenCL kernels on SPIR target
>> };
>>
>> /// \brief Checks whether the given calling convention supports
>> variadic
>> @@ -222,6 +224,8 @@ namespace clang {
>> case CC_X86ThisCall:
>> case CC_X86Pascal:
>> case CC_X86VectorCall:
>> + case CC_SpirFunction:
>> + case CC_SpirKernel:
>> return false;
>> default:
>> return true;
>>
>> Modified: cfe/trunk/lib/AST/ASTContext.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=226548&r1=226547&r2=226548&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/AST/ASTContext.cpp (original)
>> +++ cfe/trunk/lib/AST/ASTContext.cpp Tue Jan 20 00:44:32 2015
>> @@ -8043,7 +8043,9 @@ CallingConv ASTContext::getDefaultCallin
>> if (IsCXXMethod)
>> return ABI->getDefaultMethodCallConv(IsVariadic);
>>
>> - return (LangOpts.MRTD && !IsVariadic) ? CC_X86StdCall : CC_C;
>> + if (LangOpts.MRTD && !IsVariadic) return CC_X86StdCall;
>> +
>> + return Target->getDefaultCallingConv(TargetInfo::CCMT_Unknown);
>> }
>>
>> bool ASTContext::isNearlyEmpty(const CXXRecordDecl *RD) const {
>>
>> Modified: cfe/trunk/lib/AST/Type.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=226548&r1=226547&r2=226548&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/AST/Type.cpp (original)
>> +++ cfe/trunk/lib/AST/Type.cpp Tue Jan 20 00:44:32 2015
>> @@ -1588,6 +1588,8 @@ StringRef FunctionType::getNameForCallCo
>> case CC_AAPCS_VFP: return "aapcs-vfp";
>> case CC_PnaclCall: return "pnaclcall";
>> case CC_IntelOclBicc: return "intel_ocl_bicc";
>> + case CC_SpirFunction: return "spir_function";
>> + case CC_SpirKernel: return "spir_kernel";
>> }
>>
>> llvm_unreachable("Invalid calling convention.");
>>
>> Modified: cfe/trunk/lib/AST/TypePrinter.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/TypePrinter.cpp?rev=226548&r1=226547&r2=226548&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/AST/TypePrinter.cpp (original)
>> +++ cfe/trunk/lib/AST/TypePrinter.cpp Tue Jan 20 00:44:32 2015
>> @@ -697,6 +697,10 @@ void TypePrinter::printFunctionProtoAfte
>> case CC_X86_64SysV:
>> OS << " __attribute__((sysv_abi))";
>> break;
>> + case CC_SpirFunction:
>> + case CC_SpirKernel:
>> + // Do nothing. These CCs are not available as attributes.
>> + break;
>> }
>> }
>>
>>
>> Modified: cfe/trunk/lib/Basic/Targets.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=226548&r1=226547&r2=226548&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Basic/Targets.cpp (original)
>> +++ cfe/trunk/lib/Basic/Targets.cpp Tue Jan 20 00:44:32 2015
>> @@ -6346,6 +6346,15 @@ namespace {
>> BuiltinVaListKind getBuiltinVaListKind() const override {
>> return TargetInfo::VoidPtrBuiltinVaList;
>> }
>> +
>> + CallingConvCheckResult checkCallingConvention(CallingConv CC) const
>> override {
>> + return (CC == CC_SpirFunction ||
>> + CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
>> + }
>> +
>> + CallingConv getDefaultCallingConv(CallingConvMethodType MT) const
>> override {
>> + return CC_SpirFunction;
>> + }
>> };
>>
>>
>>
>> Modified: cfe/trunk/lib/CodeGen/CGCall.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=226548&r1=226547&r2=226548&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGCall.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGCall.cpp Tue Jan 20 00:44:32 2015
>> @@ -51,6 +51,8 @@ static unsigned ClangCallConvToLLVMCallC
>> case CC_X86Pascal: return llvm::CallingConv::C;
>> // TODO: Add support for __vectorcall to LLVM.
>> case CC_X86VectorCall: return llvm::CallingConv::X86_VectorCall;
>> + case CC_SpirFunction: return llvm::CallingConv::SPIR_FUNC;
>> + case CC_SpirKernel: return llvm::CallingConv::SPIR_KERNEL;
>> }
>> }
>>
>>
>> Modified: cfe/trunk/lib/Sema/SemaType.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=226548&r1=226547&r2=226548&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaType.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaType.cpp Tue Jan 20 00:44:32 2015
>> @@ -2476,8 +2476,24 @@ getCCForDeclaratorChunk(Sema &S, Declara
>> }
>> }
>>
>> - return S.Context.getDefaultCallingConvention(FTI.isVariadic,
>> - IsCXXInstanceMethod);
>> + CallingConv CC = S.Context.getDefaultCallingConvention(FTI.isVariadic,
>> +
>> IsCXXInstanceMethod);
>> +
>> + // Attribute AT_OpenCLKernel affects the calling convention only on
>> + // the SPIR target, hence it cannot be treated as a calling
>> + // convention attribute. This is the simplest place to infer
>> + // "spir_kernel" for OpenCL kernels on SPIR.
>> + if (CC == CC_SpirFunction) {
>> + for (const AttributeList *Attr =
>> D.getDeclSpec().getAttributes().getList();
>> + Attr; Attr = Attr->getNext()) {
>> + if (Attr->getKind() == AttributeList::AT_OpenCLKernel) {
>> + CC = CC_SpirKernel;
>> + break;
>> + }
>> + }
>> + }
>> +
>> + return CC;
>> }
>>
>> static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState
>> &state,
>>
>> Added: cfe/trunk/test/CodeGenOpenCL/spir-calling-conv.cl
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/spir-calling-conv.cl?rev=226548&view=auto
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenOpenCL/spir-calling-conv.cl (added)
>> +++ cfe/trunk/test/CodeGenOpenCL/spir-calling-conv.cl Tue Jan 20
>> 00:44:32 2015
>> @@ -0,0 +1,18 @@
>> +// RUN: %clang_cc1 %s -triple "spir-unknown-unknown" -emit-llvm -o - |
>> FileCheck %s
>> +
>> +int get_dummy_id(int D);
>> +
>> +kernel void bar(global int *A);
>> +
>> +kernel void foo(global int *A)
>> +// CHECK: define spir_kernel void @foo(i32 addrspace(1)* %A)
>> +{
>> + int id = get_dummy_id(0);
>> + // CHECK: %call = tail call spir_func i32 @get_dummy_id(i32 0)
>>
>
> This test fails
> <http://lab.llvm.org:8080/green/job/clang-stage2-configure-Rlto_check/1183/>.
> Please fix or revert.
>
Clarification: this test fails only in some configurations, thus it doesn't
look like a trivial typo in the test which I could fix myself.
This is blocking us, so I'm going to revert the revision.
>
> Thanks!
>
>
>> + A[id] = id;
>> + bar(A);
>> + // CHECK: tail call spir_kernel void @bar(i32 addrspace(1)* %A)
>> +}
>> +
>> +// CHECK: declare spir_func i32 @get_dummy_id(i32)
>> +// CHECK: declare spir_kernel void @bar(i32 addrspace(1)*)
>>
>> Modified: cfe/trunk/tools/libclang/CXType.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXType.cpp?rev=226548&r1=226547&r2=226548&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/tools/libclang/CXType.cpp (original)
>> +++ cfe/trunk/tools/libclang/CXType.cpp Tue Jan 20 00:44:32 2015
>> @@ -527,6 +527,9 @@ CXCallingConv clang_getFunctionTypeCalli
>> TCALLINGCONV(AAPCS_VFP);
>> TCALLINGCONV(PnaclCall);
>> TCALLINGCONV(IntelOclBicc);
>> + case CC_SpirFunction: return CXCallingConv_Unexposed;
>> + case CC_SpirKernel: return CXCallingConv_Unexposed;
>> + break;
>> }
>> #undef TCALLINGCONV
>> }
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150120/ddec1872/attachment.html>
More information about the cfe-commits
mailing list