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