r347189 - [OpenCL] Fix address space deduction in template args.
Anastasia Stulova via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 19 03:00:14 PST 2018
Author: stulova
Date: Mon Nov 19 03:00:14 2018
New Revision: 347189
URL: http://llvm.org/viewvc/llvm-project?rev=347189&view=rev
Log:
[OpenCL] Fix address space deduction in template args.
Don't deduce address spaces for non-pointer-like types
in template args.
Fixes PR38603!
Differential Revision: https://reviews.llvm.org/D54634
Added:
cfe/trunk/test/CodeGenOpenCLCXX/template-address-spaces.cl
Modified:
cfe/trunk/lib/Sema/SemaType.cpp
Modified: cfe/trunk/lib/Sema/SemaType.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=347189&r1=347188&r2=347189&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaType.cpp (original)
+++ cfe/trunk/lib/Sema/SemaType.cpp Mon Nov 19 03:00:14 2018
@@ -7227,7 +7227,9 @@ static void deduceOpenCLImplicitAddrSpac
if (IsPointee) {
ImpAddr = LangAS::opencl_generic;
} else {
- if (D.getContext() == DeclaratorContext::FileContext) {
+ if (D.getContext() == DeclaratorContext::TemplateArgContext) {
+ // Do not deduce address space for non-pointee type in template args
+ } else if (D.getContext() == DeclaratorContext::FileContext) {
ImpAddr = LangAS::opencl_global;
} else {
if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static ||
Added: cfe/trunk/test/CodeGenOpenCLCXX/template-address-spaces.cl
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCLCXX/template-address-spaces.cl?rev=347189&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenOpenCLCXX/template-address-spaces.cl (added)
+++ cfe/trunk/test/CodeGenOpenCLCXX/template-address-spaces.cl Mon Nov 19 03:00:14 2018
@@ -0,0 +1,31 @@
+// RUN: %clang_cc1 -cl-std=c++ %s -emit-llvm -o - -O0 -triple spir-unknown-unknown | FileCheck %s
+
+template <typename T>
+struct S{
+ T a;
+ T foo();
+};
+
+template<typename T>
+T S<T>::foo() { return a;}
+
+//CHECK: %struct.S = type { i32 }
+//CHECK: %struct.S.0 = type { i32 addrspace(4)* }
+//CHECK: %struct.S.1 = type { i32 addrspace(1)* }
+
+//CHECK: i32 @_ZN1SIiE3fooEv(%struct.S* %this)
+//CHECK: i32 addrspace(4)* @_ZN1SIPU3AS4iE3fooEv(%struct.S.0* %this)
+//CHECK: i32 addrspace(1)* @_ZN1SIPU3AS1iE3fooEv(%struct.S.1* %this)
+
+void bar(){
+ S<int> sint;
+ S<int*> sintptr;
+ S<__global int*> sintptrgl;
+ // FIXME: Preserve AS in TreeTransform
+ //S<__global int> sintgl;
+
+ sint.foo();
+ sintptr.foo();
+ sintptrgl.foo();
+ //sintgl.foo();
+}
More information about the cfe-commits
mailing list