1c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// RUN: %clang_cc1 -emit-pch -o %t.a %s 2c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// RUN: %clang_cc1 -include-pch %t.a %s -ast-print -o - | FileCheck %s 3c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 4c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// FIXME: A bug in ParsedAttributes causes the order of the attributes to be 5c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// reversed. The checks are consequently in the reverse order below. 6c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 7c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: #pragma clang loop unroll_count(16) 8c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: #pragma clang loop interleave_count(8) 9c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: #pragma clang loop vectorize_width(4) 10c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: #pragma clang loop unroll(disable) 11c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: #pragma clang loop interleave(disable) 12c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: #pragma clang loop vectorize(enable) 13176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: #pragma clang loop unroll(full) 14c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: #pragma clang loop interleave(enable) 15c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK: #pragma clang loop vectorize(disable) 16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: #pragma unroll 17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: #pragma unroll (32) 18176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: #pragma nounroll 19176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: #pragma clang loop interleave_count(I) 20176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: #pragma clang loop vectorize_width(V) 21c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 22c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#ifndef HEADER 23c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#define HEADER 24c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 25c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesclass pragma_test { 26c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic: 27c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines inline void run1(int *List, int Length) { 28c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines int i = 0; 29c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma clang loop vectorize_width(4) 30c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma clang loop interleave_count(8) 31c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma clang loop unroll_count(16) 32c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines while (i < Length) { 33c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines List[i] = i; 34c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines i++; 35c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 36c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 37c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 38c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines inline void run2(int *List, int Length) { 39c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines int i = 0; 40c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma clang loop vectorize(enable) 41c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma clang loop interleave(disable) 42c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma clang loop unroll(disable) 43c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines while (i - 1 < Length) { 44c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines List[i] = i; 45c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines i++; 46c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 47c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 48c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 49c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines inline void run3(int *List, int Length) { 50c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines int i = 0; 51c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma clang loop vectorize(disable) 52c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma clang loop interleave(enable) 53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma clang loop unroll(full) 54176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines while (i - 3 < Length) { 55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines List[i] = i; 56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines i++; 57176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 58176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines inline void run4(int *List, int Length) { 61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines int i = 0; 62176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma unroll 63176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines while (i - 3 < Length) { 64176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines List[i] = i; 65176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines i++; 66176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 67176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 68176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 69176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines inline void run5(int *List, int Length) { 70176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines int i = 0; 71176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma unroll 32 72c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines while (i - 3 < Length) { 73c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines List[i] = i; 74c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines i++; 75c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 76c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 77c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 78176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines inline void run6(int *List, int Length) { 79176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines int i = 0; 80176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma nounroll 81176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines while (i - 3 < Length) { 82176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines List[i] = i; 83176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines i++; 84176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 85176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 86176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 87176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template <int V, int I> 88176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines inline void run7(int *List, int Length) { 89176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma clang loop vectorize_width(V) 90176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma clang loop interleave_count(I) 91176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int i = 0; i < Length; i++) { 92176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines List[i] = i; 93176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 94176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 95176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}; 96c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#else 97c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 98c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid test() { 99c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines int List[100]; 100c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 101c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines pragma_test pt; 102c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 103c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines pt.run1(List, 100); 104c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines pt.run2(List, 100); 105c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines pt.run3(List, 100); 106176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines pt.run4(List, 100); 107176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines pt.run5(List, 100); 108176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines pt.run6(List, 100); 109176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines pt.run7<2, 4>(List, 100); 110c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 111c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 112c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#endif 113