Skip to content

Commit 0ad83bc

Browse files
authored
[RISCV] Don't look through EXTRACT_ELEMENT in lowerScalarInsert if the element types are different. (#78668)
If the element type of the vector we're extracting from doesn't match the type we're inserting into, we can't directly insert or extract the subvector.
1 parent 595d780 commit 0ad83bc

File tree

2 files changed

+39
-12
lines changed

2 files changed

+39
-12
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4040,19 +4040,23 @@ static SDValue lowerScalarInsert(SDValue Scalar, SDValue VL, MVT VT,
40404040
if (Scalar.getOpcode() == ISD::EXTRACT_VECTOR_ELT &&
40414041
isNullConstant(Scalar.getOperand(1))) {
40424042
SDValue ExtractedVal = Scalar.getOperand(0);
4043-
MVT ExtractedVT = ExtractedVal.getSimpleValueType();
4044-
MVT ExtractedContainerVT = ExtractedVT;
4045-
if (ExtractedContainerVT.isFixedLengthVector()) {
4046-
ExtractedContainerVT = getContainerForFixedLengthVector(
4047-
DAG, ExtractedContainerVT, Subtarget);
4048-
ExtractedVal = convertToScalableVector(ExtractedContainerVT, ExtractedVal,
4049-
DAG, Subtarget);
4050-
}
4051-
if (ExtractedContainerVT.bitsLE(VT))
4052-
return DAG.getNode(ISD::INSERT_SUBVECTOR, DL, VT, Passthru, ExtractedVal,
4043+
// The element types must be the same.
4044+
if (ExtractedVal.getValueType().getVectorElementType() ==
4045+
VT.getVectorElementType()) {
4046+
MVT ExtractedVT = ExtractedVal.getSimpleValueType();
4047+
MVT ExtractedContainerVT = ExtractedVT;
4048+
if (ExtractedContainerVT.isFixedLengthVector()) {
4049+
ExtractedContainerVT = getContainerForFixedLengthVector(
4050+
DAG, ExtractedContainerVT, Subtarget);
4051+
ExtractedVal = convertToScalableVector(ExtractedContainerVT,
4052+
ExtractedVal, DAG, Subtarget);
4053+
}
4054+
if (ExtractedContainerVT.bitsLE(VT))
4055+
return DAG.getNode(ISD::INSERT_SUBVECTOR, DL, VT, Passthru,
4056+
ExtractedVal, DAG.getConstant(0, DL, XLenVT));
4057+
return DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, ExtractedVal,
40534058
DAG.getConstant(0, DL, XLenVT));
4054-
return DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, ExtractedVal,
4055-
DAG.getConstant(0, DL, XLenVT));
4059+
}
40564060
}
40574061

40584062

llvm/test/CodeGen/RISCV/rvv/fold-binary-reduce.ll

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,3 +343,26 @@ declare i64 @llvm.smax.i64(i64, i64)
343343
declare i64 @llvm.smin.i64(i64, i64)
344344
declare float @llvm.maxnum.f32(float ,float)
345345
declare float @llvm.minnum.f32(float ,float)
346+
347+
define void @crash(<2 x i32> %0) {
348+
; CHECK-LABEL: crash:
349+
; CHECK: # %bb.0: # %entry
350+
; CHECK-NEXT: vsetivli zero, 1, e32, m1, ta, ma
351+
; CHECK-NEXT: vmv.x.s a0, v8
352+
; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
353+
; CHECK-NEXT: vmv.v.i v8, 0
354+
; CHECK-NEXT: vmv.s.x v9, a0
355+
; CHECK-NEXT: vredsum.vs v8, v8, v9
356+
; CHECK-NEXT: vmv.x.s a0, v8
357+
; CHECK-NEXT: sb a0, 0(zero)
358+
; CHECK-NEXT: ret
359+
entry:
360+
%1 = extractelement <2 x i32> %0, i64 0
361+
%2 = tail call i16 @llvm.vector.reduce.add.v4i16(<4 x i16> zeroinitializer)
362+
%3 = zext i16 %2 to i32
363+
%op.rdx = add i32 %1, %3
364+
%conv18.us = trunc i32 %op.rdx to i8
365+
store i8 %conv18.us, ptr null, align 1
366+
ret void
367+
}
368+
declare i16 @llvm.vector.reduce.add.v4i16(<4 x i16>)

0 commit comments

Comments
 (0)