Skip to content

Commit 507f236

Browse files
authored
[VPlan] Fix OpType-mismatch in getFlagsFromIndDesc (#168560)
Follow up on a cse OpType-mismatch crash reported due to ef023ca (Reland [VPlan] Expand WidenInt inductions with nuw/nsw), setting the OpType correctly when returning from getFlagsFromIndDesc.
1 parent d3c2973 commit 507f236

File tree

2 files changed

+74
-1
lines changed

2 files changed

+74
-1
lines changed

llvm/lib/Transforms/Vectorize/VPlanUtils.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,10 @@ inline VPIRFlags getFlagsFromIndDesc(const InductionDescriptor &ID) {
9090
ID.getInductionBinOp()))
9191
return VPIRFlags::WrapFlagsTy(OBO->hasNoUnsignedWrap(),
9292
OBO->hasNoSignedWrap());
93-
return {};
93+
94+
assert(ID.getKind() == InductionDescriptor::IK_IntInduction &&
95+
"Expected int induction");
96+
return VPIRFlags::WrapFlagsTy(false, false);
9497
}
9598
} // namespace vputils
9699

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --filter-out-after "^scalar.ph" --version 6
2+
; RUN: opt -p loop-vectorize -force-vector-width=4 -S %s | FileCheck %s
3+
4+
define void @induction_with_multiple_instructions_in_chain(ptr %p, ptr noalias %q) {
5+
; CHECK-LABEL: define void @induction_with_multiple_instructions_in_chain(
6+
; CHECK-SAME: ptr [[P:%.*]], ptr noalias [[Q:%.*]]) {
7+
; CHECK-NEXT: [[ENTRY:.*:]]
8+
; CHECK-NEXT: br label %[[VECTOR_PH:.*]]
9+
; CHECK: [[VECTOR_PH]]:
10+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
11+
; CHECK: [[VECTOR_BODY]]:
12+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
13+
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 3, i32 6, i32 9, i32 12>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
14+
; CHECK-NEXT: [[VEC_IND1:%.*]] = phi <4 x i32> [ <i32 0, i32 3, i32 6, i32 9>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT2:%.*]], %[[VECTOR_BODY]] ]
15+
; CHECK-NEXT: [[TMP0:%.*]] = sext <4 x i32> [[VEC_IND]] to <4 x i64>
16+
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i64> [[TMP0]], i32 0
17+
; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x i64> [[TMP0]], i32 1
18+
; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x i64> [[TMP0]], i32 2
19+
; CHECK-NEXT: [[TMP4:%.*]] = extractelement <4 x i64> [[TMP0]], i32 3
20+
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[P]], i64 [[TMP1]]
21+
; CHECK-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[P]], i64 [[TMP2]]
22+
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[P]], i64 [[TMP3]]
23+
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[P]], i64 [[TMP4]]
24+
; CHECK-NEXT: store i8 0, ptr [[TMP5]], align 1
25+
; CHECK-NEXT: store i8 0, ptr [[TMP6]], align 1
26+
; CHECK-NEXT: store i8 0, ptr [[TMP7]], align 1
27+
; CHECK-NEXT: store i8 0, ptr [[TMP8]], align 1
28+
; CHECK-NEXT: [[TMP9:%.*]] = sext <4 x i32> [[VEC_IND1]] to <4 x i64>
29+
; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i64> [[TMP9]], i32 0
30+
; CHECK-NEXT: [[TMP11:%.*]] = extractelement <4 x i64> [[TMP9]], i32 1
31+
; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i64> [[TMP9]], i32 2
32+
; CHECK-NEXT: [[TMP13:%.*]] = extractelement <4 x i64> [[TMP9]], i32 3
33+
; CHECK-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[Q]], i64 [[TMP10]]
34+
; CHECK-NEXT: [[TMP15:%.*]] = getelementptr i8, ptr [[Q]], i64 [[TMP11]]
35+
; CHECK-NEXT: [[TMP16:%.*]] = getelementptr i8, ptr [[Q]], i64 [[TMP12]]
36+
; CHECK-NEXT: [[TMP17:%.*]] = getelementptr i8, ptr [[Q]], i64 [[TMP13]]
37+
; CHECK-NEXT: store i8 0, ptr [[TMP14]], align 1
38+
; CHECK-NEXT: store i8 0, ptr [[TMP15]], align 1
39+
; CHECK-NEXT: store i8 0, ptr [[TMP16]], align 1
40+
; CHECK-NEXT: store i8 0, ptr [[TMP17]], align 1
41+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
42+
; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], splat (i32 12)
43+
; CHECK-NEXT: [[VEC_IND_NEXT2]] = add <4 x i32> [[VEC_IND1]], splat (i32 12)
44+
; CHECK-NEXT: [[TMP18:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024
45+
; CHECK-NEXT: br i1 [[TMP18]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
46+
; CHECK: [[MIDDLE_BLOCK]]:
47+
; CHECK-NEXT: br label %[[SCALAR_PH:.*]]
48+
; CHECK: [[SCALAR_PH]]:
49+
;
50+
entry:
51+
br label %loop
52+
53+
loop:
54+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
55+
%ind.1 = phi i32 [ 3, %entry ], [ %ind.1.next, %loop ]
56+
%ind.2 = phi i32 [ 0, %entry ], [ %ind.1, %loop ]
57+
%sext.1 = sext i32 %ind.1 to i64
58+
%gep.1 = getelementptr i8, ptr %p, i64 %sext.1
59+
store i8 0, ptr %gep.1
60+
%sext.2 = sext i32 %ind.2 to i64
61+
%gep.2 = getelementptr i8, ptr %q, i64 %sext.2
62+
store i8 0, ptr %gep.2
63+
%iv.next = add i64 %iv, 1
64+
%ind.1.next = add i32 %ind.1, 3
65+
%ec = icmp eq i64 %iv, 1024
66+
br i1 %ec, label %exit, label %loop
67+
68+
exit:
69+
ret void
70+
}

0 commit comments

Comments
 (0)