
This adds support for the unroll_and_jam pragma, to go with the recently added unroll and jam pass. The name of the pragma is the same as is used in the Intel compiler, and most of the code works the same as for unroll. #pragma clang loop unroll_and_jam has been separated into a different patch. This part adds #pragma unroll_and_jam with an optional count, and #pragma no_unroll_and_jam to disable the transform. Differential Revision: https://reviews.llvm.org/D47267 llvm-svn: 338566
56 lines
1.9 KiB
C++
56 lines
1.9 KiB
C++
// RUN: %clang_cc1 -triple arm-none-eabi -std=c++11 -emit-llvm -o - %s | FileCheck %s
|
|
|
|
void unroll_and_jam(int *List, int Length, int Value) {
|
|
// CHECK-LABEL: define {{.*}} @_Z14unroll_and_jam
|
|
#pragma unroll_and_jam
|
|
for (int i = 0; i < Length; i++) {
|
|
for (int j = 0; j < Length; j++) {
|
|
// CHECK: br label {{.*}}, !llvm.loop ![[LOOP_1:.*]]
|
|
List[i * Length + j] = Value;
|
|
}
|
|
}
|
|
}
|
|
|
|
void unroll_and_jam_count(int *List, int Length, int Value) {
|
|
// CHECK-LABEL: define {{.*}} @_Z20unroll_and_jam_count
|
|
#pragma unroll_and_jam(4)
|
|
for (int i = 0; i < Length; i++) {
|
|
for (int j = 0; j < Length; j++) {
|
|
// CHECK: br label {{.*}}, !llvm.loop ![[LOOP_2:.*]]
|
|
List[i * Length + j] = Value;
|
|
}
|
|
}
|
|
}
|
|
|
|
void nounroll_and_jam(int *List, int Length, int Value) {
|
|
// CHECK-LABEL: define {{.*}} @_Z16nounroll_and_jam
|
|
#pragma nounroll_and_jam
|
|
for (int i = 0; i < Length; i++) {
|
|
for (int j = 0; j < Length; j++) {
|
|
// CHECK: br label {{.*}}, !llvm.loop ![[LOOP_3:.*]]
|
|
List[i * Length + j] = Value;
|
|
}
|
|
}
|
|
}
|
|
|
|
void clang_unroll_plus_nounroll_and_jam(int *List, int Length, int Value) {
|
|
// CHECK-LABEL: define {{.*}} @_Z34clang_unroll_plus_nounroll_and_jam
|
|
#pragma nounroll_and_jam
|
|
#pragma unroll(4)
|
|
for (int i = 0; i < Length; i++) {
|
|
for (int j = 0; j < Length; j++) {
|
|
// CHECK: br label {{.*}}, !llvm.loop ![[LOOP_7:.*]]
|
|
List[i * Length + j] = Value;
|
|
}
|
|
}
|
|
}
|
|
|
|
// CHECK: ![[LOOP_1]] = distinct !{![[LOOP_1]], ![[UNJ_ENABLE:.*]]}
|
|
// CHECK: ![[UNJ_ENABLE]] = !{!"llvm.loop.unroll_and_jam.enable"}
|
|
// CHECK: ![[LOOP_2]] = distinct !{![[LOOP_2]], ![[UNJ_4:.*]]}
|
|
// CHECK: ![[UNJ_4]] = !{!"llvm.loop.unroll_and_jam.count", i32 4}
|
|
// CHECK: ![[LOOP_3]] = distinct !{![[LOOP_3]], ![[UNJ_DISABLE:.*]]}
|
|
// CHECK: ![[UNJ_DISABLE]] = !{!"llvm.loop.unroll_and_jam.disable"}
|
|
// CHECK: ![[LOOP_7]] = distinct !{![[LOOP_7]], ![[UNROLL_4:.*]], ![[UNJ_DISABLE:.*]]}
|
|
// CHECK: ![[UNROLL_4]] = !{!"llvm.loop.unroll.count", i32 4}
|