summaryrefslogtreecommitdiffstats
path: root/clang/test/OpenMP/declare_simd_ast_print.cpp
diff options
context:
space:
mode:
authorAlexey Bataev <a.bataev@hotmail.com>2016-04-12 09:35:56 +0000
committerAlexey Bataev <a.bataev@hotmail.com>2016-04-12 09:35:56 +0000
commitd93d376ba9c9f2443f3bdd61e43e7b09b762ad24 (patch)
tree483e9beb248cea3f008785cf153b4987b5ae3fc5 /clang/test/OpenMP/declare_simd_ast_print.cpp
parent65f86cd8b09b15e6ba531309325750d1a3f4af7c (diff)
downloadbcm5719-llvm-d93d376ba9c9f2443f3bdd61e43e7b09b762ad24.tar.gz
bcm5719-llvm-d93d376ba9c9f2443f3bdd61e43e7b09b762ad24.zip
[OPENMP 4.0] Support for 'aligned' clause in 'declare simd' directive.
The aligned clause declares that the object to which each list item points is aligned to the number of bytes expressed in the optional parameter of the aligned clause. 'aligned' '(' <argument-list> [ ':' <alignment> ] ')' The optional parameter of the aligned clause, alignment, must be a constant positive integer expression. If no optional parameter is specified, implementation-defined default alignments for SIMD instructions on the target platforms are assumed. The special this pointer can be used as if was one of the arguments to the function in any of the linear, aligned, or uniform clauses. llvm-svn: 266052
Diffstat (limited to 'clang/test/OpenMP/declare_simd_ast_print.cpp')
-rw-r--r--clang/test/OpenMP/declare_simd_ast_print.cpp65
1 files changed, 33 insertions, 32 deletions
diff --git a/clang/test/OpenMP/declare_simd_ast_print.cpp b/clang/test/OpenMP/declare_simd_ast_print.cpp
index e38ebe9613c..56008b53967 100644
--- a/clang/test/OpenMP/declare_simd_ast_print.cpp
+++ b/clang/test/OpenMP/declare_simd_ast_print.cpp
@@ -17,27 +17,27 @@ void add_1(float *d) __attribute__((cold));
// CHECK-NEXT: void add_1(float *d) __attribute__((cold));
//
-#pragma omp declare simd
+#pragma omp declare simd aligned(hp, hp2)
template <class C> void h(C *hp, C *hp2, C *hq, C *lin) {
}
-// CHECK: #pragma omp declare simd
+// CHECK: #pragma omp declare simd aligned(hp) aligned(hp2)
// 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: #pragma omp declare simd aligned(hp) aligned(hp2)
// CHECK-NEXT: template <class C = float> void h(float *hp, float *hp2, float *hq, float *lin) {
// CHECK-NEXT: }
-// CHECK: #pragma omp declare simd
+// CHECK: #pragma omp declare simd aligned(hp) aligned(hp2)
// 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
+#pragma omp declare simd aligned(hp, hp2)
template <>
void h(int *hp, int *hp2, int *hq, int *lin)
{
@@ -55,31 +55,31 @@ class VV {
#pragma omp declare simd uniform(this, a)
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: #pragma omp declare simd aligned(b: 4) aligned(a)
+ // 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; }
+ #pragma omp declare simd aligned (b: 4) aligned(a)
+ float taddpf(float *a, float *&b) { return *a + *b; }
-// CHECK: #pragma omp declare simd
+// CHECK: #pragma omp declare simd aligned(b: 8)
// CHECK-NEXT: #pragma omp declare simd
-// CHECK-NEXT: int tadd(int b) {
-// CHECK-NEXT: return this->x[b] + b;
+// CHECK-NEXT: int tadd(int (&b)[]) {
+// CHECK-NEXT: return this->x[b[0]] + b[0];
// CHECK-NEXT: }
#pragma omp declare simd
- #pragma omp declare simd
- int tadd(int b) { return x[b] + b; }
+ #pragma omp declare simd aligned(b : 8)
+ int tadd(int (&b)[]) { return x[b[0]] + b[0]; }
private:
int x[10];
};
-// CHECK: template <int X = 16> class TVV {
+// CHECK: template <int X = 16, typename T = float> 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: #pragma omp declare simd aligned(a: 16 * 2) aligned(b)
+// CHECK-NEXT: float taddpf(float *a, float *&b) {
// CHECK-NEXT: return *a + *b;
// CHECK-NEXT: }
// CHECK: #pragma omp declare simd
@@ -88,10 +88,10 @@ private:
// CHECK-NEXT: return this->x[b] + b;
// CHECK-NEXT: }
// CHECK: }
-template <int X>
+template <int X, typename T>
class TVV {
public:
-// CHECK: template <int X> class TVV {
+// CHECK: template <int X, typename T> class TVV {
#pragma omp declare simd simdlen(X)
int tadd(int a, int b) { return a + b; }
@@ -100,11 +100,11 @@ public:
// CHECK-NEXT: return a + b;
// CHECK-NEXT: }
- #pragma omp declare simd
- float taddpf(float *a, float *b) { return *a + *b; }
+ #pragma omp declare simd aligned(a : X * 2) aligned(b)
+ float taddpf(float *a, T *&b) { return *a + *b; }
-// CHECK: #pragma omp declare simd
-// CHECK-NEXT: float taddpf(float *a, float *b) {
+// CHECK: #pragma omp declare simd aligned(a: X * 2) aligned(b)
+// CHECK-NEXT: float taddpf(float *a, T *&b) {
// CHECK-NEXT: return *a + *b;
// CHECK-NEXT: }
@@ -123,20 +123,21 @@ private:
};
// CHECK: };
-// CHECK: #pragma omp declare simd simdlen(64)
-// CHECK: template <int N = 64> void foo(int (&)[64])
-// CHECK: #pragma omp declare simd simdlen(N)
-// CHECK: template <int N> void foo(int (&)[N])
-#pragma omp declare simd simdlen(N)
+// CHECK: #pragma omp declare simd simdlen(64) aligned(b: 64 * 2)
+// CHECK: template <int N = 64> void foo(int (&b)[64])
+// CHECK: #pragma omp declare simd simdlen(N) aligned(b: N * 2)
+// CHECK: template <int N> void foo(int (&b)[N])
+#pragma omp declare simd simdlen(N) aligned(b : N * 2)
template <int N>
-void foo(int (&)[N]);
+void foo(int (&b)[N]);
-// CHECK: TVV<16> t16;
-TVV<16> t16;
+// CHECK: TVV<16, float> t16;
+TVV<16, float> t16;
void f() {
float a = 1.0f, b = 2.0f;
- float r = t16.taddpf(&a, &b);
+ float *p = &b;
+ float r = t16.taddpf(&a, p);
int res = t16.tadd(b);
int c[64];
foo(c);
OpenPOWER on IntegriCloud