<div dir="ltr">Hi all,<div><br></div><div style>I tried compiling an opencl kernel with intptr_t datatype. However it gives error by default using LLVM/Clang 3.2 for nvptx . To allow usage, I tried following typedefs ( by looking at tests in llvm sources ).</div>
<div style><br></div><div style><div>typedef int intptr_t;</div><div style>and</div><div>typedef __typeof( (int*) 0) intptr_t;</div><div><br></div><div style>Both definitions compiles the code, however gives following warning. </div>
<div style>warning: incompatible pointer to integer conversion assigning to 'int' from 'int *'; dereference with *<br></div><div style><br></div><div style>Is it safe to use the above typedefs ? The generated code seems correct for x86 machines (with llvm instruction ptrtoint). Or is there better way to make sure that the semantics of intprt_t are preserved in clang/llvm for all archs ? </div>
<div style><br></div><div style>The code I tried to compile is </div><div style><br></div><div style><div>__kernel void intptr_t_kernel(int *a, int *b)</div><div>{</div><div>  intptr_t c = (intptr_t)a;</div><div>  b = (int*) c;</div>
<div>  *a += b;</div><div>}</div><div><br></div><div style>and the code generated is </div><div style><br></div><div style><div>define ptx_kernel void @intptr_t_kernel(i32* %a, i32* nocapture %b) nounwind noinline {</div>
<div>entry:</div><div>  %0 = load i32* %a, align 4, !tbaa !1</div><div>  %add.ptr = getelementptr inbounds i32* %a, i32 %0</div><div>  %conv = ptrtoint i32* %add.ptr to i32</div><div>  store i32 %conv, i32* %a, align 4, !tbaa !1</div>
<div>  ret void</div><div>}</div><div><br></div><div style>Thanks a lot for help.</div><div style><br></div><div style>Regards,</div><div style>Ankur</div></div></div></div></div>