From: Sven van Haastregt Date: Thu, 20 Sep 2018 10:07:27 +0000 (+0000) Subject: [OpenCL] Diagnose redundant address space conversion X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8141e9ffd63b4473556dce81f900c7eaff65ccc8;p=clang [OpenCL] Diagnose redundant address space conversion Add a warning if a parameter with a named address space is passed to a to_addr builtin. For example: int i; to_private(&i); // generate warning as conversion from private to private is redundant. Patch by Alistair Davies. Differential Revision: https://reviews.llvm.org/D51411 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@342638 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 5cb037ffc2..9aaa7657d4 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -8613,6 +8613,10 @@ def err_opencl_variadic_function : Error< "invalid prototype, variadic arguments are not allowed in OpenCL">; def err_opencl_requires_extension : Error< "use of %select{type|declaration}0 %1 requires %2 extension to be enabled">; +def warn_opencl_generic_address_space_arg : Warning< + "passing non-generic address space pointer to %0" + " may cause dynamic conversion affecting performance">, + InGroup, DefaultIgnore; // OpenCL v2.0 s6.13.6 -- Builtin Pipe Functions def err_opencl_builtin_pipe_first_arg : Error< diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index a1bfff4fb7..c46468f1c7 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -849,6 +849,13 @@ static bool SemaOpenCLBuiltinToAddr(Sema &S, unsigned BuiltinID, return true; } + if (RT->getPointeeType().getAddressSpace() != LangAS::opencl_generic) { + S.Diag(Call->getArg(0)->getBeginLoc(), + diag::warn_opencl_generic_address_space_arg) + << Call->getDirectCallee()->getNameInfo().getAsString() + << Call->getArg(0)->getSourceRange(); + } + RT = RT->getPointeeType(); auto Qual = RT.getQualifiers(); switch (BuiltinID) { diff --git a/test/SemaOpenCL/to_addr_builtin.cl b/test/SemaOpenCL/to_addr_builtin.cl index 70956f007a..9b95ff4e64 100644 --- a/test/SemaOpenCL/to_addr_builtin.cl +++ b/test/SemaOpenCL/to_addr_builtin.cl @@ -1,5 +1,5 @@ // RUN: %clang_cc1 -verify -fsyntax-only %s -// RUN: %clang_cc1 -verify -fsyntax-only -cl-std=CL2.0 %s +// RUN: %clang_cc1 -Wconversion -verify -fsyntax-only -cl-std=CL2.0 %s void test(void) { global int *glob; @@ -43,6 +43,7 @@ void test(void) { // expected-warning@-2{{incompatible integer to pointer conversion assigning to '__local int *' from 'int'}} #else // expected-error@-4{{assigning '__global int *' to '__local int *' changes address space of pointer}} + // expected-warning@-5{{passing non-generic address space pointer to to_global may cause dynamic conversion affecting performance}} #endif global char *glob_c = to_global(loc); @@ -50,6 +51,7 @@ void test(void) { // expected-warning@-2{{incompatible integer to pointer conversion initializing '__global char *' with an expression of type 'int'}} #else // expected-warning@-4{{incompatible pointer types initializing '__global char *' with an expression of type '__global int *'}} + // expected-warning@-5{{passing non-generic address space pointer to to_global may cause dynamic conversion affecting performance}} #endif }