1  /* { dg-do run } */
       2  
       3  #include <stdlib.h>
       4  
       5  const int MAX = 1800;
       6  
       7  void check (char *a, char *b, int N)
       8  {
       9    int i;
      10    for (i = 0; i < N; i++)
      11      if (a[i] != b[i])
      12        abort ();
      13  }
      14  
      15  void init (char *a1, char *a2, int N)
      16  {
      17    char s = -1;
      18    int i;
      19    for (i = 0; i < N; i++)
      20      {
      21        a1[i] = s;
      22        a2[i] = i;
      23        s = -s;
      24      }
      25  }
      26  
      27  void init_again (char *a1, char *a2, int N)
      28  {
      29    char s = -1;
      30    int i;
      31    for (i = 0; i < N; i++)
      32      {
      33        a1[i] = s * 10;
      34        a2[i] = i;
      35        s = -s;
      36      }
      37  }
      38  
      39  void vec_mult_ref (char *p, char *v1, char *v2, int N)
      40  {
      41    int i;
      42  
      43    init (v1, v2, N);
      44  
      45    for (i = 0; i < N; i++)
      46      p[i] = v1[i] * v2[i];
      47  
      48    init_again (v1, v2, N);
      49  
      50    for (i = 0; i < N; i++)
      51      p[i] = p[i] + (v1[i] * v2[i]);
      52  }
      53  
      54  void vec_mult (char *p, char *v1, char *v2, int N)
      55  {
      56    int i;
      57  
      58    init (v1, v2, N);
      59  
      60    #pragma omp target data map(from: p[0:N])
      61      {
      62        #pragma omp target map(to: v1[:N], v2[:N])
      63  	#pragma omp parallel for
      64  	  for (i = 0; i < N; i++)
      65  	    p[i] = v1[i] * v2[i];
      66  
      67        init_again (v1, v2, N);
      68  
      69        #pragma omp target map(to: v1[:N], v2[:N])
      70  	#pragma omp parallel for
      71  	  for (i = 0; i < N; i++)
      72  	    p[i] = p[i] + (v1[i] * v2[i]);
      73      }
      74  }
      75  
      76  int main ()
      77  {
      78    char *p1 = (char *) malloc (MAX * sizeof (char));
      79    char *p2 = (char *) malloc (MAX * sizeof (char));
      80    char *v1 = (char *) malloc (MAX * sizeof (char));
      81    char *v2 = (char *) malloc (MAX * sizeof (char));
      82  
      83    vec_mult_ref (p1, v1, v2, MAX);
      84    vec_mult (p2, v1, v2, MAX);
      85  
      86    check (p1, p2, MAX);
      87  
      88    free (p1);
      89    free (p2);
      90    free (v1);
      91    free (v2);
      92  
      93    return 0;
      94  }