Skip to content

Commit fb67dce

Browse files
authored
[RISCV] Fix crash when unrolling loop containing vector instructions (#83384)
When MVT is not a vector type, TCK_CodeSize should return an invalid cost. This patch adds a check in the beginning to make sure all cost kinds return invalid costs consistently. Before this patch, TCK_CodeSize returns a valid cost on scalar MVT but other cost kinds doesn't. This fixes the issue #83294 where a loop contains vector instructions and MVT is scalar after type legalization when the vector extension is not enabled,
1 parent e4b15fc commit fb67dce

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ static cl::opt<unsigned> SLPMaxVF(
3737
InstructionCost
3838
RISCVTTIImpl::getRISCVInstructionCost(ArrayRef<unsigned> OpCodes, MVT VT,
3939
TTI::TargetCostKind CostKind) {
40+
// Check if the type is valid for all CostKind
41+
if (!VT.isVector())
42+
return InstructionCost::getInvalid();
4043
size_t NumInstr = OpCodes.size();
4144
if (CostKind == TTI::TCK_CodeSize)
4245
return NumInstr;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt < %s -mtriple=riscv64 -mattr=+f,+d --passes=loop-unroll-full -S | FileCheck %s
3+
4+
; Check it doesn't crash when the vector extension is not enabled.
5+
define void @foo() {
6+
; CHECK-LABEL: define void @foo(
7+
; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
8+
; CHECK-NEXT: entry:
9+
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
10+
; CHECK: for.body:
11+
; CHECK-NEXT: [[INDVARS_IV1:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
12+
; CHECK-NEXT: [[TMP0:%.*]] = load float, ptr null, align 4
13+
; CHECK-NEXT: [[SPLAT_SPLAT_I_I_I:%.*]] = shufflevector <2 x float> zeroinitializer, <2 x float> zeroinitializer, <2 x i32> zeroinitializer
14+
; CHECK-NEXT: [[CMP1_I_I_I:%.*]] = fcmp ogt <2 x float> zeroinitializer, zeroinitializer
15+
; CHECK-NEXT: [[SPLAT_SPLAT3_I_I_I:%.*]] = shufflevector <2 x i32> zeroinitializer, <2 x i32> zeroinitializer, <2 x i32> zeroinitializer
16+
; CHECK-NEXT: [[XOR3_I_I_I_I_I:%.*]] = select <2 x i1> zeroinitializer, <2 x i32> zeroinitializer, <2 x i32> zeroinitializer
17+
; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr null, align 4
18+
; CHECK-NEXT: [[SPLAT_SPLAT8_I_I_I:%.*]] = shufflevector <2 x float> zeroinitializer, <2 x float> zeroinitializer, <2 x i32> zeroinitializer
19+
; CHECK-NEXT: [[SUB_I_I_I:%.*]] = fsub <2 x float> zeroinitializer, zeroinitializer
20+
; CHECK-NEXT: [[MUL_I_I_I:%.*]] = shl i64 0, 0
21+
; CHECK-NEXT: [[TMP2:%.*]] = load float, ptr null, align 4
22+
; CHECK-NEXT: [[SPLAT_SPLAT_I_I_I_I:%.*]] = shufflevector <2 x float> zeroinitializer, <2 x float> zeroinitializer, <2 x i32> zeroinitializer
23+
; CHECK-NEXT: [[XOR3_I_I_I_V_I_I:%.*]] = select <2 x i1> zeroinitializer, <2 x float> zeroinitializer, <2 x float> zeroinitializer
24+
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV1]], 1
25+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV1]], 8
26+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_BODY]], label [[EXIT:%.*]]
27+
; CHECK: exit:
28+
; CHECK-NEXT: ret void
29+
;
30+
entry:
31+
br label %for.body
32+
33+
for.body: ; preds = %for.body, %entry
34+
%indvars.iv1 = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
35+
%0 = load float, ptr null, align 4
36+
%splat.splat.i.i.i = shufflevector <2 x float> zeroinitializer, <2 x float> zeroinitializer, <2 x i32> zeroinitializer
37+
%cmp1.i.i.i = fcmp ogt <2 x float> zeroinitializer, zeroinitializer
38+
%splat.splat3.i.i.i = shufflevector <2 x i32> zeroinitializer, <2 x i32> zeroinitializer, <2 x i32> zeroinitializer
39+
%xor3.i.i.i.i.i = select <2 x i1> zeroinitializer, <2 x i32> zeroinitializer, <2 x i32> zeroinitializer
40+
%1 = load float, ptr null, align 4
41+
%splat.splat8.i.i.i = shufflevector <2 x float> zeroinitializer, <2 x float> zeroinitializer, <2 x i32> zeroinitializer
42+
%sub.i.i.i = fsub <2 x float> zeroinitializer, zeroinitializer
43+
%mul.i.i.i = shl i64 0, 0
44+
%2 = load float, ptr null, align 4
45+
%splat.splat.i.i.i.i = shufflevector <2 x float> zeroinitializer, <2 x float> zeroinitializer, <2 x i32> zeroinitializer
46+
%xor3.i.i.i.v.i.i = select <2 x i1> zeroinitializer, <2 x float> zeroinitializer, <2 x float> zeroinitializer
47+
%indvars.iv.next = add i64 %indvars.iv1, 1
48+
%exitcond = icmp ne i64 %indvars.iv1, 8
49+
br i1 %exitcond, label %for.body, label %exit
50+
51+
exit: ; preds = %for.body
52+
ret void
53+
}

0 commit comments

Comments
 (0)