1 // 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 7 // CHECK: #pragma clang loop unroll_count(16) 8 // CHECK: #pragma clang loop interleave_count(8) 9 // CHECK: #pragma clang loop vectorize_width(4) 10 // CHECK: #pragma clang loop distribute(enable) 11 // CHECK: #pragma clang loop unroll(disable) 12 // CHECK: #pragma clang loop interleave(disable) 13 // CHECK: #pragma clang loop vectorize(enable) 14 // CHECK: #pragma clang loop distribute(disable) 15 // CHECK: #pragma clang loop unroll(full) 16 // CHECK: #pragma clang loop interleave(enable) 17 // CHECK: #pragma clang loop vectorize(disable) 18 // CHECK: #pragma unroll 19 // CHECK: #pragma unroll (32) 20 // CHECK: #pragma nounroll 21 // CHECK: #pragma clang loop interleave_count(I) 22 // CHECK: #pragma clang loop vectorize_width(V) 23 24 #ifndef HEADER 25 #define HEADER 26 27 class pragma_test { 28 public: 29 inline void run1(int *List, int Length) { 30 int i = 0; 31 #pragma clang loop vectorize_width(4) 32 #pragma clang loop interleave_count(8) 33 #pragma clang loop unroll_count(16) 34 while (i < Length) { 35 List[i] = i; 36 i++; 37 } 38 } 39 40 inline void run2(int *List, int Length) { 41 int i = 0; 42 #pragma clang loop vectorize(enable) 43 #pragma clang loop interleave(disable) 44 #pragma clang loop unroll(disable) 45 #pragma clang loop distribute(enable) 46 while (i - 1 < Length) { 47 List[i] = i; 48 i++; 49 } 50 } 51 52 inline void run3(int *List, int Length) { 53 int i = 0; 54 #pragma clang loop vectorize(disable) 55 #pragma clang loop interleave(enable) 56 #pragma clang loop unroll(full) 57 #pragma clang loop distribute(disable) 58 while (i - 3 < Length) { 59 List[i] = i; 60 i++; 61 } 62 } 63 64 inline void run4(int *List, int Length) { 65 int i = 0; 66 #pragma unroll 67 while (i - 3 < Length) { 68 List[i] = i; 69 i++; 70 } 71 } 72 73 inline void run5(int *List, int Length) { 74 int i = 0; 75 #pragma unroll 32 76 while (i - 3 < Length) { 77 List[i] = i; 78 i++; 79 } 80 } 81 82 inline void run6(int *List, int Length) { 83 int i = 0; 84 #pragma nounroll 85 while (i - 3 < Length) { 86 List[i] = i; 87 i++; 88 } 89 } 90 91 template <int V, int I> 92 inline void run7(int *List, int Length) { 93 #pragma clang loop vectorize_width(V) 94 #pragma clang loop interleave_count(I) 95 for (int i = 0; i < Length; i++) { 96 List[i] = i; 97 } 98 } 99 }; 100 #else 101 102 void test() { 103 int List[100]; 104 105 pragma_test pt; 106 107 pt.run1(List, 100); 108 pt.run2(List, 100); 109 pt.run3(List, 100); 110 pt.run4(List, 100); 111 pt.run5(List, 100); 112 pt.run6(List, 100); 113 pt.run7<2, 4>(List, 100); 114 } 115 116 #endif 117