[Libclc-dev] [PATCH 1/2] Fix implementation of sqrt

Tom Stellard tom at stellard.net
Fri Jul 24 10:45:23 PDT 2015


Hi,

I've created a tag called 36_COMPATIBLE to mark the last
working commit with 3.6.  Now that LLVM is on 3.8, I'm not
sure we want to keep supporting 3.6 in trunk.

-Tom

On Sun, Jul 12, 2015 at 03:38:40PM +0200, EdB wrote:
> On Wednesday 13 May 2015 03:34:23 Tom Stellard wrote:
> > Passing values less than 0 to the llvm.sqrt() intrinsic results in
> > undefined behavior, so we need to check the input and return NaN if
> > is is less than 0.
> 
> This broke compilation with LLVM 3.6:
> In file included from ./generic/lib/math/clc_sqrt.cl:37:
> In file included from ./generic/include/clc/math/gentype.inc:80:
> ./generic/lib/math/clc_sqrt_impl.inc:34:23: error: passing '__constant char *' 
> to parameter of type 'const char *' changes address space of pointer
>   return val < ZERO ? __CLC_NAN : __clc_llvm_intr_sqrt(val);
>                       ^~~~~~~~~
> ./generic/lib/math/clc_sqrt_impl.inc:27:33: note: expanded from macro 
> '__CLC_NAN'
> #define __CLC_NAN __builtin_nan("")
>                                 ^~
> 
> EdB
> 
> 
> > ---
> >  generic/include/clc/math/sqrt.h   |  9 +++------
> >  generic/include/math/clc_sqrt.h   | 29 +++++++++++++++++++++++++++++
> >  generic/include/math/clc_sqrt.inc | 23 +++++++++++++++++++++++
> >  generic/lib/SOURCES               |  2 ++
> >  generic/lib/math/clc_sqrt.cl      | 37
> > +++++++++++++++++++++++++++++++++++++ generic/lib/math/clc_sqrt.inc     |
> > 38 ++++++++++++++++++++++++++++++++++++++ generic/lib/math/sqrt.cl         
> > | 35 +++++++++++++++++++++++++++++++++++ 7 files changed, 167
> > insertions(+), 6 deletions(-)
> >  create mode 100644 generic/include/math/clc_sqrt.h
> >  create mode 100644 generic/include/math/clc_sqrt.inc
> >  create mode 100644 generic/lib/math/clc_sqrt.cl
> >  create mode 100644 generic/lib/math/clc_sqrt.inc
> >  create mode 100644 generic/lib/math/sqrt.cl
> > 
> > diff --git a/generic/include/clc/math/sqrt.h
> > b/generic/include/clc/math/sqrt.h index f69de84..ccde974 100644
> > --- a/generic/include/clc/math/sqrt.h
> > +++ b/generic/include/clc/math/sqrt.h
> > @@ -1,6 +1,3 @@
> > -#undef sqrt
> > -#define sqrt __clc_sqrt
> > -
> > -#define __CLC_FUNCTION __clc_sqrt
> > -#define __CLC_INTRINSIC "llvm.sqrt"
> > -#include <clc/math/unary_intrin.inc>
> > +#define __CLC_BODY <clc/math/sqrt.inc>
> > +#include <clc/math/gentype.inc>
> > +#undef __CLC_BODY
> > diff --git a/generic/include/math/clc_sqrt.h
> > b/generic/include/math/clc_sqrt.h new file mode 100644
> > index 0000000..8fbf9eb
> > --- /dev/null
> > +++ b/generic/include/math/clc_sqrt.h
> > @@ -0,0 +1,29 @@
> > +/*
> > + * Copyright (c) 2015 Advanced Micro Devices, Inc.
> > + *
> > + * Permission is hereby granted, free of charge, to any person obtaining a
> > copy + * of this software and associated documentation files (the
> > "Software"), to deal + * in the Software without restriction, including
> > without limitation the rights + * to use, copy, modify, merge, publish,
> > distribute, sublicense, and/or sell + * copies of the Software, and to
> > permit persons to whom the Software is + * furnished to do so, subject to
> > the following conditions:
> > + *
> > + * The above copyright notice and this permission notice shall be included
> > in + * all copies or substantial portions of the Software.
> > + *
> > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> > OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> > MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
> > IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
> > CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> > TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE
> > SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE.
> > + */
> > +
> > +#ifdef cl_khr_fp64
> > +#pragma OPENCL EXTENSION cl_khr_fp64 : enable
> > +#endif
> > +
> > +#define __CLC_BODY <math/clc_sqrt.inc>
> > +#include <clc/math/gentype.inc>
> > +#undef __CLC_BODY
> > diff --git a/generic/include/math/clc_sqrt.inc
> > b/generic/include/math/clc_sqrt.inc new file mode 100644
> > index 0000000..d27243c
> > --- /dev/null
> > +++ b/generic/include/math/clc_sqrt.inc
> > @@ -0,0 +1,23 @@
> > +/*
> > + * Copyright (c) 2015 Advanced Micro Devices, Inc.
> > + *
> > + * Permission is hereby granted, free of charge, to any person obtaining a
> > copy + * of this software and associated documentation files (the
> > "Software"), to deal + * in the Software without restriction, including
> > without limitation the rights + * to use, copy, modify, merge, publish,
> > distribute, sublicense, and/or sell + * copies of the Software, and to
> > permit persons to whom the Software is + * furnished to do so, subject to
> > the following conditions:
> > + *
> > + * The above copyright notice and this permission notice shall be included
> > in + * all copies or substantial portions of the Software.
> > + *
> > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> > OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> > MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
> > IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
> > CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> > TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE
> > SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE.
> > + */
> > +
> > +_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __clc_sqrt(__CLC_GENTYPE a);
> > diff --git a/generic/lib/SOURCES b/generic/lib/SOURCES
> > index 37ff535..ec06807 100644
> > --- a/generic/lib/SOURCES
> > +++ b/generic/lib/SOURCES
> > @@ -104,6 +104,8 @@ math/sin.cl
> >  math/sincos.cl
> >  math/sincos_helpers.cl
> >  math/sinpi.cl
> > +math/clc_sqrt.cl
> > +math/sqrt.cl
> >  math/tan.cl
> >  relational/all.cl
> >  relational/any.cl
> > diff --git a/generic/lib/math/clc_sqrt.cl b/generic/lib/math/clc_sqrt.cl
> > new file mode 100644
> > index 0000000..f130a48
> > --- /dev/null
> > +++ b/generic/lib/math/clc_sqrt.cl
> > @@ -0,0 +1,37 @@
> > +/*
> > + * Copyright (c) 2014,2015 Advanced Micro Devices, Inc.
> > + *
> > + * Permission is hereby granted, free of charge, to any person obtaining a
> > copy + * of this software and associated documentation files (the
> > "Software"), to deal + * in the Software without restriction, including
> > without limitation the rights + * to use, copy, modify, merge, publish,
> > distribute, sublicense, and/or sell + * copies of the Software, and to
> > permit persons to whom the Software is + * furnished to do so, subject to
> > the following conditions:
> > + *
> > + * The above copyright notice and this permission notice shall be included
> > in + * all copies or substantial portions of the Software.
> > + *
> > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> > OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> > MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
> > IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
> > CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> > TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE
> > SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE.
> > + */
> > +
> > +#include <clc/clc.h>
> > +
> > +#ifdef cl_khr_fp64
> > +#pragma OPENCL EXTENSION cl_khr_fp64 : enable
> > +#endif
> > +
> > +// Map the llvm sqrt intrinsic to an OpenCL function.
> > +#define __CLC_FUNCTION __clc_llvm_intr_sqrt
> > +#define __CLC_INTRINSIC "llvm.sqrt"
> > +#include <clc/math/unary_intrin.inc>
> > +#undef __CLC_FUNCTION
> > +#undef __CLC_INTRINSIC
> > +
> > +#define __CLC_BODY <clc_sqrt.inc>
> > +#include <clc/math/gentype.inc>
> > diff --git a/generic/lib/math/clc_sqrt.inc b/generic/lib/math/clc_sqrt.inc
> > new file mode 100644
> > index 0000000..e97b540
> > --- /dev/null
> > +++ b/generic/lib/math/clc_sqrt.inc
> > @@ -0,0 +1,38 @@
> > +/*
> > + * Copyright (c) 2014,2015 Advanced Micro Devices, Inc.
> > + *
> > + * Permission is hereby granted, free of charge, to any person obtaining a
> > copy + * of this software and associated documentation files (the
> > "Software"), to deal + * in the Software without restriction, including
> > without limitation the rights + * to use, copy, modify, merge, publish,
> > distribute, sublicense, and/or sell + * copies of the Software, and to
> > permit persons to whom the Software is + * furnished to do so, subject to
> > the following conditions:
> > + *
> > + * The above copyright notice and this permission notice shall be included
> > in + * all copies or substantial portions of the Software.
> > + *
> > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> > OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> > MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
> > IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
> > CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> > TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE
> > SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE.
> > + */
> > +
> > +#if __CLC_FPSIZE == 32
> > +#define __CLC_NAN NAN
> > +#define ZERO 0.0f
> > +#elif __CLC_FPSIZE == 64
> > +#define __CLC_NAN __builtin_nan("")
> > +#define ZERO 0.0
> > +#else
> > +#error "Invalid value for __CLC_FPSIZE"
> > +#endif
> > +
> > +_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_sqrt(__CLC_GENTYPE val) {
> > +  return val < ZERO ? __CLC_NAN : __clc_llvm_intr_sqrt(val);
> > +}
> > +
> > +#undef __CLC_NAN
> > +#undef ZERO
> > diff --git a/generic/lib/math/sqrt.cl b/generic/lib/math/sqrt.cl
> > new file mode 100644
> > index 0000000..300e274
> > --- /dev/null
> > +++ b/generic/lib/math/sqrt.cl
> > @@ -0,0 +1,35 @@
> > +/*
> > + * Copyright (c) 2015 Advanced Micro Devices, Inc.
> > + *
> > + * Permission is hereby granted, free of charge, to any person obtaining a
> > copy + * of this software and associated documentation files (the
> > "Software"), to deal + * in the Software without restriction, including
> > without limitation the rights + * to use, copy, modify, merge, publish,
> > distribute, sublicense, and/or sell + * copies of the Software, and to
> > permit persons to whom the Software is + * furnished to do so, subject to
> > the following conditions:
> > + *
> > + * The above copyright notice and this permission notice shall be included
> > in + * all copies or substantial portions of the Software.
> > + *
> > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> > OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> > MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
> > IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
> > CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> > TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE
> > SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE.
> > + */
> > +
> > +#include <clc/clc.h>
> > +#include "../clcmacro.h"
> > +#include "math/clc_sqrt.h"
> > +
> > +_CLC_DEFINE_UNARY_BUILTIN(float, sqrt, __clc_sqrt, float)
> > +
> > +#ifdef cl_khr_fp64
> > +
> > +#pragma OPENCL EXTENSION cl_khr_fp64 : enable
> > +
> > +_CLC_DEFINE_UNARY_BUILTIN(double, sqrt, __clc_sqrt, double)
> > +
> > +#endif
> 
> 
> _______________________________________________
> Libclc-dev mailing list
> Libclc-dev at pcc.me.uk
> http://www.pcc.me.uk/cgi-bin/mailman/listinfo/libclc-dev




More information about the Libclc-dev mailing list