pragma-loop.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. // FIXME: A bug in ParsedAttributes causes the order of the attributes to be
  4. // reversed. The checks are consequently in the reverse order below.
  5. // CHECK: #pragma clang loop unroll_count(16)
  6. // CHECK: #pragma clang loop interleave_count(8)
  7. // CHECK: #pragma clang loop vectorize_width(4)
  8. // CHECK: #pragma clang loop unroll(disable)
  9. // CHECK: #pragma clang loop interleave(disable)
  10. // CHECK: #pragma clang loop vectorize(enable)
  11. // CHECK: #pragma clang loop unroll(full)
  12. // CHECK: #pragma clang loop interleave(enable)
  13. // CHECK: #pragma clang loop vectorize(disable)
  14. // CHECK: #pragma unroll
  15. // CHECK: #pragma unroll (32)
  16. // CHECK: #pragma nounroll
  17. // CHECK: #pragma clang loop interleave_count(I)
  18. // CHECK: #pragma clang loop vectorize_width(V)
  19. #ifndef HEADER
  20. #define HEADER
  21. class pragma_test {
  22. public:
  23. inline void run1(int *List, int Length) {
  24. int i = 0;
  25. #pragma clang loop vectorize_width(4)
  26. #pragma clang loop interleave_count(8)
  27. #pragma clang loop unroll_count(16)
  28. while (i < Length) {
  29. List[i] = i;
  30. i++;
  31. }
  32. }
  33. inline void run2(int *List, int Length) {
  34. int i = 0;
  35. #pragma clang loop vectorize(enable)
  36. #pragma clang loop interleave(disable)
  37. #pragma clang loop unroll(disable)
  38. while (i - 1 < Length) {
  39. List[i] = i;
  40. i++;
  41. }
  42. }
  43. inline void run3(int *List, int Length) {
  44. int i = 0;
  45. #pragma clang loop vectorize(disable)
  46. #pragma clang loop interleave(enable)
  47. #pragma clang loop unroll(full)
  48. while (i - 3 < Length) {
  49. List[i] = i;
  50. i++;
  51. }
  52. }
  53. inline void run4(int *List, int Length) {
  54. int i = 0;
  55. #pragma unroll
  56. while (i - 3 < Length) {
  57. List[i] = i;
  58. i++;
  59. }
  60. }
  61. inline void run5(int *List, int Length) {
  62. int i = 0;
  63. #pragma unroll 32
  64. while (i - 3 < Length) {
  65. List[i] = i;
  66. i++;
  67. }
  68. }
  69. inline void run6(int *List, int Length) {
  70. int i = 0;
  71. #pragma nounroll
  72. while (i - 3 < Length) {
  73. List[i] = i;
  74. i++;
  75. }
  76. }
  77. template <int V, int I>
  78. inline void run7(int *List, int Length) {
  79. #pragma clang loop vectorize_width(V)
  80. #pragma clang loop interleave_count(I)
  81. for (int i = 0; i < Length; i++) {
  82. List[i] = i;
  83. }
  84. }
  85. };
  86. #else
  87. void test() {
  88. int List[100];
  89. pragma_test pt;
  90. pt.run1(List, 100);
  91. pt.run2(List, 100);
  92. pt.run3(List, 100);
  93. pt.run4(List, 100);
  94. pt.run5(List, 100);
  95. pt.run6(List, 100);
  96. pt.run7<2, 4>(List, 100);
  97. }
  98. #endif