blob: 2640020f0007793063ef8ce5ec5bf1b029298695 [file] [log] [blame]
Reid Kleckner4173f6a2014-06-10 21:35:24 +00001// RUN: %clang_cc1 -emit-pch -o %t.a %s
2// RUN: %clang_cc1 -include-pch %t.a %s -ast-print -o - | FileCheck %s
3
4// FIXME: A bug in ParsedAttributes causes the order of the attributes to be
5// reversed. The checks are consequently in the reverse order below.
6
Eli Bendersky86483b32014-06-11 17:56:26 +00007// CHECK: #pragma clang loop unroll_count(16)
Reid Kleckner4173f6a2014-06-10 21:35:24 +00008// CHECK: #pragma clang loop interleave_count(8)
9// CHECK: #pragma clang loop vectorize_width(4)
Eli Bendersky86483b32014-06-11 17:56:26 +000010// CHECK: #pragma clang loop unroll(disable)
Reid Kleckner4173f6a2014-06-10 21:35:24 +000011// CHECK: #pragma clang loop interleave(disable)
12// CHECK: #pragma clang loop vectorize(enable)
Mark Heffernan450c2382014-07-23 17:31:31 +000013// CHECK: #pragma clang loop unroll(full)
Reid Kleckner4173f6a2014-06-10 21:35:24 +000014// CHECK: #pragma clang loop interleave(enable)
15// CHECK: #pragma clang loop vectorize(disable)
Mark Heffernanbd26f5e2014-07-21 18:08:34 +000016// CHECK: #pragma unroll
17// CHECK: #pragma unroll (32)
Mark Heffernanc888e412014-07-24 18:09:38 +000018// CHECK: #pragma nounroll
Tyler Nowickic724a83e2014-10-12 20:46:07 +000019// CHECK: #pragma clang loop interleave_count(I)
20// CHECK: #pragma clang loop vectorize_width(V)
Reid Kleckner4173f6a2014-06-10 21:35:24 +000021
22#ifndef HEADER
23#define HEADER
24
25class pragma_test {
26public:
27 inline void run1(int *List, int Length) {
28 int i = 0;
29#pragma clang loop vectorize_width(4)
30#pragma clang loop interleave_count(8)
Eli Bendersky86483b32014-06-11 17:56:26 +000031#pragma clang loop unroll_count(16)
Reid Kleckner4173f6a2014-06-10 21:35:24 +000032 while (i < Length) {
33 List[i] = i;
34 i++;
35 }
36 }
37
38 inline void run2(int *List, int Length) {
39 int i = 0;
40#pragma clang loop vectorize(enable)
41#pragma clang loop interleave(disable)
Eli Bendersky86483b32014-06-11 17:56:26 +000042#pragma clang loop unroll(disable)
Reid Kleckner4173f6a2014-06-10 21:35:24 +000043 while (i - 1 < Length) {
44 List[i] = i;
45 i++;
46 }
47 }
48
49 inline void run3(int *List, int Length) {
50 int i = 0;
51#pragma clang loop vectorize(disable)
52#pragma clang loop interleave(enable)
Mark Heffernan450c2382014-07-23 17:31:31 +000053#pragma clang loop unroll(full)
Reid Kleckner4173f6a2014-06-10 21:35:24 +000054 while (i - 3 < Length) {
55 List[i] = i;
56 i++;
57 }
58 }
Mark Heffernanbd26f5e2014-07-21 18:08:34 +000059
60 inline void run4(int *List, int Length) {
61 int i = 0;
62#pragma unroll
63 while (i - 3 < Length) {
64 List[i] = i;
65 i++;
66 }
67 }
68
69 inline void run5(int *List, int Length) {
70 int i = 0;
71#pragma unroll 32
72 while (i - 3 < Length) {
73 List[i] = i;
74 i++;
75 }
76 }
Reid Kleckner4173f6a2014-06-10 21:35:24 +000077
Mark Heffernanc888e412014-07-24 18:09:38 +000078 inline void run6(int *List, int Length) {
79 int i = 0;
80#pragma nounroll
81 while (i - 3 < Length) {
82 List[i] = i;
83 i++;
84 }
85 }
Tyler Nowickic724a83e2014-10-12 20:46:07 +000086
87 template <int V, int I>
88 inline void run7(int *List, int Length) {
89#pragma clang loop vectorize_width(V)
90#pragma clang loop interleave_count(I)
91 for (int i = 0; i < Length; i++) {
92 List[i] = i;
93 }
94 }
Mark Heffernanc888e412014-07-24 18:09:38 +000095};
Reid Kleckner4173f6a2014-06-10 21:35:24 +000096#else
97
98void test() {
99 int List[100];
100
101 pragma_test pt;
102
103 pt.run1(List, 100);
104 pt.run2(List, 100);
105 pt.run3(List, 100);
Mark Heffernanbd26f5e2014-07-21 18:08:34 +0000106 pt.run4(List, 100);
107 pt.run5(List, 100);
Mark Heffernanc888e412014-07-24 18:09:38 +0000108 pt.run6(List, 100);
Tyler Nowickic724a83e2014-10-12 20:46:07 +0000109 pt.run7<2, 4>(List, 100);
Reid Kleckner4173f6a2014-06-10 21:35:24 +0000110}
111
112#endif