summaryrefslogtreecommitdiffstats
path: root/clang/test/OpenMP/declare_simd_ast_print.cpp
blob: aff2c944f08a1de946d8a14e48b4deab2234b467 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// RUN: %clang_cc1 -verify -fopenmp -x c++ -std=c++11 -ast-print %s | FileCheck %s
// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s
// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
// expected-no-diagnostics

#ifndef HEADER
#define HEADER

#pragma omp declare simd
void add_1(float *d) __attribute__((cold));

// CHECK: #pragma omp declare simd
// CHECK-NEXT: void add_1(float *d) __attribute__((cold));
//

#pragma omp declare simd
template <class C> void h(C *hp, C *hp2, C *hq, C *lin) {
}

// CHECK: #pragma omp declare simd
// CHECK-NEXT: template <class C = int> void h(int *hp, int *hp2, int *hq, int *lin) {
// CHECK-NEXT: h((float *)hp, (float *)hp2, (float *)hq, (float *)lin);
// CHECK-NEXT: }

// CHECK: #pragma omp declare simd
// CHECK-NEXT: template <class C = float> void h(float *hp, float *hp2, float *hq, float *lin) {
// CHECK-NEXT: }

// CHECK: #pragma omp declare simd
// CHECK: template <class C> void h(C *hp, C *hp2, C *hq, C *lin) {
// CHECK-NEXT: }
//

// Explicit specialization with <C=int>.
// Pragmas need to be same, otherwise standard says that's undefined behavior.
#pragma omp declare simd
template <>
void h(int *hp, int *hp2, int *hq, int *lin)
{
  // Implicit specialization with <C=float>.
  // This is special case where the directive is stored by Sema and is
  // generated together with the (pending) function instatiation.
  h((float*) hp, (float*) hp2, (float*) hq, (float*) lin);
}

class VV {
  // CHECK: #pragma omp declare simd
  // CHECK-NEXT: int add(int a, int b) __attribute__((cold))    {
  // CHECK-NEXT: return a + b;
  // CHECK-NEXT: }
  #pragma omp declare simd
  int add(int a, int b) __attribute__((cold)) { return a + b; }

  // CHECK: #pragma omp declare simd
  // CHECK-NEXT: float taddpf(float *a, float *b)     {
  // CHECK-NEXT: return *a + *b;
  // CHECK-NEXT: }
  #pragma omp declare simd
  float taddpf(float *a, float *b) { return *a + *b; }

// CHECK: #pragma omp declare simd
// CHECK-NEXT: #pragma omp declare simd
// CHECK-NEXT: int tadd(int b) {
// CHECK-NEXT: return this->x[b] + b;
// CHECK-NEXT: }
  #pragma omp declare simd
  #pragma omp declare simd
  int tadd(int b) { return x[b] + b; }

private:
  int x[10];
};

// CHECK: template <int X = 16> class TVV {
// CHECK: #pragma omp declare simd
// CHECK-NEXT: int tadd(int a, int b);
// CHECK: #pragma omp declare simd
// CHECK-NEXT: float taddpf(float *a, float *b) {
// CHECK-NEXT: return *a + *b;
// CHECK-NEXT: }
// CHECK: #pragma omp declare simd
// CHECK-NEXT: #pragma omp declare simd
// CHECK-NEXT: int tadd(int b) {
// CHECK-NEXT: return this->x[b] + b;
// CHECK-NEXT: }
// CHECK: }
template <int X>
class TVV {
public:
// CHECK: template <int X> class TVV {
  #pragma omp declare simd
  int tadd(int a, int b) { return a + b; }

// CHECK: #pragma omp declare simd
// CHECK-NEXT: int tadd(int a, int b) {
// CHECK-NEXT: return a + b;
// CHECK-NEXT: }

  #pragma omp declare simd
  float taddpf(float *a, float *b) { return *a + *b; }

// CHECK: #pragma omp declare simd
// CHECK-NEXT: float taddpf(float *a, float *b) {
// CHECK-NEXT: return *a + *b;
// CHECK-NEXT: }

  #pragma omp declare simd
  #pragma omp declare simd
  int tadd(int b) { return x[b] + b; }

// CHECK: #pragma omp declare simd
// CHECK-NEXT: #pragma omp declare simd
// CHECK-NEXT: int tadd(int b) {
// CHECK-NEXT: return this->x[b] + b;
// CHECK-NEXT: }

private:
  int x[X];
};
// CHECK: };

// CHECK: TVV<16> t16;
TVV<16> t16;

void f() {
  float a = 1.0f, b = 2.0f;
  float r = t16.taddpf(&a, &b);
  int res = t16.tadd(b);
}

#endif
OpenPOWER on IntegriCloud