Skip to content

Commit 8cda227

Browse files
committed
[LV] Fix crash when computing max VF too early
D90687 introduced a crash: llvm::LoopVectorizationCostModel::computeMaxVF(llvm::ElementCount, unsigned int): Assertion `WideningDecisions.empty() && Uniforms.empty() && Scalars.empty() && "No decisions should have been taken at this point"' failed. when compiling the following C code: typedef struct { char a; } b; b *c; int d, e; int f() { int g = 0; for (; d; d++) { e = 0; for (; e < c[d].a; e++) g++; } return g; } with: clang -Os -target hexagon -mhvx -fvectorize -mv67 testcase.c -S -o - This occurred since prior to D90687 computeFeasibleMaxVF would only be called in computeMaxVF when a scalar epilogue was allowed, but now it's always called. This causes the assert above since computeFeasibleMaxVF collects all viable VFs larger than the default MaxVF, and for each VF calculates the register usage which results in analysis being done the assert above guards against. This can occur in computeFeasibleMaxVF if TTI.shouldMaximizeVectorBandwidth and this target hook is implemented in the hexagon backend to always return true. Reported by @iajbar. Reviewed By: fhahn Differential Revision: https://reviews.llvm.org/D94869
1 parent 3b8a1d5 commit 8cda227

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5505,11 +5505,9 @@ LoopVectorizationCostModel::computeMaxVF(ElementCount UserVF, unsigned UserIC) {
55055505
return None;
55065506
}
55075507

5508-
ElementCount MaxVF = computeFeasibleMaxVF(TC, UserVF);
5509-
55105508
switch (ScalarEpilogueStatus) {
55115509
case CM_ScalarEpilogueAllowed:
5512-
return MaxVF;
5510+
return computeFeasibleMaxVF(TC, UserVF);
55135511
case CM_ScalarEpilogueNotAllowedUsePredicate:
55145512
LLVM_FALLTHROUGH;
55155513
case CM_ScalarEpilogueNotNeededUsePredicate:
@@ -5547,7 +5545,7 @@ LoopVectorizationCostModel::computeMaxVF(ElementCount UserVF, unsigned UserIC) {
55475545
LLVM_DEBUG(dbgs() << "LV: Cannot fold tail by masking: vectorize with a "
55485546
"scalar epilogue instead.\n");
55495547
ScalarEpilogueStatus = CM_ScalarEpilogueAllowed;
5550-
return MaxVF;
5548+
return computeFeasibleMaxVF(TC, UserVF);
55515549
}
55525550
return None;
55535551
}
@@ -5564,6 +5562,7 @@ LoopVectorizationCostModel::computeMaxVF(ElementCount UserVF, unsigned UserIC) {
55645562
InterleaveInfo.invalidateGroupsRequiringScalarEpilogue();
55655563
}
55665564

5565+
ElementCount MaxVF = computeFeasibleMaxVF(TC, UserVF);
55675566
assert(!MaxVF.isScalable() &&
55685567
"Scalable vectors do not yet support tail folding");
55695568
assert((UserVF.isNonZero() || isPowerOf2_32(MaxVF.getFixedValue())) &&
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
; RUN: opt -march=hexagon -hexagon-autohvx -loop-vectorize -S < %s 2>&1 | FileCheck %s
2+
3+
; Check that we don't crash.
4+
5+
; CHECK-LABEL: @f
6+
; CHECK: vector.body
7+
8+
target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048"
9+
target triple = "hexagon"
10+
11+
; Function Attrs: optsize
12+
define i32 @f() #0 {
13+
entry:
14+
br label %loop
15+
16+
loop:
17+
%g.016 = phi i32 [ 0, %entry ], [ %g.1.lcssa, %loop ]
18+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
19+
%0 = load i8, i8* undef, align 1
20+
%g.1.lcssa = add i32 %g.016, undef
21+
%iv.next = add nsw i32 %iv, 1
22+
%exitcond = icmp eq i32 %iv.next, 0
23+
br i1 %exitcond, label %exit, label %loop
24+
25+
exit:
26+
ret i32 %g.1.lcssa
27+
}
28+
29+
attributes #0 = { optsize "target-features"="+hvx-length128b" }

0 commit comments

Comments
 (0)