(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
vect/
vect-simd-clone-16.c
       1  /* { dg-require-effective-target vect_simd_clones } */
       2  /* { dg-additional-options "-fopenmp-simd --param vect-epilogues-nomask=0" } */
       3  /* { dg-additional-options "-mavx" { target avx_runtime } } */
       4  
       5  /* Test that simd inbranch clones work correctly.  */
       6  
       7  #ifndef TYPE
       8  #define TYPE int
       9  #endif
      10  
      11  /* A simple function that will be cloned.  */
      12  #pragma omp declare simd inbranch
      13  TYPE __attribute__((noinline))
      14  foo (TYPE a)
      15  {
      16    return a + 1;
      17  }
      18  
      19  /* Check that "inbranch" clones are called correctly.  */
      20  
      21  void __attribute__((noipa))
      22  masked (TYPE * __restrict a, TYPE * __restrict b, int size)
      23  {
      24    #pragma omp simd
      25    for (int i = 0; i < size; i++)
      26      b[i] = a[i]<1 ? foo(a[i]) : a[i];
      27  }
      28  
      29  /* Check that "inbranch" works when there might be unrolling.  */
      30  
      31  void __attribute__((noipa))
      32  masked_fixed (TYPE * __restrict a, TYPE * __restrict b)
      33  {
      34    #pragma omp simd
      35    for (int i = 0; i < 128; i++)
      36      b[i] = a[i]<1 ? foo(a[i]) : a[i];
      37  }
      38  
      39  /* Validate the outputs.  */
      40  
      41  void
      42  check_masked (TYPE *b, int size)
      43  {
      44    for (int i = 0; i < size; i++)
      45      if (((TYPE)i < 1 && b[i] != (TYPE)(i + 1))
      46  	|| ((TYPE)i >= 1 && b[i] != (TYPE)i))
      47        {
      48  	__builtin_printf ("error at %d\n", i);
      49  	__builtin_exit (1);
      50        }
      51  }
      52  
      53  int
      54  main ()
      55  {
      56    TYPE a[1024];
      57    TYPE b[1024];
      58  
      59    for (int i = 0; i < 1024; i++)
      60      a[i] = i;
      61  
      62    masked_fixed (a, b);
      63    check_masked (b, 128);
      64  
      65    /* Test various sizes to cover machines with different vectorization
      66       factors.  */
      67    for (int size = 8; size <= 1024; size *= 2)
      68      {
      69        masked (a, b, size);
      70        check_masked (b, size);
      71      }
      72  
      73    /* Test sizes that might exercise the partial vector code-path.  */
      74    for (int size = 8; size <= 1024; size *= 2)
      75      {
      76        masked (a, b, size-4);
      77        check_masked (b, size-4);
      78      }
      79  
      80    return 0;
      81  }
      82  
      83  /* Ensure the the in-branch simd clones are used on targets that support them.  */
      84  /* { dg-final { scan-tree-dump-times {[\n\r] [^\n]* = foo\.simdclone} 2 "vect" } } */
      85  
      86  /* The LTO test produces two dump files and we scan the wrong one.  */
      87  /* { dg-skip-if "" { *-*-* } { "-flto" } { "" } } */