forked from OSchip/llvm-project
Revert r372082 "[Clang] Pragma vectorize_width() implies vectorize(enable)"
This broke the Chromium build. Consider the following code: float ScaleSumSamples_C(const float* src, float* dst, float scale, int width) { float fsum = 0.f; int i; #if defined(__clang__) #pragma clang loop vectorize_width(4) #endif for (i = 0; i < width; ++i) { float v = *src++; fsum += v * v; *dst++ = v * scale; } return fsum; } Compiling at -Oz, Clang now warns: $ clang++ -target x86_64 -Oz -c /tmp/a.cc /tmp/a.cc:1:7: warning: loop not vectorized: the optimizer was unable to perform the requested transformation; the transformation might be disabled or specified as part of an unsupported transformation ordering [-Wpass-failed=transform-warning] this suggests it's not actually enabling vectorization hard enough. At -Os it asserts instead: $ build.release/bin/clang++ -target x86_64 -Os -c /tmp/a.cc clang-10: /work/llvm.monorepo/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp:2734: void llvm::InnerLoopVectorizer::emitMemRuntimeChecks(llvm::Loop*, llvm::BasicBlock*): Assertion ` !BB->getParent()->hasOptSize() && "Cannot emit memory checks when optimizing for size"' failed. Of course neither of these are what the developer expected from the pragma. > 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. > > Differential Revision: https://reviews.llvm.org/D66290 llvm-svn: 372225
This commit is contained in:
parent
89ad7f7a1b
commit
858a1ae37d
|
@ -270,14 +270,6 @@ LoopInfo::createLoopVectorizeMetadata(const LoopAttributes &Attrs,
|
||||||
|
|
||||||
// Setting vectorize.width
|
// Setting vectorize.width
|
||||||
if (Attrs.VectorizeWidth > 0) {
|
if (Attrs.VectorizeWidth > 0) {
|
||||||
// This implies vectorize.enable = true, but only add it when it is not
|
|
||||||
// already enabled.
|
|
||||||
if (Attrs.VectorizeEnable != LoopAttributes::Enable)
|
|
||||||
Args.push_back(
|
|
||||||
MDNode::get(Ctx, {MDString::get(Ctx, "llvm.loop.vectorize.enable"),
|
|
||||||
ConstantAsMetadata::get(ConstantInt::get(
|
|
||||||
llvm::Type::getInt1Ty(Ctx), 1))}));
|
|
||||||
|
|
||||||
Metadata *Vals[] = {
|
Metadata *Vals[] = {
|
||||||
MDString::get(Ctx, "llvm.loop.vectorize.width"),
|
MDString::get(Ctx, "llvm.loop.vectorize.width"),
|
||||||
ConstantAsMetadata::get(ConstantInt::get(llvm::Type::getInt32Ty(Ctx),
|
ConstantAsMetadata::get(ConstantInt::get(llvm::Type::getInt32Ty(Ctx),
|
||||||
|
|
|
@ -58,6 +58,7 @@ void test5(int *List, int Length) {
|
||||||
List[i] = i * 2;
|
List[i] = i * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// CHECK: ![[LOOP0]] = distinct !{![[LOOP0]], !3}
|
// CHECK: ![[LOOP0]] = distinct !{![[LOOP0]], !3}
|
||||||
// CHECK-NEXT: !3 = !{!"llvm.loop.vectorize.enable", i1 true}
|
// CHECK-NEXT: !3 = !{!"llvm.loop.vectorize.enable", i1 true}
|
||||||
|
|
||||||
|
@ -69,7 +70,7 @@ void test5(int *List, int Length) {
|
||||||
|
|
||||||
// CHECK-NEXT: ![[LOOP3]] = distinct !{![[LOOP3]], !5, !3}
|
// CHECK-NEXT: ![[LOOP3]] = distinct !{![[LOOP3]], !5, !3}
|
||||||
|
|
||||||
// CHECK-NEXT: ![[LOOP4]] = distinct !{![[LOOP4]], !3, !10}
|
// CHECK-NEXT: ![[LOOP4]] = distinct !{![[LOOP4]], !10}
|
||||||
// CHECK-NEXT: !10 = !{!"llvm.loop.vectorize.width", i32 1}
|
// CHECK-NEXT: !10 = !{!"llvm.loop.vectorize.width", i32 1}
|
||||||
|
|
||||||
// CHECK-NEXT: ![[LOOP5]] = distinct !{![[LOOP5]], !3, !10}
|
// CHECK-NEXT: ![[LOOP5]] = distinct !{![[LOOP5]], !10}
|
||||||
|
|
|
@ -158,41 +158,23 @@ void template_test(double *List, int Length) {
|
||||||
for_template_constant_expression_test<double, 2, 4, 8>(List, Length);
|
for_template_constant_expression_test<double, 2, 4, 8>(List, Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vec_width_1(int *List, int Length) {
|
|
||||||
// CHECK-LABEL: @{{.*}}vec_width_1{{.*}}(
|
|
||||||
// CHECK: br label {{.*}}, !llvm.loop ![[LOOP_15:.*]]
|
|
||||||
|
|
||||||
#pragma clang loop vectorize(enable) vectorize_width(1)
|
|
||||||
for (int i = 0; i < Length; i++)
|
|
||||||
List[i] = i * 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
void width_1(int *List, int Length) {
|
|
||||||
// CHECK-LABEL: @{{.*}}width_1{{.*}}(
|
|
||||||
// CHECK: br label {{.*}}, !llvm.loop ![[LOOP_16:.*]]
|
|
||||||
|
|
||||||
#pragma clang loop vectorize_width(1)
|
|
||||||
for (int i = 0; i < Length; i++)
|
|
||||||
List[i] = i * 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// CHECK: ![[LOOP_1]] = distinct !{![[LOOP_1]], ![[UNROLL_FULL:.*]]}
|
// CHECK: ![[LOOP_1]] = distinct !{![[LOOP_1]], ![[UNROLL_FULL:.*]]}
|
||||||
// CHECK: ![[UNROLL_FULL]] = !{!"llvm.loop.unroll.full"}
|
// CHECK: ![[UNROLL_FULL]] = !{!"llvm.loop.unroll.full"}
|
||||||
|
|
||||||
// CHECK: ![[LOOP_2]] = distinct !{![[LOOP_2]], ![[UNROLL_DISABLE:.*]], ![[DISTRIBUTE_DISABLE:.*]], ![[VECTORIZE_ENABLE:.*]], ![[WIDTH_8:.*]], ![[INTERLEAVE_4:.*]]}
|
// CHECK: ![[LOOP_2]] = distinct !{![[LOOP_2]], ![[UNROLL_DISABLE:.*]], ![[DISTRIBUTE_DISABLE:.*]], ![[WIDTH_8:.*]], ![[INTERLEAVE_4:.*]]}
|
||||||
// CHECK: ![[UNROLL_DISABLE]] = !{!"llvm.loop.unroll.disable"}
|
// CHECK: ![[UNROLL_DISABLE]] = !{!"llvm.loop.unroll.disable"}
|
||||||
// CHECK: ![[DISTRIBUTE_DISABLE]] = !{!"llvm.loop.distribute.enable", i1 false}
|
// CHECK: ![[DISTRIBUTE_DISABLE]] = !{!"llvm.loop.distribute.enable", i1 false}
|
||||||
// CHECK: ![[VECTORIZE_ENABLE]] = !{!"llvm.loop.vectorize.enable", i1 true}
|
|
||||||
// CHECK: ![[WIDTH_8]] = !{!"llvm.loop.vectorize.width", i32 8}
|
// CHECK: ![[WIDTH_8]] = !{!"llvm.loop.vectorize.width", i32 8}
|
||||||
// CHECK: ![[INTERLEAVE_4]] = !{!"llvm.loop.interleave.count", i32 4}
|
// CHECK: ![[INTERLEAVE_4]] = !{!"llvm.loop.interleave.count", i32 4}
|
||||||
|
|
||||||
// CHECK: ![[LOOP_3]] = distinct !{![[LOOP_3]], ![[INTERLEAVE_4:.*]], ![[VECTORIZE_ENABLE]], ![[FOLLOWUP_VECTOR_3:.*]]}
|
// CHECK: ![[LOOP_3]] = distinct !{![[LOOP_3]], ![[INTERLEAVE_4:.*]], ![[INTENABLE_1:.*]], ![[FOLLOWUP_VECTOR_3:.*]]}
|
||||||
|
// CHECK: ![[INTENABLE_1]] = !{!"llvm.loop.vectorize.enable", i1 true}
|
||||||
// CHECK: ![[FOLLOWUP_VECTOR_3]] = !{!"llvm.loop.vectorize.followup_all", ![[AFTER_VECTOR_3:.*]]}
|
// CHECK: ![[FOLLOWUP_VECTOR_3]] = !{!"llvm.loop.vectorize.followup_all", ![[AFTER_VECTOR_3:.*]]}
|
||||||
// CHECK: ![[AFTER_VECTOR_3]] = distinct !{![[AFTER_VECTOR_3]], ![[ISVECTORIZED:.*]], ![[UNROLL_8:.*]]}
|
// CHECK: ![[AFTER_VECTOR_3]] = distinct !{![[AFTER_VECTOR_3]], ![[ISVECTORIZED:.*]], ![[UNROLL_8:.*]]}
|
||||||
// CHECK: ![[ISVECTORIZED]] = !{!"llvm.loop.isvectorized"}
|
// CHECK: ![[ISVECTORIZED]] = !{!"llvm.loop.isvectorized"}
|
||||||
// CHECK: ![[UNROLL_8]] = !{!"llvm.loop.unroll.count", i32 8}
|
// CHECK: ![[UNROLL_8]] = !{!"llvm.loop.unroll.count", i32 8}
|
||||||
|
|
||||||
// CHECK: ![[LOOP_4]] = distinct !{![[LOOP_4]], ![[VECTORIZE_ENABLE]], ![[WIDTH_2:.*]], ![[INTERLEAVE_2:.*]]}
|
// CHECK: ![[LOOP_4]] = distinct !{![[LOOP_4]], ![[WIDTH_2:.*]], ![[INTERLEAVE_2:.*]]}
|
||||||
// CHECK: ![[WIDTH_2]] = !{!"llvm.loop.vectorize.width", i32 2}
|
// CHECK: ![[WIDTH_2]] = !{!"llvm.loop.vectorize.width", i32 2}
|
||||||
// CHECK: ![[INTERLEAVE_2]] = !{!"llvm.loop.interleave.count", i32 2}
|
// CHECK: ![[INTERLEAVE_2]] = !{!"llvm.loop.interleave.count", i32 2}
|
||||||
|
|
||||||
|
@ -203,7 +185,7 @@ void width_1(int *List, int Length) {
|
||||||
// CHECK: ![[FOLLOWUP_VECTOR_6]] = !{!"llvm.loop.vectorize.followup_all", ![[AFTER_VECTOR_6:.*]]}
|
// CHECK: ![[FOLLOWUP_VECTOR_6]] = !{!"llvm.loop.vectorize.followup_all", ![[AFTER_VECTOR_6:.*]]}
|
||||||
// CHECK: ![[AFTER_VECTOR_6]] = distinct !{![[AFTER_VECTOR_6]], ![[ISVECTORIZED:.*]], ![[UNROLL_8:.*]]}
|
// CHECK: ![[AFTER_VECTOR_6]] = distinct !{![[AFTER_VECTOR_6]], ![[ISVECTORIZED:.*]], ![[UNROLL_8:.*]]}
|
||||||
|
|
||||||
// CHECK: ![[LOOP_7]] = distinct !{![[LOOP_7]], ![[VECTORIZE_ENABLE]], ![[WIDTH_5:.*]]}
|
// CHECK: ![[LOOP_7]] = distinct !{![[LOOP_7]], ![[WIDTH_5:.*]]}
|
||||||
// CHECK: ![[WIDTH_5]] = !{!"llvm.loop.vectorize.width", i32 5}
|
// CHECK: ![[WIDTH_5]] = !{!"llvm.loop.vectorize.width", i32 5}
|
||||||
|
|
||||||
// CHECK: ![[LOOP_8]] = distinct !{![[LOOP_8]], ![[WIDTH_5:.*]]}
|
// CHECK: ![[LOOP_8]] = distinct !{![[LOOP_8]], ![[WIDTH_5:.*]]}
|
||||||
|
@ -231,9 +213,5 @@ void width_1(int *List, int Length) {
|
||||||
// CHECK: ![[AFTER_VECTOR_13]] = distinct !{![[AFTER_VECTOR_13]], ![[ISVECTORIZED:.*]], ![[UNROLL_32:.*]]}
|
// CHECK: ![[AFTER_VECTOR_13]] = distinct !{![[AFTER_VECTOR_13]], ![[ISVECTORIZED:.*]], ![[UNROLL_32:.*]]}
|
||||||
// CHECK: ![[UNROLL_32]] = !{!"llvm.loop.unroll.count", i32 32}
|
// CHECK: ![[UNROLL_32]] = !{!"llvm.loop.unroll.count", i32 32}
|
||||||
|
|
||||||
// CHECK: ![[LOOP_14]] = distinct !{![[LOOP_14]], ![[VECTORIZE_ENABLE]], ![[WIDTH_10:.*]]}
|
// CHECK: ![[LOOP_14]] = distinct !{![[LOOP_14]], ![[WIDTH_10:.*]]}
|
||||||
// CHECK: ![[WIDTH_10]] = !{!"llvm.loop.vectorize.width", i32 10}
|
// CHECK: ![[WIDTH_10]] = !{!"llvm.loop.vectorize.width", i32 10}
|
||||||
|
|
||||||
// CHECK: ![[LOOP_15]] = distinct !{![[LOOP_15]], ![[WIDTH_1]], ![[VECTORIZE_ENABLE]]}
|
|
||||||
|
|
||||||
// CHECK-NEXT: ![[LOOP_16]] = distinct !{![[LOOP_16]], ![[VECTORIZE_ENABLE]], ![[WIDTH_1]]}
|
|
||||||
|
|
Loading…
Reference in New Issue