diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2015-09-06 18:36:24 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2015-09-06 18:36:24 +0000 |
commit | 36c5ade2f4674b544039d78db4c466756cf142b0 (patch) | |
tree | 3d3ed1e1987dbe6444294b1b4e249814b97b97a5 /test/OpenMP/for_codegen.cpp | |
parent | 51ece4aae5857052d224ce52277924c74685714e (diff) |
Import clang 3.7.0 release (r246257).vendor/clang/clang-release_370-r246257
Notes
Notes:
svn path=/vendor/clang/dist/; revision=287512
svn path=/vendor/clang/clang-release_370-r246257/; revision=287513; tag=vendor/clang/clang-release_370-r246257
Diffstat (limited to 'test/OpenMP/for_codegen.cpp')
-rw-r--r-- | test/OpenMP/for_codegen.cpp | 79 |
1 files changed, 70 insertions, 9 deletions
diff --git a/test/OpenMP/for_codegen.cpp b/test/OpenMP/for_codegen.cpp index 082a0d4d8841..9db157011075 100644 --- a/test/OpenMP/for_codegen.cpp +++ b/test/OpenMP/for_codegen.cpp @@ -329,14 +329,9 @@ void test_precond() { // CHECK: [[A_ADDR:%.+]] = alloca i8, // CHECK: [[I_ADDR:%.+]] = alloca i8, char a = 0; - // CHECK: store i32 0, i32* [[IV_ADDR:%.+]], - // CHECK: [[A:%.+]] = load i8, i8* [[A_ADDR]], - // CHECK: [[CONV:%.+]] = sext i8 [[A]] to i32 - // CHECK: [[IV:%.+]] = load i32, i32* [[IV_ADDR]], - // CHECK: [[MUL:%.+]] = mul nsw i32 [[IV]], 1 - // CHECK: [[ADD:%.+]] = add nsw i32 [[CONV]], [[MUL]] - // CHECK: [[CONV:%.+]] = trunc i32 [[ADD]] to i8 - // CHECK: store i8 [[CONV]], i8* [[I_ADDR]], + // CHECK: store i8 0, + // CHECK: store i32 + // CHECK: store i8 // CHECK: [[A:%.+]] = load i8, i8* [[A_ADDR]], // CHECK: [[CONV:%.+]] = sext i8 [[A]] to i32 // CHECK: [[CMP:%.+]] = icmp slt i32 [[CONV]], 10 @@ -389,6 +384,7 @@ void for_with_global_lcv() { // CHECK: store i8 [[I_VAL]], i8* [[K]] // CHECK-NOT: [[I]] // CHECK: call void @__kmpc_for_static_fini( +// CHECK: call void @__kmpc_barrier( #pragma omp for for (i = 0; i < 2; ++i) { k = i; @@ -410,5 +406,70 @@ void for_with_global_lcv() { } } -#endif // HEADER +struct Bool { + Bool(bool b) : b(b) {} + operator bool() const { return b; } + const bool b; +}; + +template <typename T> +struct It { + It() : p(0) {} + It(const It &, int = 0) ; + template <typename U> + It(U &, int = 0) ; + It &operator=(const It &); + It &operator=(It &); + ~It() {} + + It(T *p) : p(p) {} + + operator T *&() { return p; } + operator T *() const { return p; } + T *operator->() const { return p; } + + It &operator++() { ++p; return *this; } + It &operator--() { --p; return *this; } + It &operator+=(unsigned n) { p += n; return *this; } + It &operator-=(unsigned n) { p -= n; return *this; } + + T *p; +}; + +template <typename T> +It<T> operator+(It<T> a, typename It<T>::difference_type n) { return a.p + n; } + +template <typename T> +It<T> operator+(typename It<T>::difference_type n, It<T> a) { return a.p + n; } + +template <typename T> +It<T> operator-(It<T> a, typename It<T>::difference_type n) { return a.p - n; } + +typedef Bool BoolType; + +template <typename T> +BoolType operator<(It<T> a, It<T> b) { return a.p < b.p; } +void loop_with_It(It<char> begin, It<char> end) { +#pragma omp for + for (It<char> it = begin; it < end; ++it) { + *it = 0; + } +} + +// CHECK-LABEL: loop_with_It +// CHECK: call i32 @__kmpc_global_thread_num( +// CHECK: call void @__kmpc_for_static_init_8( +// CHECK: call void @__kmpc_for_static_fini( + +void loop_with_stmt_expr() { +#pragma omp for + for (int i = __extension__({float b = 0;b; }); i < __extension__({double c = 1;c; }); i += __extension__({char d = 1; d; })) + ; +} +// CHECK-LABEL: loop_with_stmt_expr +// CHECK: call i32 @__kmpc_global_thread_num( +// CHECK: call void @__kmpc_for_static_init_4( +// CHECK: call void @__kmpc_for_static_fini( + +#endif // HEADER |