Skip to content

Commit e573a9c

Browse files
author
Sjoerd Meijer
committed
[Clang] Pragma vectorize_width() implies vectorize(enable)
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: 372082
1 parent a5dfa70 commit e573a9c

File tree

3 files changed

+38
-9
lines changed

3 files changed

+38
-9
lines changed

clang/lib/CodeGen/CGLoopInfo.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,14 @@ LoopInfo::createLoopVectorizeMetadata(const LoopAttributes &Attrs,
270270

271271
// Setting vectorize.width
272272
if (Attrs.VectorizeWidth > 0) {
273+
// This implies vectorize.enable = true, but only add it when it is not
274+
// already enabled.
275+
if (Attrs.VectorizeEnable != LoopAttributes::Enable)
276+
Args.push_back(
277+
MDNode::get(Ctx, {MDString::get(Ctx, "llvm.loop.vectorize.enable"),
278+
ConstantAsMetadata::get(ConstantInt::get(
279+
llvm::Type::getInt1Ty(Ctx), 1))}));
280+
273281
Metadata *Vals[] = {
274282
MDString::get(Ctx, "llvm.loop.vectorize.width"),
275283
ConstantAsMetadata::get(ConstantInt::get(llvm::Type::getInt32Ty(Ctx),

clang/test/CodeGenCXX/pragma-loop-predicate.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ void test5(int *List, int Length) {
5858
List[i] = i * 2;
5959
}
6060

61-
6261
// CHECK: ![[LOOP0]] = distinct !{![[LOOP0]], !3}
6362
// CHECK-NEXT: !3 = !{!"llvm.loop.vectorize.enable", i1 true}
6463

@@ -70,7 +69,7 @@ void test5(int *List, int Length) {
7069

7170
// CHECK-NEXT: ![[LOOP3]] = distinct !{![[LOOP3]], !5, !3}
7271

73-
// CHECK-NEXT: ![[LOOP4]] = distinct !{![[LOOP4]], !10}
72+
// CHECK-NEXT: ![[LOOP4]] = distinct !{![[LOOP4]], !3, !10}
7473
// CHECK-NEXT: !10 = !{!"llvm.loop.vectorize.width", i32 1}
7574

76-
// CHECK-NEXT: ![[LOOP5]] = distinct !{![[LOOP5]], !10}
75+
// CHECK-NEXT: ![[LOOP5]] = distinct !{![[LOOP5]], !3, !10}

clang/test/CodeGenCXX/pragma-loop.cpp

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -158,23 +158,41 @@ void template_test(double *List, int Length) {
158158
for_template_constant_expression_test<double, 2, 4, 8>(List, Length);
159159
}
160160

161+
void vec_width_1(int *List, int Length) {
162+
// CHECK-LABEL: @{{.*}}vec_width_1{{.*}}(
163+
// CHECK: br label {{.*}}, !llvm.loop ![[LOOP_15:.*]]
164+
165+
#pragma clang loop vectorize(enable) vectorize_width(1)
166+
for (int i = 0; i < Length; i++)
167+
List[i] = i * 2;
168+
}
169+
170+
void width_1(int *List, int Length) {
171+
// CHECK-LABEL: @{{.*}}width_1{{.*}}(
172+
// CHECK: br label {{.*}}, !llvm.loop ![[LOOP_16:.*]]
173+
174+
#pragma clang loop vectorize_width(1)
175+
for (int i = 0; i < Length; i++)
176+
List[i] = i * 2;
177+
}
178+
161179
// CHECK: ![[LOOP_1]] = distinct !{![[LOOP_1]], ![[UNROLL_FULL:.*]]}
162180
// CHECK: ![[UNROLL_FULL]] = !{!"llvm.loop.unroll.full"}
163181

164-
// CHECK: ![[LOOP_2]] = distinct !{![[LOOP_2]], ![[UNROLL_DISABLE:.*]], ![[DISTRIBUTE_DISABLE:.*]], ![[WIDTH_8:.*]], ![[INTERLEAVE_4:.*]]}
182+
// CHECK: ![[LOOP_2]] = distinct !{![[LOOP_2]], ![[UNROLL_DISABLE:.*]], ![[DISTRIBUTE_DISABLE:.*]], ![[VECTORIZE_ENABLE:.*]], ![[WIDTH_8:.*]], ![[INTERLEAVE_4:.*]]}
165183
// CHECK: ![[UNROLL_DISABLE]] = !{!"llvm.loop.unroll.disable"}
166184
// CHECK: ![[DISTRIBUTE_DISABLE]] = !{!"llvm.loop.distribute.enable", i1 false}
185+
// CHECK: ![[VECTORIZE_ENABLE]] = !{!"llvm.loop.vectorize.enable", i1 true}
167186
// CHECK: ![[WIDTH_8]] = !{!"llvm.loop.vectorize.width", i32 8}
168187
// CHECK: ![[INTERLEAVE_4]] = !{!"llvm.loop.interleave.count", i32 4}
169188

170-
// CHECK: ![[LOOP_3]] = distinct !{![[LOOP_3]], ![[INTERLEAVE_4:.*]], ![[INTENABLE_1:.*]], ![[FOLLOWUP_VECTOR_3:.*]]}
171-
// CHECK: ![[INTENABLE_1]] = !{!"llvm.loop.vectorize.enable", i1 true}
189+
// CHECK: ![[LOOP_3]] = distinct !{![[LOOP_3]], ![[INTERLEAVE_4:.*]], ![[VECTORIZE_ENABLE]], ![[FOLLOWUP_VECTOR_3:.*]]}
172190
// CHECK: ![[FOLLOWUP_VECTOR_3]] = !{!"llvm.loop.vectorize.followup_all", ![[AFTER_VECTOR_3:.*]]}
173191
// CHECK: ![[AFTER_VECTOR_3]] = distinct !{![[AFTER_VECTOR_3]], ![[ISVECTORIZED:.*]], ![[UNROLL_8:.*]]}
174192
// CHECK: ![[ISVECTORIZED]] = !{!"llvm.loop.isvectorized"}
175193
// CHECK: ![[UNROLL_8]] = !{!"llvm.loop.unroll.count", i32 8}
176194

177-
// CHECK: ![[LOOP_4]] = distinct !{![[LOOP_4]], ![[WIDTH_2:.*]], ![[INTERLEAVE_2:.*]]}
195+
// CHECK: ![[LOOP_4]] = distinct !{![[LOOP_4]], ![[VECTORIZE_ENABLE]], ![[WIDTH_2:.*]], ![[INTERLEAVE_2:.*]]}
178196
// CHECK: ![[WIDTH_2]] = !{!"llvm.loop.vectorize.width", i32 2}
179197
// CHECK: ![[INTERLEAVE_2]] = !{!"llvm.loop.interleave.count", i32 2}
180198

@@ -185,7 +203,7 @@ void template_test(double *List, int Length) {
185203
// CHECK: ![[FOLLOWUP_VECTOR_6]] = !{!"llvm.loop.vectorize.followup_all", ![[AFTER_VECTOR_6:.*]]}
186204
// CHECK: ![[AFTER_VECTOR_6]] = distinct !{![[AFTER_VECTOR_6]], ![[ISVECTORIZED:.*]], ![[UNROLL_8:.*]]}
187205

188-
// CHECK: ![[LOOP_7]] = distinct !{![[LOOP_7]], ![[WIDTH_5:.*]]}
206+
// CHECK: ![[LOOP_7]] = distinct !{![[LOOP_7]], ![[VECTORIZE_ENABLE]], ![[WIDTH_5:.*]]}
189207
// CHECK: ![[WIDTH_5]] = !{!"llvm.loop.vectorize.width", i32 5}
190208

191209
// CHECK: ![[LOOP_8]] = distinct !{![[LOOP_8]], ![[WIDTH_5:.*]]}
@@ -213,5 +231,9 @@ void template_test(double *List, int Length) {
213231
// CHECK: ![[AFTER_VECTOR_13]] = distinct !{![[AFTER_VECTOR_13]], ![[ISVECTORIZED:.*]], ![[UNROLL_32:.*]]}
214232
// CHECK: ![[UNROLL_32]] = !{!"llvm.loop.unroll.count", i32 32}
215233

216-
// CHECK: ![[LOOP_14]] = distinct !{![[LOOP_14]], ![[WIDTH_10:.*]]}
234+
// CHECK: ![[LOOP_14]] = distinct !{![[LOOP_14]], ![[VECTORIZE_ENABLE]], ![[WIDTH_10:.*]]}
217235
// CHECK: ![[WIDTH_10]] = !{!"llvm.loop.vectorize.width", i32 10}
236+
237+
// CHECK: ![[LOOP_15]] = distinct !{![[LOOP_15]], ![[WIDTH_1]], ![[VECTORIZE_ENABLE]]}
238+
239+
// CHECK-NEXT: ![[LOOP_16]] = distinct !{![[LOOP_16]], ![[VECTORIZE_ENABLE]], ![[WIDTH_1]]}

0 commit comments

Comments
 (0)