Skip to content

Commit 00c4e0a

Browse files
committed
[RISCV] Guard the ISD::EXTRACT_VECTOR_ELT handling in ReplaceNodeResults against fixed vectors and non-MVT types.
The type legalizer is calling this code based on the scalar type so we need to verify the input type is a scalable vector. The vector type has also not been legalized yet when this is called so we need to use EVT for it.
1 parent ff6c84b commit 00c4e0a

File tree

2 files changed

+98
-2
lines changed

2 files changed

+98
-2
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2555,18 +2555,22 @@ void RISCVTargetLowering::ReplaceNodeResults(SDNode *N,
25552555
SDLoc DL(N);
25562556
SDValue Vec = N->getOperand(0);
25572557
SDValue Idx = N->getOperand(1);
2558-
MVT VecVT = Vec.getSimpleValueType();
2558+
EVT VecVT = Vec.getValueType();
25592559
assert(!Subtarget.is64Bit() && N->getValueType(0) == MVT::i64 &&
25602560
VecVT.getVectorElementType() == MVT::i64 &&
25612561
"Unexpected EXTRACT_VECTOR_ELT legalization");
25622562

2563+
if (!VecVT.isScalableVector())
2564+
return;
2565+
25632566
SDValue Slidedown = Vec;
25642567
MVT XLenVT = Subtarget.getXLenVT();
25652568
// Unless the index is known to be 0, we must slide the vector down to get
25662569
// the desired element into index 0.
25672570
if (!isNullConstant(Idx)) {
25682571
SDValue Mask, VL;
2569-
std::tie(Mask, VL) = getDefaultScalableVLOps(VecVT, DL, DAG, Subtarget);
2572+
std::tie(Mask, VL) =
2573+
getDefaultScalableVLOps(VecVT.getSimpleVT(), DL, DAG, Subtarget);
25702574
Slidedown = DAG.getNode(RISCVISD::VSLIDEDOWN_VL, DL, VecVT,
25712575
DAG.getUNDEF(VecVT), Vec, Idx, Mask, VL);
25722576
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=riscv32 -target-abi=ilp32d -mattr=+experimental-v,+experimental-zfh,+f,+d -verify-machineinstrs -riscv-v-vector-bits-min=128 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=RV32
3+
; RUN: llc -mtriple=riscv64 -target-abi=lp64d -mattr=+experimental-v,+experimental-zfh,+f,+d -verify-machineinstrs -riscv-v-vector-bits-min=128 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=RV64
4+
5+
; FIXME: This codegen needs to be improved. These tests previously asserted in
6+
; ReplaceNodeResults on RV32.
7+
8+
define i64 @extractelt_v4i64(<4 x i64>* %x) nounwind {
9+
; RV32-LABEL: extractelt_v4i64:
10+
; RV32: # %bb.0:
11+
; RV32-NEXT: addi sp, sp, -64
12+
; RV32-NEXT: sw ra, 60(sp) # 4-byte Folded Spill
13+
; RV32-NEXT: sw s0, 56(sp) # 4-byte Folded Spill
14+
; RV32-NEXT: addi s0, sp, 64
15+
; RV32-NEXT: andi sp, sp, -32
16+
; RV32-NEXT: addi a1, zero, 8
17+
; RV32-NEXT: vsetvli a1, a1, e32,m2,ta,mu
18+
; RV32-NEXT: vle32.v v26, (a0)
19+
; RV32-NEXT: vse32.v v26, (sp)
20+
; RV32-NEXT: lw a0, 24(sp)
21+
; RV32-NEXT: lw a1, 28(sp)
22+
; RV32-NEXT: addi sp, s0, -64
23+
; RV32-NEXT: lw s0, 56(sp) # 4-byte Folded Reload
24+
; RV32-NEXT: lw ra, 60(sp) # 4-byte Folded Reload
25+
; RV32-NEXT: addi sp, sp, 64
26+
; RV32-NEXT: ret
27+
;
28+
; RV64-LABEL: extractelt_v4i64:
29+
; RV64: # %bb.0:
30+
; RV64-NEXT: addi sp, sp, -64
31+
; RV64-NEXT: sd ra, 56(sp) # 8-byte Folded Spill
32+
; RV64-NEXT: sd s0, 48(sp) # 8-byte Folded Spill
33+
; RV64-NEXT: addi s0, sp, 64
34+
; RV64-NEXT: andi sp, sp, -32
35+
; RV64-NEXT: addi a1, zero, 4
36+
; RV64-NEXT: vsetvli a1, a1, e64,m2,ta,mu
37+
; RV64-NEXT: vle64.v v26, (a0)
38+
; RV64-NEXT: vse64.v v26, (sp)
39+
; RV64-NEXT: ld a0, 24(sp)
40+
; RV64-NEXT: addi sp, s0, -64
41+
; RV64-NEXT: ld s0, 48(sp) # 8-byte Folded Reload
42+
; RV64-NEXT: ld ra, 56(sp) # 8-byte Folded Reload
43+
; RV64-NEXT: addi sp, sp, 64
44+
; RV64-NEXT: ret
45+
%a = load <4 x i64>, <4 x i64>* %x
46+
%b = extractelement <4 x i64> %a, i32 3
47+
ret i64 %b
48+
}
49+
50+
; This uses a non-power of 2 type so that it isn't an MVT to catch an
51+
; incorrect use of getSimpleValueType().
52+
define i64 @extractelt_v3i64(<3 x i64>* %x) nounwind {
53+
; RV32-LABEL: extractelt_v3i64:
54+
; RV32: # %bb.0:
55+
; RV32-NEXT: addi sp, sp, -64
56+
; RV32-NEXT: sw ra, 60(sp) # 4-byte Folded Spill
57+
; RV32-NEXT: sw s0, 56(sp) # 4-byte Folded Spill
58+
; RV32-NEXT: addi s0, sp, 64
59+
; RV32-NEXT: andi sp, sp, -32
60+
; RV32-NEXT: addi a1, zero, 8
61+
; RV32-NEXT: vsetvli a1, a1, e32,m2,ta,mu
62+
; RV32-NEXT: vle32.v v26, (a0)
63+
; RV32-NEXT: vse32.v v26, (sp)
64+
; RV32-NEXT: lw a0, 16(sp)
65+
; RV32-NEXT: lw a1, 20(sp)
66+
; RV32-NEXT: addi sp, s0, -64
67+
; RV32-NEXT: lw s0, 56(sp) # 4-byte Folded Reload
68+
; RV32-NEXT: lw ra, 60(sp) # 4-byte Folded Reload
69+
; RV32-NEXT: addi sp, sp, 64
70+
; RV32-NEXT: ret
71+
;
72+
; RV64-LABEL: extractelt_v3i64:
73+
; RV64: # %bb.0:
74+
; RV64-NEXT: addi sp, sp, -64
75+
; RV64-NEXT: sd ra, 56(sp) # 8-byte Folded Spill
76+
; RV64-NEXT: sd s0, 48(sp) # 8-byte Folded Spill
77+
; RV64-NEXT: addi s0, sp, 64
78+
; RV64-NEXT: andi sp, sp, -32
79+
; RV64-NEXT: addi a1, zero, 4
80+
; RV64-NEXT: vsetvli a1, a1, e64,m2,ta,mu
81+
; RV64-NEXT: vle64.v v26, (a0)
82+
; RV64-NEXT: vse64.v v26, (sp)
83+
; RV64-NEXT: ld a0, 16(sp)
84+
; RV64-NEXT: addi sp, s0, -64
85+
; RV64-NEXT: ld s0, 48(sp) # 8-byte Folded Reload
86+
; RV64-NEXT: ld ra, 56(sp) # 8-byte Folded Reload
87+
; RV64-NEXT: addi sp, sp, 64
88+
; RV64-NEXT: ret
89+
%a = load <3 x i64>, <3 x i64>* %x
90+
%b = extractelement <3 x i64> %a, i32 2
91+
ret i64 %b
92+
}

0 commit comments

Comments
 (0)