Skip to content

Commit 0607923

Browse files
committed
[VPlan] Return std::nullopt early if plans are empty.
Fixes a crash caused by abf5969.
1 parent 2731d26 commit 0607923

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7296,6 +7296,8 @@ LoopVectorizationPlanner::plan(ElementCount UserVF, unsigned UserIC) {
72967296
buildVPlansWithVPRecipes(ElementCount::getScalable(1), MaxFactors.ScalableVF);
72977297

72987298
LLVM_DEBUG(printPlans(dbgs()));
7299+
if (VPlans.empty())
7300+
return std::nullopt;
72997301
if (all_of(VPlans,
73007302
[](std::unique_ptr<VPlan> &P) { return P->hasScalarVFOnly(); }))
73017303
return VectorizationFactor::Disabled();
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -p loop-vectorize -S %s | FileCheck %s
3+
4+
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128-Fn32"
5+
target triple = "arm64-apple-macosx15.0.0"
6+
7+
define void @test(i32 %N, ptr %dst) {
8+
; CHECK-LABEL: define void @test(
9+
; CHECK-SAME: i32 [[N:%.*]], ptr [[DST:%.*]]) {
10+
; CHECK-NEXT: [[ENTRY:.*]]:
11+
; CHECK-NEXT: br label %[[LOOP:.*]]
12+
; CHECK: [[LOOP]]:
13+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
14+
; CHECK-NEXT: [[FNEG137:%.*]] = phi float [ 0.000000e+00, %[[ENTRY]] ], [ [[FNEG1:%.*]], %[[LOOP]] ]
15+
; CHECK-NEXT: [[FNEG46:%.*]] = phi float [ 0.000000e+00, %[[ENTRY]] ], [ [[FNEG:%.*]], %[[LOOP]] ]
16+
; CHECK-NEXT: [[FNEG]] = fneg float [[FNEG137]]
17+
; CHECK-NEXT: [[FNEG1]] = fneg float [[FNEG46]]
18+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr float, ptr [[DST]], i32 [[IV]]
19+
; CHECK-NEXT: store float [[FNEG1]], ptr [[GEP]], align 4
20+
; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
21+
; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV]], [[N]]
22+
; CHECK-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP]]
23+
; CHECK: [[EXIT]]:
24+
; CHECK-NEXT: ret void
25+
;
26+
entry:
27+
br label %loop
28+
29+
loop:
30+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
31+
%fneg137 = phi float [ 0.000000e+00, %entry ], [ %fneg1, %loop ]
32+
%fneg46 = phi float [ 0.000000e+00, %entry ], [ %fneg, %loop ]
33+
%fneg = fneg float %fneg137
34+
%fneg1 = fneg float %fneg46
35+
%gep = getelementptr float, ptr %dst, i32 %iv
36+
store float %fneg1, ptr %gep
37+
%iv.next = add i32 %iv, 1
38+
%ec = icmp eq i32 %iv, %N
39+
br i1 %ec, label %exit, label %loop
40+
41+
exit:
42+
ret void
43+
}

0 commit comments

Comments
 (0)