Summary:
This is similar to other loop pragmas like 'vectorize'. Currently it
only has state values: distribute(enable) and distribute(disable). When
one of these is specified the corresponding loop metadata is generated:
!{!"llvm.loop.distribute.enable", i1 true/false}
As a result, loop distribution will be attempted on the loop even if
Loop Distribution in not enabled globally. Analogously, with 'disable'
distribution can be turned off for an individual loop even when the pass
is otherwise enabled.
There are some slight differences compared to the existing loop pragmas.
1. There is no 'assume_safety' variant which makes its handling slightly
different from 'vectorize'/'interleave'.
2. Unlike the existing loop pragmas, it does not have a corresponding
numeric pragma like 'vectorize' -> 'vectorize_width'. So for the
consistency checks in CheckForIncompatibleAttributes we don't need to
check it against other pragmas. We just need to check for duplicates of
the same pragma.
Reviewers: rsmith, dexonsmith, aaron.ballman
Subscribers: bob.wilson, cfe-commits, hfinkel
Differential Revision: http://reviews.llvm.org/D19403
llvm-svn: 272656
117 lines
2.6 KiB
C++
117 lines
2.6 KiB
C++
// RUN: %clang_cc1 -emit-pch -o %t.a %s
|
|
// RUN: %clang_cc1 -include-pch %t.a %s -ast-print -o - | FileCheck %s
|
|
|
|
// FIXME: A bug in ParsedAttributes causes the order of the attributes to be
|
|
// reversed. The checks are consequently in the reverse order below.
|
|
|
|
// CHECK: #pragma clang loop unroll_count(16)
|
|
// CHECK: #pragma clang loop interleave_count(8)
|
|
// CHECK: #pragma clang loop vectorize_width(4)
|
|
// CHECK: #pragma clang loop distribute(enable)
|
|
// CHECK: #pragma clang loop unroll(disable)
|
|
// CHECK: #pragma clang loop interleave(disable)
|
|
// CHECK: #pragma clang loop vectorize(enable)
|
|
// CHECK: #pragma clang loop distribute(disable)
|
|
// CHECK: #pragma clang loop unroll(full)
|
|
// CHECK: #pragma clang loop interleave(enable)
|
|
// CHECK: #pragma clang loop vectorize(disable)
|
|
// CHECK: #pragma unroll
|
|
// CHECK: #pragma unroll (32)
|
|
// CHECK: #pragma nounroll
|
|
// CHECK: #pragma clang loop interleave_count(I)
|
|
// CHECK: #pragma clang loop vectorize_width(V)
|
|
|
|
#ifndef HEADER
|
|
#define HEADER
|
|
|
|
class pragma_test {
|
|
public:
|
|
inline void run1(int *List, int Length) {
|
|
int i = 0;
|
|
#pragma clang loop vectorize_width(4)
|
|
#pragma clang loop interleave_count(8)
|
|
#pragma clang loop unroll_count(16)
|
|
while (i < Length) {
|
|
List[i] = i;
|
|
i++;
|
|
}
|
|
}
|
|
|
|
inline void run2(int *List, int Length) {
|
|
int i = 0;
|
|
#pragma clang loop vectorize(enable)
|
|
#pragma clang loop interleave(disable)
|
|
#pragma clang loop unroll(disable)
|
|
#pragma clang loop distribute(enable)
|
|
while (i - 1 < Length) {
|
|
List[i] = i;
|
|
i++;
|
|
}
|
|
}
|
|
|
|
inline void run3(int *List, int Length) {
|
|
int i = 0;
|
|
#pragma clang loop vectorize(disable)
|
|
#pragma clang loop interleave(enable)
|
|
#pragma clang loop unroll(full)
|
|
#pragma clang loop distribute(disable)
|
|
while (i - 3 < Length) {
|
|
List[i] = i;
|
|
i++;
|
|
}
|
|
}
|
|
|
|
inline void run4(int *List, int Length) {
|
|
int i = 0;
|
|
#pragma unroll
|
|
while (i - 3 < Length) {
|
|
List[i] = i;
|
|
i++;
|
|
}
|
|
}
|
|
|
|
inline void run5(int *List, int Length) {
|
|
int i = 0;
|
|
#pragma unroll 32
|
|
while (i - 3 < Length) {
|
|
List[i] = i;
|
|
i++;
|
|
}
|
|
}
|
|
|
|
inline void run6(int *List, int Length) {
|
|
int i = 0;
|
|
#pragma nounroll
|
|
while (i - 3 < Length) {
|
|
List[i] = i;
|
|
i++;
|
|
}
|
|
}
|
|
|
|
template <int V, int I>
|
|
inline void run7(int *List, int Length) {
|
|
#pragma clang loop vectorize_width(V)
|
|
#pragma clang loop interleave_count(I)
|
|
for (int i = 0; i < Length; i++) {
|
|
List[i] = i;
|
|
}
|
|
}
|
|
};
|
|
#else
|
|
|
|
void test() {
|
|
int List[100];
|
|
|
|
pragma_test pt;
|
|
|
|
pt.run1(List, 100);
|
|
pt.run2(List, 100);
|
|
pt.run3(List, 100);
|
|
pt.run4(List, 100);
|
|
pt.run5(List, 100);
|
|
pt.run6(List, 100);
|
|
pt.run7<2, 4>(List, 100);
|
|
}
|
|
|
|
#endif
|