Skip to content

Commit fd887a3

Browse files
authored
LegalizeVectorTypes: fix bug in widening of vec result in xrint (#71198)
Fix a bug introduced in 98c90a1 (ISel: introduce vector ISD::LRINT, ISD::LLRINT; custom RISCV lowering), where ISD::LRINT and ISD::LLRINT used WidenVecRes_Unary to widen the vector result. This leads to incorrect CodeGen for RISC-V fixed-vectors of length 3, and a crash in SelectionDAG when we try to lower llvm.lrint.vxi32.vxf64 on i686. Fix the bug by implementing a correct WidenVecRes_XRINT. Fixes #71187.
1 parent ddf4a9c commit fd887a3

File tree

5 files changed

+662
-246
lines changed

5 files changed

+662
-246
lines changed

llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -987,6 +987,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
987987
SDValue WidenVecRes_Convert(SDNode *N);
988988
SDValue WidenVecRes_Convert_StrictFP(SDNode *N);
989989
SDValue WidenVecRes_FP_TO_XINT_SAT(SDNode *N);
990+
SDValue WidenVecRes_XRINT(SDNode *N);
990991
SDValue WidenVecRes_FCOPYSIGN(SDNode *N);
991992
SDValue WidenVecRes_IS_FPCLASS(SDNode *N);
992993
SDValue WidenVecRes_ExpOp(SDNode *N);

llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4204,6 +4204,11 @@ void DAGTypeLegalizer::WidenVectorResult(SDNode *N, unsigned ResNo) {
42044204
Res = WidenVecRes_FP_TO_XINT_SAT(N);
42054205
break;
42064206

4207+
case ISD::LRINT:
4208+
case ISD::LLRINT:
4209+
Res = WidenVecRes_XRINT(N);
4210+
break;
4211+
42074212
case ISD::FABS:
42084213
case ISD::FCEIL:
42094214
case ISD::FCOS:
@@ -4216,8 +4221,6 @@ void DAGTypeLegalizer::WidenVectorResult(SDNode *N, unsigned ResNo) {
42164221
case ISD::FLOG2:
42174222
case ISD::FNEARBYINT:
42184223
case ISD::FRINT:
4219-
case ISD::LRINT:
4220-
case ISD::LLRINT:
42214224
case ISD::FROUND:
42224225
case ISD::FROUNDEVEN:
42234226
case ISD::FSIN:
@@ -4791,6 +4794,27 @@ SDValue DAGTypeLegalizer::WidenVecRes_FP_TO_XINT_SAT(SDNode *N) {
47914794
return DAG.getNode(N->getOpcode(), dl, WidenVT, Src, N->getOperand(1));
47924795
}
47934796

4797+
SDValue DAGTypeLegalizer::WidenVecRes_XRINT(SDNode *N) {
4798+
SDLoc dl(N);
4799+
EVT WidenVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
4800+
ElementCount WidenNumElts = WidenVT.getVectorElementCount();
4801+
4802+
SDValue Src = N->getOperand(0);
4803+
EVT SrcVT = Src.getValueType();
4804+
4805+
// Also widen the input.
4806+
if (getTypeAction(SrcVT) == TargetLowering::TypeWidenVector) {
4807+
Src = GetWidenedVector(Src);
4808+
SrcVT = Src.getValueType();
4809+
}
4810+
4811+
// Input and output not widened to the same size, give up.
4812+
if (WidenNumElts != SrcVT.getVectorElementCount())
4813+
return DAG.UnrollVectorOp(N, WidenNumElts.getKnownMinValue());
4814+
4815+
return DAG.getNode(N->getOpcode(), dl, WidenVT, Src);
4816+
}
4817+
47944818
SDValue DAGTypeLegalizer::WidenVecRes_Convert_StrictFP(SDNode *N) {
47954819
SDValue InOp = N->getOperand(1);
47964820
SDLoc DL(N);

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-llrint.ll

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,22 @@ define <3 x i64> @llrint_v3i64_v3f32(<3 x float> %x) {
150150
; RV32-NEXT: vl2r.v v8, (a2) # Unknown-size Folded Reload
151151
; RV32-NEXT: vslide1down.vx v8, v8, a0
152152
; RV32-NEXT: vslide1down.vx v8, v8, a1
153-
; RV32-NEXT: vslidedown.vi v8, v8, 2
153+
; RV32-NEXT: addi a0, sp, 16
154+
; RV32-NEXT: vs2r.v v8, (a0) # Unknown-size Folded Spill
155+
; RV32-NEXT: vsetivli zero, 1, e32, m1, ta, ma
156+
; RV32-NEXT: csrr a0, vlenb
157+
; RV32-NEXT: slli a0, a0, 1
158+
; RV32-NEXT: add a0, sp, a0
159+
; RV32-NEXT: addi a0, a0, 16
160+
; RV32-NEXT: vl1r.v v8, (a0) # Unknown-size Folded Reload
161+
; RV32-NEXT: vslidedown.vi v8, v8, 3
162+
; RV32-NEXT: vfmv.f.s fa0, v8
163+
; RV32-NEXT: call llrintf@plt
164+
; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma
165+
; RV32-NEXT: addi a2, sp, 16
166+
; RV32-NEXT: vl2r.v v8, (a2) # Unknown-size Folded Reload
167+
; RV32-NEXT: vslide1down.vx v8, v8, a0
168+
; RV32-NEXT: vslide1down.vx v8, v8, a1
154169
; RV32-NEXT: csrr a0, vlenb
155170
; RV32-NEXT: slli a0, a0, 2
156171
; RV32-NEXT: add sp, sp, a0

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-lrint.ll

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,14 @@ define <3 x iXLen> @lrint_v3f32(<3 x float> %x) {
111111
; RV64-i32-NEXT: vfmv.f.s fa5, v10
112112
; RV64-i32-NEXT: fcvt.l.s a0, fa5
113113
; RV64-i32-NEXT: vslide1down.vx v9, v9, a0
114-
; RV64-i32-NEXT: vslidedown.vi v8, v8, 2
114+
; RV64-i32-NEXT: vslidedown.vi v10, v8, 2
115+
; RV64-i32-NEXT: vfmv.f.s fa5, v10
116+
; RV64-i32-NEXT: fcvt.l.s a0, fa5
117+
; RV64-i32-NEXT: vslide1down.vx v9, v9, a0
118+
; RV64-i32-NEXT: vslidedown.vi v8, v8, 3
115119
; RV64-i32-NEXT: vfmv.f.s fa5, v8
116120
; RV64-i32-NEXT: fcvt.l.s a0, fa5
117121
; RV64-i32-NEXT: vslide1down.vx v8, v9, a0
118-
; RV64-i32-NEXT: vslidedown.vi v8, v8, 1
119122
; RV64-i32-NEXT: ret
120123
;
121124
; RV64-i64-LABEL: lrint_v3f32:

0 commit comments

Comments
 (0)