[llvm-dev] [OpenCL] Implicit arithmetic conversion of INT_MIN to int vector type
Neil Henning via llvm-dev
llvm-dev at lists.llvm.org
Thu Sep 10 05:25:52 PDT 2015
This is an OpenCL kernel he is talking about - you don't include
cl_platform.h within kernel code, that is for host only. CL mandates
that the INT_MIN preprocessor macro will be in existence, so the code is
very much allowed.
Note how it is defined in the man pages here -
https://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/macroLimits.html
Cheers,
-Neil.
On 10/09/15 12:07, Bruce Hoult via llvm-dev wrote:
> It depends on whether the '-' is part of the syntax of a number, or is
> an operator applied afterwards. I believe C says it is an operator and
> thus it examines '2147483648', decides it won't fit into 32 bits and
> chooses a 64 bit type, and only afterwards applies the negation.
>
> Testing with clang 3.4.1 on Ubuntu x86_64:
>
> cat >intmin.cpp <<END
> #include <iostream>
>
> int main(){
> auto i = -2147483647;
> auto j = -2147483648;
> std::cout << "sizeof " << i << " = " << sizeof(i) << std::endl;
> std::cout << "sizeof " << j << " = " << sizeof(j) << std::endl;
> return 0;
> }
> END
> clang++ -std=c++11 -o intmin intmin.cpp && ./intmin
>
> sizeof -2147483647 = 4
> sizeof -2147483648 = 8
>
> g++ 4.8.4 gives the same result.
>
> You would not notice this with an explicit type instead of 'auto'.
>
> Note that there should be CL_INT_MIN available (cl_platform.h) rather
> than defining your own.
>
> On Thu, Sep 10, 2015 at 1:30 PM, Pflanzer, Moritz via llvm-dev
> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>
> Hello,
>
> I recently came across an OpenCL kernel in which an int vector
> type was subtracted from the INT_MIN constant, e.g.
>
> int2 v2 = INT_MIN - (int2)(0);
>
> INT_MIN was defined as
>
> #define INT_MIN (-2147483648)
>
> Clang in OpenCL modes (-x cl) produces the following error:
>
> vector_conversion.c:12:42: error: can't convert between vector
> values of different size ('long' and 'int2' (vector of 2 'int'
> values))
> int2 v_int = INT_MIN - (int2)(0); // Only
> error long to int2 conversion is not possible
> ~~~~~~~ ^ ~~~~~~~~
> 1 error generated.
>
> According to the OpenCL C standard (§6.2.6 and §6.3) I expected
> that the scalar INT_MIN would be expanded to the vector type and
> that the operation should be possible. The problem seems to be
> that INT_MIN is internally represented as long, though it is still
> a valid signed integer value, and thus long cannot be casted to
> int and subsequently not to int2.
>
> If on the other hand INT_MIN is defined as
>
> #define INT_MIN (-2147483647 - 1)
>
> it is represented as int, although it is the same number, and
> clang does not produce an error.
>
> More surprisingly, the expression
>
> int2 t = (int2)(INT_MIN);
>
> works for both versions of INT_MIN. So in this situation long
> seems to be implicitly casted to int which should not be possible.
>
> Finally, for clang in C mode (-x c) also both version work and no
> error is produced. I attached a test case in which a summarised
> all my findings. The behaviour I observed should be reproducible with
>
> $ clang -x cl -S -emit-llvm -O0 -o - vector_conversion.c
> $ clang -x c -S -emit-llvm -O0 -o - vector_conversion.c
>
> I would be interested in your thoughts about this behaviour,
> whether it is correct that -2147483648 is represented as long or
> whether the behaviour can be considered as bug in the OpenCL
> frontend of Clang. (Another possibility would be that the
> representation as long is correct but it is nevertheless a bug
> that the subtraction is not possible.)
>
> Regards,
>
> Moritz
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150910/26890d3a/attachment.html>
More information about the llvm-dev
mailing list