Skip to content

Commit abe92a5

Browse files
authored
[DAGCombine] Fix an incorrect folding of extract_subvector (#153709)
Reported from #153393 (comment) During DAGCombine, an intermediate extract_subvector sequence was generated: ``` t8: v9i16 = extract_subvector t3, Constant:i64<9> t24: v8i16 = extract_subvector t8, Constant:i64<0> ``` And one of the DAGCombine rule which turns `(extract_subvector (extract_subvector X, C), 0)` into `(extract_subvector X, C)` kicked in and turn that into `v8i16 = extract_subvector t3, Constant:i64<9>`. But it forgot to check if the extracted index is a multiple of the minimum vector length of the result type, hence the crash. This patch fixes this by adding an additional check.
1 parent 8bce10a commit abe92a5

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26018,7 +26018,10 @@ SDValue DAGCombiner::visitEXTRACT_SUBVECTOR(SDNode *N) {
2601826018
// Combine an extract of an extract into a single extract_subvector.
2601926019
// ext (ext X, C), 0 --> ext X, C
2602026020
if (ExtIdx == 0 && V.getOpcode() == ISD::EXTRACT_SUBVECTOR && V.hasOneUse()) {
26021-
if (TLI.isExtractSubvectorCheap(NVT, V.getOperand(0).getValueType(),
26021+
// The index has to be a multiple of the new result type's known minimum
26022+
// vector length.
26023+
if (V.getConstantOperandVal(1) % NVT.getVectorMinNumElements() == 0 &&
26024+
TLI.isExtractSubvectorCheap(NVT, V.getOperand(0).getValueType(),
2602226025
V.getConstantOperandVal(1)) &&
2602326026
TLI.isOperationLegalOrCustom(ISD::EXTRACT_SUBVECTOR, NVT)) {
2602426027
return DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, NVT, V.getOperand(0),
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple=riscv64 -mattr='+zve64f,+zvl512b' < %s | FileCheck %s
3+
4+
; Previously, an incorrect (extract_subvector (extract_subvector X, C), 0) DAG combine crashed
5+
; this snippet.
6+
7+
define <8 x i16> @gsm_encode() {
8+
; CHECK-LABEL: gsm_encode:
9+
; CHECK: # %bb.0: # %entry
10+
; CHECK-NEXT: vsetivli zero, 19, e16, m1, ta, ma
11+
; CHECK-NEXT: vle16.v v8, (zero)
12+
; CHECK-NEXT: vslidedown.vi v9, v8, 12
13+
; CHECK-NEXT: vmv.x.s a0, v9
14+
; CHECK-NEXT: vsetivli zero, 8, e16, mf4, ta, ma
15+
; CHECK-NEXT: vmv.v.i v9, -1
16+
; CHECK-NEXT: vsetivli zero, 1, e16, m1, ta, ma
17+
; CHECK-NEXT: vslidedown.vi v8, v8, 9
18+
; CHECK-NEXT: vmv.x.s a1, v8
19+
; CHECK-NEXT: vsetivli zero, 8, e16, mf4, ta, ma
20+
; CHECK-NEXT: vmv.v.i v8, 0
21+
; CHECK-NEXT: vslide1down.vx v9, v9, zero
22+
; CHECK-NEXT: vslide1down.vx v8, v8, zero
23+
; CHECK-NEXT: vslide1down.vx v8, v8, zero
24+
; CHECK-NEXT: vslide1down.vx v8, v8, zero
25+
; CHECK-NEXT: vslide1down.vx v8, v8, zero
26+
; CHECK-NEXT: vslide1down.vx v8, v8, a1
27+
; CHECK-NEXT: vslide1down.vx v8, v8, a0
28+
; CHECK-NEXT: vslidedown.vi v8, v8, 1
29+
; CHECK-NEXT: vand.vv v8, v8, v9
30+
; CHECK-NEXT: ret
31+
entry:
32+
%0 = load <19 x i16>, ptr null, align 2
33+
%1 = shufflevector <19 x i16> zeroinitializer, <19 x i16> %0, <9 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 28, i32 31, i32 poison, i32 poison>
34+
%2 = shufflevector <9 x i16> %1, <9 x i16> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 15>
35+
ret <8 x i16> %2
36+
}

0 commit comments

Comments
 (0)