Skip to content

Commit 342aa3e

Browse files
authored
[LegalizeTypes][RISCV] Support scalable vectors in SplitVecRes_BITCAST/SplitVecOp_BITCAST. (llvm#88590)
Instead of bitcasting to a scalar integer, try to split the other vector type that is legal. We already handle the case where both types need to be split. Fixes llvm#88576
1 parent ef9446b commit 342aa3e

File tree

2 files changed

+78
-2
lines changed

2 files changed

+78
-2
lines changed

llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1388,6 +1388,13 @@ void DAGTypeLegalizer::SplitVecRes_BITCAST(SDNode *N, SDValue &Lo,
13881388
report_fatal_error("Scalarization of scalable vectors is not supported.");
13891389
}
13901390

1391+
if (LoVT.isScalableVector()) {
1392+
auto [InLo, InHi] = DAG.SplitVectorOperand(N, 0);
1393+
Lo = DAG.getNode(ISD::BITCAST, dl, LoVT, InLo);
1394+
Hi = DAG.getNode(ISD::BITCAST, dl, HiVT, InHi);
1395+
return;
1396+
}
1397+
13911398
// In the general case, convert the input to an integer and split it by hand.
13921399
EVT LoIntVT = EVT::getIntegerVT(*DAG.getContext(), LoVT.getSizeInBits());
13931400
EVT HiIntVT = EVT::getIntegerVT(*DAG.getContext(), HiVT.getSizeInBits());
@@ -3259,16 +3266,25 @@ SDValue DAGTypeLegalizer::SplitVecOp_BITCAST(SDNode *N) {
32593266
// For example, i64 = BITCAST v4i16 on alpha. Typically the vector will
32603267
// end up being split all the way down to individual components. Convert the
32613268
// split pieces into integers and reassemble.
3269+
EVT ResVT = N->getValueType(0);
32623270
SDValue Lo, Hi;
32633271
GetSplitVector(N->getOperand(0), Lo, Hi);
3272+
SDLoc dl(N);
3273+
3274+
if (ResVT.isScalableVector()) {
3275+
auto [LoVT, HiVT] = DAG.GetSplitDestVTs(ResVT);
3276+
Lo = DAG.getNode(ISD::BITCAST, dl, LoVT, Lo);
3277+
Hi = DAG.getNode(ISD::BITCAST, dl, HiVT, Hi);
3278+
return DAG.getNode(ISD::CONCAT_VECTORS, dl, ResVT, Lo, Hi);
3279+
}
3280+
32643281
Lo = BitConvertToInteger(Lo);
32653282
Hi = BitConvertToInteger(Hi);
32663283

32673284
if (DAG.getDataLayout().isBigEndian())
32683285
std::swap(Lo, Hi);
32693286

3270-
return DAG.getNode(ISD::BITCAST, SDLoc(N), N->getValueType(0),
3271-
JoinIntegers(Lo, Hi));
3287+
return DAG.getNode(ISD::BITCAST, dl, ResVT, JoinIntegers(Lo, Hi));
32723288
}
32733289

32743290
SDValue DAGTypeLegalizer::SplitVecOp_INSERT_SUBVECTOR(SDNode *N,
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc < %s -mtriple=riscv64 -mattr=+v | FileCheck %s
3+
4+
define i1 @foo(<vscale x 16 x i8> %x, i64 %y) {
5+
; CHECK-LABEL: foo:
6+
; CHECK: # %bb.0:
7+
; CHECK-NEXT: csrr a1, vlenb
8+
; CHECK-NEXT: slli a2, a1, 4
9+
; CHECK-NEXT: addi a2, a2, -1
10+
; CHECK-NEXT: bltu a0, a2, .LBB0_2
11+
; CHECK-NEXT: # %bb.1:
12+
; CHECK-NEXT: mv a0, a2
13+
; CHECK-NEXT: .LBB0_2:
14+
; CHECK-NEXT: addi sp, sp, -80
15+
; CHECK-NEXT: .cfi_def_cfa_offset 80
16+
; CHECK-NEXT: sd ra, 72(sp) # 8-byte Folded Spill
17+
; CHECK-NEXT: sd s0, 64(sp) # 8-byte Folded Spill
18+
; CHECK-NEXT: .cfi_offset ra, -8
19+
; CHECK-NEXT: .cfi_offset s0, -16
20+
; CHECK-NEXT: addi s0, sp, 80
21+
; CHECK-NEXT: .cfi_def_cfa s0, 0
22+
; CHECK-NEXT: csrr a2, vlenb
23+
; CHECK-NEXT: slli a2, a2, 4
24+
; CHECK-NEXT: sub sp, sp, a2
25+
; CHECK-NEXT: andi sp, sp, -64
26+
; CHECK-NEXT: addi a2, sp, 64
27+
; CHECK-NEXT: add a0, a2, a0
28+
; CHECK-NEXT: slli a1, a1, 3
29+
; CHECK-NEXT: add a1, a2, a1
30+
; CHECK-NEXT: vsetvli a3, zero, e8, m8, ta, ma
31+
; CHECK-NEXT: vmv.v.i v16, 0
32+
; CHECK-NEXT: vmv1r.v v0, v9
33+
; CHECK-NEXT: vmerge.vim v24, v16, 1, v0
34+
; CHECK-NEXT: vs8r.v v24, (a1)
35+
; CHECK-NEXT: vmv1r.v v0, v8
36+
; CHECK-NEXT: vmerge.vim v8, v16, 1, v0
37+
; CHECK-NEXT: vs8r.v v8, (a2)
38+
; CHECK-NEXT: lbu a0, 0(a0)
39+
; CHECK-NEXT: addi sp, s0, -80
40+
; CHECK-NEXT: ld ra, 72(sp) # 8-byte Folded Reload
41+
; CHECK-NEXT: ld s0, 64(sp) # 8-byte Folded Reload
42+
; CHECK-NEXT: addi sp, sp, 80
43+
; CHECK-NEXT: ret
44+
%a = bitcast <vscale x 16 x i8> %x to <vscale x 128 x i1>
45+
%b = extractelement <vscale x 128 x i1> %a, i64 %y
46+
ret i1 %b
47+
}
48+
49+
define i8 @bar(<vscale x 128 x i1> %x, i64 %y) {
50+
; CHECK-LABEL: bar:
51+
; CHECK: # %bb.0:
52+
; CHECK-NEXT: vmv1r.v v1, v8
53+
; CHECK-NEXT: vsetivli zero, 1, e8, m2, ta, ma
54+
; CHECK-NEXT: vslidedown.vx v8, v0, a0
55+
; CHECK-NEXT: vmv.x.s a0, v8
56+
; CHECK-NEXT: ret
57+
%a = bitcast <vscale x 128 x i1> %x to <vscale x 16 x i8>
58+
%b = extractelement <vscale x 16 x i8> %a, i64 %y
59+
ret i8 %b
60+
}

0 commit comments

Comments
 (0)