[PATCH] OpenCL: Emit global variables in the constant addr space as constant globals

Pekka Jääskeläinen pekka.jaaskelainen at tut.fi
Wed Oct 1 00:30:19 PDT 2014


Hi Tom,

This patch seemed familiar to me, and by googling I found this
patch for the constant string literals:

http://reviews.llvm.org/D894

"I updated this patch to remove the 'const' part as I now believe it is wrong, 
and I changed IsModifiable as Tanya suggested.", writes Joey,
referring to this comment from Tanya:
http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20130603/081103.html

The comment might apply to this patch as well. Perhaps adding a
test for const __constant is a good idea?

As you didn't change this test:

 > +++ test/SemaOpenCL/address-spaces.cl
 > @@ -9,5 +9,5 @@
 >   int *ip;
 >   ip = gip; // expected-error {{assigning '__global int *' to 'int *' 
changes address space of pointer}}
 >   ip = &li; // expected-error {{assigning '__local int *' to 'int *' 
changes address space of pointer}}
 > -  ip = &ci; // expected-error {{assigning '__constant int *' to 'int *' 
changes address space of pointer}}
 > +  ip = &ci; // expected-error {{assigning 'const __constant int *' to 'int 
*' changes address space of pointer}}

I assume the other part of the comment (confusing error message)
is not a problem anymore.

BR,
Pekka

On 10/01/2014 03:47 AM, Tom Stellard wrote:
> ---
>   lib/AST/Type.cpp                                          | 3 ++-
>   test/CodeGenOpenCL/address-space-constant-initializers.cl | 2 +-
>   test/CodeGenOpenCL/constant-addr-space-globals.cl         | 8 ++++++++
>   test/CodeGenOpenCL/opencl_types.cl                        | 2 +-
>   test/CodeGenOpenCL/str_literals.cl                        | 4 ++--
>   test/SemaOpenCL/extern.cl                                 | 2 +-
>   6 files changed, 15 insertions(+), 6 deletions(-)
>   create mode 100644 test/CodeGenOpenCL/constant-addr-space-globals.cl
>
> diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp
> index 35676da..2b98eb6 100644
> --- a/lib/AST/Type.cpp
> +++ b/lib/AST/Type.cpp
> @@ -26,6 +26,7 @@
>   #include "llvm/ADT/StringExtras.h"
>   #include "llvm/Support/raw_ostream.h"
>   #include <algorithm>
> +#include "llvm/Support/Debug.h"
>   using namespace clang;
>
>   bool Qualifiers::isStrictSupersetOf(Qualifiers Other) const {
> @@ -70,7 +71,7 @@ bool QualType::isConstant(QualType T, ASTContext &Ctx) {
>     if (const ArrayType *AT = Ctx.getAsArrayType(T))
>       return AT->getElementType().isConstant(Ctx);
>
> -  return false;
> +  return T.getAddressSpace() == LangAS::opencl_constant;
>   }
>
>   unsigned ConstantArrayType::getNumAddressingBits(ASTContext &Context,
> diff --git a/test/CodeGenOpenCL/address-space-constant-initializers.cl b/test/CodeGenOpenCL/address-space-constant-initializers.cl
> index ae8cedc..079b070 100644
> --- a/test/CodeGenOpenCL/address-space-constant-initializers.cl
> +++ b/test/CodeGenOpenCL/address-space-constant-initializers.cl
> @@ -12,7 +12,7 @@ typedef struct {
>   } ConstantArrayPointerStruct;
>
>   // CHECK: %struct.ConstantArrayPointerStruct = type { float addrspace(3)* }
> -// CHECK: addrspace(3) global %struct.ConstantArrayPointerStruct { float addrspace(3)* bitcast (i8 addrspace(3)* getelementptr (i8 addrspace(3)* bitcast (%struct.ArrayStruct addrspace(3)* @constant_array_struct to i8 addrspace(3)*), i64 4) to float addrspace(3)*) }
> +// CHECK: addrspace(3) constant %struct.ConstantArrayPointerStruct { float addrspace(3)* bitcast (i8 addrspace(3)* getelementptr (i8 addrspace(3)* bitcast (%struct.ArrayStruct addrspace(3)* @constant_array_struct to i8 addrspace(3)*), i64 4) to float addrspace(3)*) }
>   // Bug  18567
>   __constant ConstantArrayPointerStruct constant_array_pointer_struct = {
>       &constant_array_struct.f
> diff --git a/test/CodeGenOpenCL/constant-addr-space-globals.cl b/test/CodeGenOpenCL/constant-addr-space-globals.cl
> new file mode 100644
> index 0000000..92fb979
> --- /dev/null
> +++ b/test/CodeGenOpenCL/constant-addr-space-globals.cl
> @@ -0,0 +1,8 @@
> +// RUN: %clang_cc1 %s -ffake-address-space-map -emit-llvm -o - | FileCheck %s
> +
> +// CHECK: @array = addrspace({{[0-9]+}}) constant
> +__constant float array[2] = {0.0f, 1.0f};
> +
> +kernel void test(global float *out) {
> +  *out = array[0];
> +}
> diff --git a/test/CodeGenOpenCL/opencl_types.cl b/test/CodeGenOpenCL/opencl_types.cl
> index 7e99fc5..ed2bf6d 100644
> --- a/test/CodeGenOpenCL/opencl_types.cl
> +++ b/test/CodeGenOpenCL/opencl_types.cl
> @@ -1,7 +1,7 @@
>   // RUN: %clang_cc1 %s -emit-llvm -o - -O0 | FileCheck %s
>
>   constant sampler_t glb_smp = 7;
> -// CHECK: global i32 7
> +// CHECK: constant i32 7
>
>   void fnc1(image1d_t img) {}
>   // CHECK: @fnc1(%opencl.image1d_t*
> diff --git a/test/CodeGenOpenCL/str_literals.cl b/test/CodeGenOpenCL/str_literals.cl
> index 43c90f8..092b637 100644
> --- a/test/CodeGenOpenCL/str_literals.cl
> +++ b/test/CodeGenOpenCL/str_literals.cl
> @@ -5,5 +5,5 @@ __constant char * __constant y = "hello world";
>
>   // CHECK: unnamed_addr addrspace(3) constant
>   // CHECK-NOT: addrspace(3) unnamed_addr constant
> -// CHECK: @x = addrspace(3) global i8 addrspace(3)*
> -// CHECK: @y = addrspace(3) global i8 addrspace(3)*
> +// CHECK: @x = addrspace(3) constant i8 addrspace(3)*
> +// CHECK: @y = addrspace(3) constant i8 addrspace(3)*
> diff --git a/test/SemaOpenCL/extern.cl b/test/SemaOpenCL/extern.cl
> index ee5e072..764e724 100644
> --- a/test/SemaOpenCL/extern.cl
> +++ b/test/SemaOpenCL/extern.cl
> @@ -1,7 +1,7 @@
>   // RUN: %clang_cc1 -x cl -cl-std=CL1.2 -emit-llvm %s -o - -verify | FileCheck %s
>   // expected-no-diagnostics
>
> -// CHECK: @foo = external global float
> +// CHECK: @foo = external constant float
>   extern constant float foo;
>
>   kernel void test(global float* buf) {
>






More information about the cfe-commits mailing list