r226548 - Introduce SPIR calling conventions.

Alexander Kornienko alexfh at google.com
Tue Jan 20 02:33:18 PST 2015


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.

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
>



-- 
Alexander Kornienko | Software Engineer | alexfh at google.com | Google
Germany, Munich
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150120/0fc009e8/attachment.html>


More information about the cfe-commits mailing list