r304389 - [OpenCL] Makes kernels use the SPIR_KERNEL CC by default.

2017-06-01 Thread Pekka Jaaskelainen via cfe-commits
Author: pjaaskel
Date: Thu Jun  1 02:18:49 2017
New Revision: 304389

URL: http://llvm.org/viewvc/llvm-project?rev=304389&view=rev
Log:
[OpenCL] Makes kernels use the SPIR_KERNEL CC by default.

Rationale: OpenCL kernels are called via an explicit runtime API
with arguments set with clSetKernelArg(), not as normal sub-functions.
Return SPIR_KERNEL by default as the kernel calling convention to ensure
the fingerprint is fixed such way that each OpenCL argument gets one
matching argument in the produced kernel function argument list to enable
feasible implementation of clSetKernelArg() with aggregates etc. In case
we would use the default C calling conv here, clSetKernelArg() might
break depending on the target-specific conventions; different targets
might split structs passed as values to multiple function arguments etc.

https://reviews.llvm.org/D33639


Added:
cfe/trunk/test/CodeGenOpenCL/kernels-have-spir-cc-by-default.cl
Modified:
cfe/trunk/lib/Basic/Targets.cpp
cfe/trunk/lib/CodeGen/ABIInfo.h
cfe/trunk/lib/CodeGen/CGCall.cpp
cfe/trunk/lib/CodeGen/TargetInfo.cpp
cfe/trunk/lib/Sema/SemaType.cpp

Modified: cfe/trunk/lib/Basic/Targets.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=304389&r1=304388&r2=304389&view=diff
==
--- cfe/trunk/lib/Basic/Targets.cpp (original)
+++ cfe/trunk/lib/Basic/Targets.cpp Thu Jun  1 02:18:49 2017
@@ -3123,6 +3123,7 @@ public:
 case CC_Swift:
 case CC_X86Pascal:
 case CC_IntelOclBicc:
+case CC_OpenCLKernel:
   return CCCR_OK;
 default:
   return CCCR_Warning;
@@ -4834,6 +4835,7 @@ public:
 case CC_PreserveMost:
 case CC_PreserveAll:
 case CC_X86RegCall:
+case CC_OpenCLKernel:
   return CCCR_OK;
 default:
   return CCCR_Warning;
@@ -4907,6 +4909,7 @@ public:
 case CC_X86_64SysV:
 case CC_Swift:
 case CC_X86RegCall:
+case CC_OpenCLKernel:
   return CCCR_OK;
 default:
   return CCCR_Warning;
@@ -5860,6 +5863,7 @@ public:
 case CC_AAPCS:
 case CC_AAPCS_VFP:
 case CC_Swift:
+case CC_OpenCLKernel:
   return CCCR_OK;
 default:
   return CCCR_Warning;
@@ -6019,6 +6023,7 @@ public:
 case CC_X86VectorCall:
   return CCCR_Ignore;
 case CC_C:
+case CC_OpenCLKernel:
   return CCCR_OK;
 default:
   return CCCR_Warning;
@@ -6329,6 +6334,7 @@ public:
 case CC_Swift:
 case CC_PreserveMost:
 case CC_PreserveAll:
+case CC_OpenCLKernel:
   return CCCR_OK;
 default:
   return CCCR_Warning;
@@ -7380,6 +7386,7 @@ public:
 switch (CC) {
 case CC_C:
 case CC_Swift:
+case CC_OpenCLKernel:
   return CCCR_OK;
 default:
   return CCCR_Warning;
@@ -7663,6 +7670,15 @@ public:
   ArrayRef getGCCRegAliases() const override {
 return None;
   }
+  CallingConvCheckResult checkCallingConvention(CallingConv CC) const override 
{
+switch (CC) {
+  default:
+return CCCR_Warning;
+  case CC_C:
+  case CC_OpenCLKernel:
+return CCCR_OK;
+}
+  }
 };
 
 class MipsTargetInfo : public TargetInfo {

Modified: cfe/trunk/lib/CodeGen/ABIInfo.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ABIInfo.h?rev=304389&r1=304388&r2=304389&view=diff
==
--- cfe/trunk/lib/CodeGen/ABIInfo.h (original)
+++ cfe/trunk/lib/CodeGen/ABIInfo.h Thu Jun  1 02:18:49 2017
@@ -149,7 +149,6 @@ namespace swiftcall {
   return info->supportsSwift();
 }
   };
-
 }  // end namespace CodeGen
 }  // end namespace clang
 

Modified: cfe/trunk/lib/CodeGen/CGCall.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=304389&r1=304388&r2=304389&view=diff
==
--- cfe/trunk/lib/CodeGen/CGCall.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCall.cpp Thu Jun  1 02:18:49 2017
@@ -707,6 +707,12 @@ CodeGenTypes::arrangeCall(const CGFuncti
  signature.getRequiredArgs());
 }
 
+namespace clang {
+namespace CodeGen {
+void computeSPIRKernelABIInfo(CodeGenModule &CGM, CGFunctionInfo &FI);
+}
+}
+
 /// Arrange the argument and result information for an abstract value
 /// of a given function type.  This is the method which all of the
 /// above functions ultimately defer to.
@@ -741,12 +747,16 @@ CodeGenTypes::arrangeLLVMFunctionInfo(Ca
   bool inserted = FunctionsBeingProcessed.insert(FI).second;
   (void)inserted;
   assert(inserted && "Recursively being processed?");
-  
+
   // Compute ABI information.
-  if (info.getCC() != CC_Swift) {
-getABIInfo().computeInfo(*FI);
-  } else {
+  if (CC == llvm::CallingConv::SPIR_KERNEL) {
+// Force target independent argument handling for the host visible
+// kernel functions.
+computeSPIRKernelABIInfo(CGM, *FI);
+  } else if 

r304396 - [OpenCL] spir_kern by defaul: fix old test cases

2017-06-01 Thread Pekka Jaaskelainen via cfe-commits
Author: pjaaskel
Date: Thu Jun  1 03:19:43 2017
New Revision: 304396

URL: http://llvm.org/viewvc/llvm-project?rev=304396&view=rev
Log:
[OpenCL] spir_kern by defaul: fix old test cases

Modified:
cfe/trunk/test/CodeGenOpenCL/bool_cast.cl
cfe/trunk/test/CodeGenOpenCL/kernel-attributes.cl
cfe/trunk/test/CodeGenOpenCL/kernel-metadata.cl
cfe/trunk/test/CodeGenOpenCL/pipe_types.cl
cfe/trunk/test/CodeGenOpenCL/ptx-calls.cl
cfe/trunk/test/CodeGenOpenCL/ptx-kernels.cl

Modified: cfe/trunk/test/CodeGenOpenCL/bool_cast.cl
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/bool_cast.cl?rev=304396&r1=304395&r2=304396&view=diff
==
--- cfe/trunk/test/CodeGenOpenCL/bool_cast.cl (original)
+++ cfe/trunk/test/CodeGenOpenCL/bool_cast.cl Thu Jun  1 03:19:43 2017
@@ -4,7 +4,7 @@ typedef unsigned char uchar4 __attribute
 typedef unsigned int int4 __attribute((ext_vector_type(4)));
 typedef float float4 __attribute((ext_vector_type(4)));
 
-// CHECK-LABEL: define void @ker()
+// CHECK-LABEL: define spir_kernel void @ker()
 void kernel ker() {
   bool t = true;
   int4 vec4 = (int4)t;

Modified: cfe/trunk/test/CodeGenOpenCL/kernel-attributes.cl
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/kernel-attributes.cl?rev=304396&r1=304395&r2=304396&view=diff
==
--- cfe/trunk/test/CodeGenOpenCL/kernel-attributes.cl (original)
+++ cfe/trunk/test/CodeGenOpenCL/kernel-attributes.cl Thu Jun  1 03:19:43 2017
@@ -3,13 +3,13 @@
 typedef unsigned int uint4 __attribute__((ext_vector_type(4)));
 
 kernel  __attribute__((vec_type_hint(int))) 
__attribute__((reqd_work_group_size(1,2,4))) void kernel1(int a) {}
-// CHECK: define void @kernel1(i32 {{[^%]*}}%a) {{[^{]+}} !vec_type_hint 
![[MD1:[0-9]+]] !reqd_work_group_size ![[MD2:[0-9]+]]
+// CHECK: define spir_kernel void @kernel1(i32 {{[^%]*}}%a) {{[^{]+}} 
!vec_type_hint ![[MD1:[0-9]+]] !reqd_work_group_size ![[MD2:[0-9]+]]
 
 kernel __attribute__((vec_type_hint(uint4))) 
__attribute__((work_group_size_hint(8,16,32))) void kernel2(int a) {}
-// CHECK: define void @kernel2(i32 {{[^%]*}}%a) {{[^{]+}} !vec_type_hint 
![[MD3:[0-9]+]] !work_group_size_hint ![[MD4:[0-9]+]]
+// CHECK: define spir_kernel void @kernel2(i32 {{[^%]*}}%a) {{[^{]+}} 
!vec_type_hint ![[MD3:[0-9]+]] !work_group_size_hint ![[MD4:[0-9]+]]
 
 kernel __attribute__((intel_reqd_sub_group_size(8))) void kernel3(int a) {}
-// CHECK: define void @kernel3(i32 {{[^%]*}}%a) {{[^{]+}} 
!intel_reqd_sub_group_size ![[MD5:[0-9]+]]
+// CHECK: define spir_kernel void @kernel3(i32 {{[^%]*}}%a) {{[^{]+}} 
!intel_reqd_sub_group_size ![[MD5:[0-9]+]]
 
 // CHECK: [[MD1]] = !{i32 undef, i32 1}
 // CHECK: [[MD2]] = !{i32 1, i32 2, i32 4}

Modified: cfe/trunk/test/CodeGenOpenCL/kernel-metadata.cl
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/kernel-metadata.cl?rev=304396&r1=304395&r2=304396&view=diff
==
--- cfe/trunk/test/CodeGenOpenCL/kernel-metadata.cl (original)
+++ cfe/trunk/test/CodeGenOpenCL/kernel-metadata.cl Thu Jun  1 03:19:43 2017
@@ -6,5 +6,5 @@ void normal_function() {
 __kernel void kernel_function() {
 }
 
-// CHECK: define void @kernel_function() {{[^{]+}} !kernel_arg_addr_space 
![[MD:[0-9]+]] !kernel_arg_access_qual ![[MD]] !kernel_arg_type ![[MD]] 
!kernel_arg_base_type ![[MD]] !kernel_arg_type_qual ![[MD]] {
+// CHECK: define spir_kernel void @kernel_function() {{[^{]+}} 
!kernel_arg_addr_space ![[MD:[0-9]+]] !kernel_arg_access_qual ![[MD]] 
!kernel_arg_type ![[MD]] !kernel_arg_base_type ![[MD]] !kernel_arg_type_qual 
![[MD]] {
 // CHECK: ![[MD]] = !{}

Modified: cfe/trunk/test/CodeGenOpenCL/pipe_types.cl
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/pipe_types.cl?rev=304396&r1=304395&r2=304396&view=diff
==
--- cfe/trunk/test/CodeGenOpenCL/pipe_types.cl (original)
+++ cfe/trunk/test/CodeGenOpenCL/pipe_types.cl Thu Jun  1 03:19:43 2017
@@ -28,7 +28,7 @@ void test5(read_only pipe int4 p) {
 
 typedef read_only pipe int MyPipe;
 kernel void test6(MyPipe p) {
-// CHECK: define void @test6(%opencl.pipe_t* %p)
+// CHECK: define spir_kernel void @test6(%opencl.pipe_t* %p)
 }
 
 struct Person {

Modified: cfe/trunk/test/CodeGenOpenCL/ptx-calls.cl
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/ptx-calls.cl?rev=304396&r1=304395&r2=304396&view=diff
==
--- cfe/trunk/test/CodeGenOpenCL/ptx-calls.cl (original)
+++ cfe/trunk/test/CodeGenOpenCL/ptx-calls.cl Thu Jun  1 03:19:43 2017
@@ -7,7 +7,7 @@ void device_function() {
 __kernel void kernel_function() {
   device_function();
 }
-// CHECK-LABEL: define void @kernel_function()
+// CHECK-L

r287112 - Add a little endian variant of TCE.

2016-11-16 Thread Pekka Jaaskelainen via cfe-commits
Author: pjaaskel
Date: Wed Nov 16 09:22:31 2016
New Revision: 287112

URL: http://llvm.org/viewvc/llvm-project?rev=287112&view=rev
Log:
Add a little endian variant of TCE.

Modified:
cfe/trunk/lib/Basic/Targets.cpp
cfe/trunk/lib/CodeGen/TargetInfo.cpp
cfe/trunk/lib/Driver/Driver.cpp
cfe/trunk/lib/Driver/ToolChains.cpp
cfe/trunk/lib/Driver/ToolChains.h

Modified: cfe/trunk/lib/Basic/Targets.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=287112&r1=287111&r2=287112&view=diff
==
--- cfe/trunk/lib/Basic/Targets.cpp (original)
+++ cfe/trunk/lib/Basic/Targets.cpp Wed Nov 16 09:22:31 2016
@@ -7210,8 +7210,11 @@ public:
 FloatFormat = &llvm::APFloat::IEEEsingle;
 DoubleFormat = &llvm::APFloat::IEEEsingle;
 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
-resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
-"-f64:32-v64:32-v128:32-a:0:32-n32");
+resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
+"i16:16:32-i32:32:32-i64:32:32-"
+"f32:32:32-f64:32:32-v64:32:32-"
+"v128:32:32-v256:32:32-v512:32:32-"
+"v1024:32:32-a0:0:32-n32");
 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
 UseAddrSpaceMapMangling = true;
   }
@@ -7239,6 +7242,31 @@ public:
   }
 };
 
+class TCELETargetInfo : public TCETargetInfo {
+public:
+  TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
+  : TCETargetInfo(Triple, Opts) {
+BigEndian = false;
+
+resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
+"i16:16:32-i32:32:32-i64:32:32-"
+"f32:32:32-f64:32:32-v64:32:32-"
+"v128:32:32-v256:32:32-v512:32:32-"
+"v1024:32:32-a0:0:32-n32");
+
+  }
+
+  virtual void getTargetDefines(const LangOptions &Opts,
+MacroBuilder &Builder) const {
+DefineStd(Builder, "tcele", Opts);
+Builder.defineMacro("__TCE__");
+Builder.defineMacro("__TCE_V1__");
+Builder.defineMacro("__TCELE__");
+Builder.defineMacro("__TCELE_V1__");
+  }
+
+};
+
 class BPFTargetInfo : public TargetInfo {
 public:
   BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
@@ -8627,6 +8655,9 @@ static TargetInfo *AllocateTarget(const
   case llvm::Triple::tce:
 return new TCETargetInfo(Triple, Opts);
 
+  case llvm::Triple::tcele:
+return new TCELETargetInfo(Triple, Opts);
+
   case llvm::Triple::x86:
 if (Triple.isOSDarwin())
   return new DarwinI386TargetInfo(Triple, Opts);

Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=287112&r1=287111&r2=287112&view=diff
==
--- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
+++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Wed Nov 16 09:22:31 2016
@@ -8251,6 +8251,7 @@ const TargetCodeGenInfo &CodeGenModule::
   }
 
   case llvm::Triple::tce:
+  case llvm::Triple::tcele:
 return SetCGInfo(new TCETargetCodeGenInfo(Types));
 
   case llvm::Triple::x86: {

Modified: cfe/trunk/lib/Driver/Driver.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=287112&r1=287111&r2=287112&view=diff
==
--- cfe/trunk/lib/Driver/Driver.cpp (original)
+++ cfe/trunk/lib/Driver/Driver.cpp Wed Nov 16 09:22:31 2016
@@ -3618,6 +3618,9 @@ const ToolChain &Driver::getToolChain(co
   case llvm::Triple::tce:
 TC = new toolchains::TCEToolChain(*this, Target, Args);
 break;
+  case llvm::Triple::tcele:
+TC = new toolchains::TCELEToolChain(*this, Target, Args);
+break;
   case llvm::Triple::hexagon:
 TC = new toolchains::HexagonToolChain(*this, Target, Args);
 break;

Modified: cfe/trunk/lib/Driver/ToolChains.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=287112&r1=287111&r2=287112&view=diff
==
--- cfe/trunk/lib/Driver/ToolChains.cpp (original)
+++ cfe/trunk/lib/Driver/ToolChains.cpp Wed Nov 16 09:22:31 2016
@@ -3435,6 +3435,13 @@ bool TCEToolChain::isPIEDefault() const
 
 bool TCEToolChain::isPICDefaultForced() const { return false; }
 
+TCELEToolChain::TCELEToolChain(const Driver &D, const llvm::Triple& Triple,
+   const ArgList &Args)
+  : TCEToolChain(D, Triple, Args) {
+}
+
+TCELEToolChain::~TCELEToolChain() {}
+
 // CloudABI - CloudABI tool chain which can call ld(1) directly.
 
 CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,

Modified: cfe/trunk/lib/Driver/ToolChains.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=287112&r1=287111&r2=287112&view=diff

r287115 - target-data test update for TCE and TCELE

2016-11-16 Thread Pekka Jaaskelainen via cfe-commits
Author: pjaaskel
Date: Wed Nov 16 10:21:59 2016
New Revision: 287115

URL: http://llvm.org/viewvc/llvm-project?rev=287115&view=rev
Log:
target-data test update for TCE and TCELE

Modified:
cfe/trunk/test/CodeGen/target-data.c

Modified: cfe/trunk/test/CodeGen/target-data.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/target-data.c?rev=287115&r1=287114&r2=287115&view=diff
==
--- cfe/trunk/test/CodeGen/target-data.c (original)
+++ cfe/trunk/test/CodeGen/target-data.c Wed Nov 16 10:21:59 2016
@@ -179,7 +179,11 @@
 
 // RUN: %clang_cc1 -triple tce-unknown -o - -emit-llvm %s | \
 // RUN: FileCheck %s -check-prefix=TCE
-// TCE: target datalayout = 
"E-p:32:32-i8:8:32-i16:16:32-i64:32-f64:32-v64:32-v128:32-a:0:32-n32"
+// TCE: target datalayout = 
"E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:32:32-v128:32:32-v256:32:32-v512:32:32-v1024:32:32-a0:0:32-n32"
+
+// RUN: %clang_cc1 -triple tcele-unknown -o - -emit-llvm %s | \
+// RUN: FileCheck %s -check-prefix=TCELE
+// TCELE: target datalayout = 
"e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:32:32-v128:32:32-v256:32:32-v512:32:32-v1024:32:32-a0:0:32-n32"
 
 // RUN: %clang_cc1 -triple spir-unknown -o - -emit-llvm %s | \
 // RUN: FileCheck %s -check-prefix=SPIR


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r286821 - Fix r286819 (accidentally patched multiple times.

2016-11-14 Thread Pekka Jaaskelainen via cfe-commits
Author: pjaaskel
Date: Mon Nov 14 07:14:38 2016
New Revision: 286821

URL: http://llvm.org/viewvc/llvm-project?rev=286821&view=rev
Log:
Fix r286819 (accidentally patched multiple times.

Modified:
cfe/trunk/test/CodeGenOpenCL/kernel-arg-info-single-as.cl

Modified: cfe/trunk/test/CodeGenOpenCL/kernel-arg-info-single-as.cl
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/kernel-arg-info-single-as.cl?rev=286821&r1=286820&r2=286821&view=diff
==
--- cfe/trunk/test/CodeGenOpenCL/kernel-arg-info-single-as.cl (original)
+++ cfe/trunk/test/CodeGenOpenCL/kernel-arg-info-single-as.cl Mon Nov 14 
07:14:38 2016
@@ -7,21 +7,3 @@ kernel void foo(__global int * G, __cons
 }
 // CHECK: !kernel_arg_addr_space ![[MD123:[0-9]+]]
 // CHECK: ![[MD123]] = !{i32 1, i32 2, i32 3}
-// Test that the kernel argument info always refers to SPIR address spaces,
-// even if the target has only one address space like x86_64 does.
-// RUN: %clang_cc1 %s -cl-std=CL2.0 -emit-llvm -o - -triple 
x86_64-unknown-unknown -cl-kernel-arg-info | FileCheck %s
-
-kernel void foo(__global int * G, __constant int *C, __local int *L) {
-  *G = *C + *L;
-}
-// CHECK: !kernel_arg_addr_space ![[MD123:[0-9]+]]
-// CHECK: ![[MD123]] = !{i32 1, i32 2, i32 3}
-// Test that the kernel argument info always refers to SPIR address spaces,
-// even if the target has only one address space like x86_64 does.
-// RUN: %clang_cc1 %s -cl-std=CL2.0 -emit-llvm -o - -triple 
x86_64-unknown-unknown -cl-kernel-arg-info | FileCheck %s
-
-kernel void foo(__global int * G, __constant int *C, __local int *L) {
-  *G = *C + *L;
-}
-// CHECK: !kernel_arg_addr_space ![[MD123:[0-9]+]]
-// CHECK: ![[MD123]] = !{i32 1, i32 2, i32 3}


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r286819 - [OpenCL] always use SPIR address spaces for kernel_arg_addr_space MD

2016-11-14 Thread Pekka Jaaskelainen via cfe-commits
Author: pjaaskel
Date: Mon Nov 14 07:08:30 2016
New Revision: 286819

URL: http://llvm.org/viewvc/llvm-project?rev=286819&view=rev
Log:
[OpenCL] always use SPIR address spaces for kernel_arg_addr_space MD

It doesn't make sense to use the target's address space ids in this context as
this is metadata that should be referring to the "logical" OpenCL address 
spaces.
For flat AS machines like all "CPUs" in general, the logical AS info gets lost 
as
there's only one address space (0).

This commit changes the logic such that we always use the SPIR address space
ids for the argument metadata. It thus allows implementing the 
clGetKernelArgInfo()
and the other detection needs.

https://reviews.llvm.org/D26157


Added:
cfe/trunk/test/CodeGenOpenCL/kernel-arg-info-single-as.cl
Modified:
cfe/trunk/lib/CodeGen/CodeGenFunction.cpp

Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=286819&r1=286818&r2=286819&view=diff
==
--- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Mon Nov 14 07:08:30 2016
@@ -466,6 +466,23 @@ static void removeImageAccessQualifier(s
   }
 }
 
+// Returns the address space id that should be produced to the
+// kernel_arg_addr_space metadata. This is always fixed to the ids
+// as specified in the SPIR 2.0 specification in order to differentiate
+// for example in clGetKernelArgInfo() implementation between the address
+// spaces with targets without unique mapping to the OpenCL address spaces
+// (basically all single AS CPUs).
+static unsigned ArgInfoAddressSpace(unsigned LangAS) {
+  switch (LangAS) {
+  case LangAS::opencl_global:   return 1;
+  case LangAS::opencl_constant: return 2;
+  case LangAS::opencl_local:return 3;
+  case LangAS::opencl_generic:  return 4; // Not in SPIR 2.0 specs.
+  default:
+return 0; // Assume private.
+  }
+}
+
 // OpenCL v1.2 s5.6.4.6 allows the compiler to store kernel argument
 // information in the program executable. The argument information stored
 // includes the argument name, its type, the address and access qualifiers 
used.
@@ -506,7 +523,7 @@ static void GenOpenCLArgMetadata(const F
 
   // Get address qualifier.
   addressQuals.push_back(llvm::ConstantAsMetadata::get(Builder.getInt32(
-  ASTCtx.getTargetAddressSpace(pointeeTy.getAddressSpace();
+ArgInfoAddressSpace(pointeeTy.getAddressSpace();
 
   // Get argument type name.
   std::string typeName =
@@ -543,8 +560,7 @@ static void GenOpenCLArgMetadata(const F
   uint32_t AddrSpc = 0;
   bool isPipe = ty->isPipeType();
   if (ty->isImageType() || isPipe)
-AddrSpc =
-  CGM.getContext().getTargetAddressSpace(LangAS::opencl_global);
+AddrSpc = ArgInfoAddressSpace(LangAS::opencl_global);
 
   addressQuals.push_back(
   llvm::ConstantAsMetadata::get(Builder.getInt32(AddrSpc)));

Added: cfe/trunk/test/CodeGenOpenCL/kernel-arg-info-single-as.cl
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/kernel-arg-info-single-as.cl?rev=286819&view=auto
==
--- cfe/trunk/test/CodeGenOpenCL/kernel-arg-info-single-as.cl (added)
+++ cfe/trunk/test/CodeGenOpenCL/kernel-arg-info-single-as.cl Mon Nov 14 
07:08:30 2016
@@ -0,0 +1,27 @@
+// Test that the kernel argument info always refers to SPIR address spaces,
+// even if the target has only one address space like x86_64 does.
+// RUN: %clang_cc1 %s -cl-std=CL2.0 -emit-llvm -o - -triple 
x86_64-unknown-unknown -cl-kernel-arg-info | FileCheck %s
+
+kernel void foo(__global int * G, __constant int *C, __local int *L) {
+  *G = *C + *L;
+}
+// CHECK: !kernel_arg_addr_space ![[MD123:[0-9]+]]
+// CHECK: ![[MD123]] = !{i32 1, i32 2, i32 3}
+// Test that the kernel argument info always refers to SPIR address spaces,
+// even if the target has only one address space like x86_64 does.
+// RUN: %clang_cc1 %s -cl-std=CL2.0 -emit-llvm -o - -triple 
x86_64-unknown-unknown -cl-kernel-arg-info | FileCheck %s
+
+kernel void foo(__global int * G, __constant int *C, __local int *L) {
+  *G = *C + *L;
+}
+// CHECK: !kernel_arg_addr_space ![[MD123:[0-9]+]]
+// CHECK: ![[MD123]] = !{i32 1, i32 2, i32 3}
+// Test that the kernel argument info always refers to SPIR address spaces,
+// even if the target has only one address space like x86_64 does.
+// RUN: %clang_cc1 %s -cl-std=CL2.0 -emit-llvm -o - -triple 
x86_64-unknown-unknown -cl-kernel-arg-info | FileCheck %s
+
+kernel void foo(__global int * G, __constant int *C, __local int *L) {
+  *G = *C + *L;
+}
+// CHECK: !kernel_arg_addr_space ![[MD123:[0-9]+]]
+// CHECK: ![[MD123]] = !{i32 1, i32 2, i32 3}


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/