This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix ICE for SIMD clones usage in LTO


Ping

2015-10-05 19:13 GMT+03:00 Ilya Enkovich <enkovich.gnu@gmail.com>:
> Hi,
>
> When SIMD clone is created original function may be defined in another partition.  In this case SIMD clone also has to have in_other_partition flag.  Now it doesn't and we get an ICE.  This patch fixes it.  Bootstrapped and regtested for x86_64-unknown-linux-gnu.  OK for trunk?
>
> Thanks,
> Ilya
> --
> gcc/
>
> 2015-10-05  Ilya Enkovich  <enkovich.gnu@gmail.com>
>
>         * omp-low.c (simd_clone_create): Set in_other_partition
>         for created clones.
>
> gcc/testsuite/
>
> 2015-10-05  Ilya Enkovich  <enkovich.gnu@gmail.com>
>
>         * gcc.dg/lto/simd-function_0.c: New test.
>
>
> diff --git a/gcc/omp-low.c b/gcc/omp-low.c
> index cdcf9d6..8d25784 100644
> --- a/gcc/omp-low.c
> +++ b/gcc/omp-low.c
> @@ -12948,6 +12948,8 @@ simd_clone_create (struct cgraph_node *old_node)
>        DECL_STATIC_CONSTRUCTOR (new_decl) = 0;
>        DECL_STATIC_DESTRUCTOR (new_decl) = 0;
>        new_node = old_node->create_version_clone (new_decl, vNULL, NULL);
> +      if (old_node->in_other_partition)
> +       new_node->in_other_partition = 1;
>        symtab->call_cgraph_insertion_hooks (new_node);
>      }
>    if (new_node == NULL)
> diff --git a/gcc/testsuite/gcc.dg/lto/simd-function_0.c b/gcc/testsuite/gcc.dg/lto/simd-function_0.c
> new file mode 100755
> index 0000000..cda31aa
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/lto/simd-function_0.c
> @@ -0,0 +1,34 @@
> +/* { dg-lto-do link } */
> +/* { dg-require-effective-target avx2 } */
> +/* { dg-lto-options { { -fopenmp-simd -O3 -ffast-math -mavx2 -flto -flto-partition=max } } } */
> +
> +#define SIZE 4096
> +float x[SIZE];
> +
> +
> +#pragma omp declare simd
> +float
> +__attribute__ ((noinline))
> +my_mul (float x, float y) {
> +  return x * y;
> +}
> +
> +__attribute__ ((noinline))
> +int foo ()
> +{
> +  int i = 0;
> +#pragma omp simd safelen (16)
> +  for (i = 0; i < SIZE; i++)
> +    x[i] = my_mul ((float)i, 9932.3323);
> +  return (int)x[0];
> +}
> +
> +int main ()
> +{
> +  int i = 0;
> +  for (i = 0; i < SIZE; i++)
> +    x[i] = my_mul ((float) i, 9932.3323);
> +  foo ();
> +  return (int)x[0];
> +}
> +


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]