diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp @@ -1239,17 +1239,17 @@ case TargetLowering::TypeSplitVector: { EVT InVT = InOp.getValueType(); assert(InVT.isVector() && "Cannot split scalar types"); - unsigned NumElts = InVT.getVectorNumElements(); - assert(NumElts == NVT.getVectorNumElements() && + ElementCount NumElts = InVT.getVectorElementCount(); + assert(NumElts == NVT.getVectorElementCount() && "Dst and Src must have the same number of elements"); - assert(isPowerOf2_32(NumElts) && + assert(isPowerOf2_32(NumElts.getKnownMinValue()) && "Promoted vector type must be a power of two"); SDValue EOp1, EOp2; GetSplitVector(InOp, EOp1, EOp2); EVT HalfNVT = EVT::getVectorVT(*DAG.getContext(), NVT.getScalarType(), - NumElts/2); + NumElts.divideCoefficientBy(2)); EOp1 = DAG.getNode(ISD::TRUNCATE, dl, HalfNVT, EOp1); EOp2 = DAG.getNode(ISD::TRUNCATE, dl, HalfNVT, EOp2); diff --git a/llvm/test/CodeGen/AArch64/sve-trunc.ll b/llvm/test/CodeGen/AArch64/sve-trunc.ll --- a/llvm/test/CodeGen/AArch64/sve-trunc.ll +++ b/llvm/test/CodeGen/AArch64/sve-trunc.ll @@ -183,3 +183,18 @@ %out = trunc %in to ret %out } + +define void @trunc_promoteIntRes( %0, i16* %ptr) { +; CHECK-LABEL: trunc_promoteIntRes: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: uzp1 z0.s, z0.s, z1.s +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: st1h { z0.s }, p0, [x0] +; CHECK-NEXT: ret +entry: + %1 = trunc %0 to + %2 = bitcast i16* %ptr to * + store %1, * %2, align 2 + ret void +} +