mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-20 03:55:48 -04:00

This was further discussed at the llvm dev list: http://lists.llvm.org/pipermail/llvm-dev/2019-October/135602.html I think the brief summary of that is that this change is an improvement, this is the behaviour that we expect and promise in ours docs, and also as a result there are cases where we now emit diagnostics whereas before pragmas were silently ignored. Two areas where we can improve: 1) the diagnostic message itself, and 2) and in some cases (e.g. -Os and -Oz) the vectoriser is (quite understandably) not triggering. Original commit message: Specifying the vectorization width was supposed to implicitly enable vectorization, except that it wasn't really doing this. It was only setting the vectorize.width metadata, but not vectorize.enable. This should fix PR27643. llvm-svn: 374288
76 lines
2.4 KiB
C++
76 lines
2.4 KiB
C++
// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm -o - %s | FileCheck %s
|
|
|
|
void test0(int *List, int Length) {
|
|
// CHECK-LABEL: @{{.*}}test0{{.*}}(
|
|
// CHECK: br label {{.*}}, !llvm.loop ![[LOOP0:.*]]
|
|
|
|
#pragma clang loop vectorize(enable)
|
|
for (int i = 0; i < Length; i++)
|
|
List[i] = i * 2;
|
|
}
|
|
|
|
void test1(int *List, int Length) {
|
|
// CHECK-LABEL: @{{.*}}test1{{.*}}(
|
|
// CHECK: br label {{.*}}, !llvm.loop ![[LOOP1:.*]]
|
|
|
|
#pragma clang loop vectorize(enable) vectorize_predicate(enable)
|
|
for (int i = 0; i < Length; i++)
|
|
List[i] = i * 2;
|
|
}
|
|
|
|
void test2(int *List, int Length) {
|
|
// CHECK-LABEL: @{{.*}}test2{{.*}}(
|
|
// CHECK: br label {{.*}}, !llvm.loop ![[LOOP2:.*]]
|
|
|
|
#pragma clang loop vectorize(enable) vectorize_predicate(disable)
|
|
for (int i = 0; i < Length; i++)
|
|
List[i] = i * 2;
|
|
}
|
|
|
|
// vectorize_predicate(enable) implies vectorize(enable)
|
|
void test3(int *List, int Length) {
|
|
// CHECK-LABEL: @{{.*}}test3{{.*}}(
|
|
// CHECK: br label {{.*}}, !llvm.loop ![[LOOP3:.*]]
|
|
|
|
#pragma clang loop vectorize_predicate(enable)
|
|
for (int i = 0; i < Length; i++)
|
|
List[i] = i * 2;
|
|
}
|
|
|
|
// Check that disabling vectorization means a vectorization width of 1, and
|
|
// also that vectorization_predicate isn't enabled.
|
|
void test4(int *List, int Length) {
|
|
// CHECK-LABEL: @{{.*}}test4{{.*}}(
|
|
// CHECK: br label {{.*}}, !llvm.loop ![[LOOP4:.*]]
|
|
|
|
#pragma clang loop vectorize(disable)
|
|
for (int i = 0; i < Length; i++)
|
|
List[i] = i * 2;
|
|
}
|
|
|
|
// Check that vectorize and vectorize_predicate are disabled.
|
|
void test5(int *List, int Length) {
|
|
// CHECK-LABEL: @{{.*}}test5{{.*}}(
|
|
// CHECK: br label {{.*}}, !llvm.loop ![[LOOP5:.*]]
|
|
|
|
#pragma clang loop vectorize(disable) vectorize_predicate(enable)
|
|
for (int i = 0; i < Length; i++)
|
|
List[i] = i * 2;
|
|
}
|
|
|
|
// CHECK: ![[LOOP0]] = distinct !{![[LOOP0]], !3}
|
|
// CHECK-NEXT: !3 = !{!"llvm.loop.vectorize.enable", i1 true}
|
|
|
|
// CHECK-NEXT: ![[LOOP1]] = distinct !{![[LOOP1]], !5, !3}
|
|
// CHECK-NEXT: !5 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
|
|
|
|
// CHECK-NEXT: ![[LOOP2]] = distinct !{![[LOOP2]], !7, !3}
|
|
// CHECK-NEXT: !7 = !{!"llvm.loop.vectorize.predicate.enable", i1 false}
|
|
|
|
// CHECK-NEXT: ![[LOOP3]] = distinct !{![[LOOP3]], !5, !3}
|
|
|
|
// CHECK-NEXT: ![[LOOP4]] = distinct !{![[LOOP4]], !3, !10}
|
|
// CHECK-NEXT: !10 = !{!"llvm.loop.vectorize.width", i32 1}
|
|
|
|
// CHECK-NEXT: ![[LOOP5]] = distinct !{![[LOOP5]], !3, !10}
|