diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -17777,7 +17777,7 @@ The argument to this intrinsic must be a vector. -'``llvm.experimental.vector.deinterleave2``' Intrinsic +'``llvm.experimental.vector.deinterleave``' Intrinsic ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Syntax: @@ -17786,14 +17786,15 @@ :: - declare {<2 x double>, <2 x double>} @llvm.experimental.vector.deinterleave2.v4f64(<4 x double> %vec1) - declare {, } @llvm.experimental.vector.deinterleave2.nxv8i32( %vec1) + declare {<2 x double>, <2 x double>} @llvm.experimental.vector.deinterleave.v2f64.v4f64(<4 x double> %vec1) + declare {, } @llvm.experimental.vector.deinterleave.nxv4i32.nxv8i32( %vec1) + declare {, , , } @llvm.experimental.vector.deinterleave.nxv2i16.nxv8i16( %vec1) Overview: """"""""" -The '``llvm.experimental.vector.deinterleave2``' intrinsic constructs two -vectors by deinterleaving the even and odd lanes of the input vector. +The '``llvm.experimental.vector.deinterleave``' intrinsic constructs two or more +vectors by deinterleaving alternating lanes of the input vector. This intrinsic works for both fixed and scalable vectors. While this intrinsic supports all vector types the recommended way to express this operation for @@ -17804,15 +17805,17 @@ .. code-block:: text - {<2 x i64>, <2 x i64>} llvm.experimental.vector.deinterleave2.v4i64(<4 x i64> ); ==> {<2 x i64> , <2 x i64> } + {<2 x i64>, <2 x i64>} llvm.experimental.vector.deinterleave.v2i64.v4i64(<4 x i64> ); ==> {<2 x i64> , <2 x i64> } Arguments: """""""""" +The result types must all be the same type. The argument is a vector whose type corresponds to the logical concatenation of -the two result types. +the result types. +The number of lanes to deinterleave is determined by the number of result types. -'``llvm.experimental.vector.interleave2``' Intrinsic +'``llvm.experimental.vector.interleave``' Intrinsic ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Syntax: @@ -17821,14 +17824,15 @@ :: - declare <4 x double> @llvm.experimental.vector.interleave2.v4f64(<2 x double> %vec1, <2 x double> %vec2) - declare @llvm.experimental.vector.interleave2.nxv8i32( %vec1, %vec2) + declare <4 x double> @llvm.experimental.vector.interleave.v4f64.v2f64(...) + declare @llvm.experimental.vector.interleave.nxv8i32.nxv4i32(...) + declare @llvm.experimental.vector.interleave.nxv8i32.nxv2i32(...) Overview: """"""""" -The '``llvm.experimental.vector.interleave2``' intrinsic constructs a vector -by interleaving two input vectors. +The '``llvm.experimental.vector.interleave``' intrinsic constructs a vector +by interleaving two or more input vectors. This intrinsic works for both fixed and scalable vectors. While this intrinsic supports all vector types the recommended way to express this operation for @@ -17839,12 +17843,13 @@ .. code-block:: text - <4 x i64> llvm.experimental.vector.interleave2.v4i64(<2 x i64> , <2 x i64> ); ==> <4 x i64> + <4 x i64> llvm.experimental.vector.interleave.v4i64.v2i64(<2 x i64> , <2 x i64> ); ==> <4 x i64> Arguments: """""""""" -Both arguments must be vectors of the same type whereby their logical +All arguments must be vectors of the same type whereby their logical concatenation matches the result type. +The number of lanes to interleave is determined by the number of arguments. '``llvm.experimental.vector.splice``' Intrinsic ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/llvm/include/llvm/CodeGen/ISDOpcodes.h b/llvm/include/llvm/CodeGen/ISDOpcodes.h --- a/llvm/include/llvm/CodeGen/ISDOpcodes.h +++ b/llvm/include/llvm/CodeGen/ISDOpcodes.h @@ -571,17 +571,19 @@ /// vector, but not the other way around. EXTRACT_SUBVECTOR, - /// VECTOR_DEINTERLEAVE(VEC1, VEC2) - Returns two vectors with all input and - /// output vectors having the same type. The first output contains the even - /// indices from CONCAT_VECTORS(VEC1, VEC2), with the second output - /// containing the odd indices. The relative order of elements within an - /// output match that of the concatenated input. + /// VECTOR_DEINTERLEAVE(VEC1, VEC2, ...) - Returns N vectors with all input + /// and output vectors having the same type. The first output contains the + /// first indices from CONCAT_VECTORS(VEC1, VEC2, ...), with the second output + /// containing the second indices, etc. The relative order of elements within + /// an output match that of the concatenated input. VECTOR_DEINTERLEAVE, - /// VECTOR_INTERLEAVE(VEC1, VEC2) - Returns two vectors with all input and - /// output vectors having the same type. The first output contains the - /// result of interleaving the low half of CONCAT_VECTORS(VEC1, VEC2), with - /// the second output containing the result of interleaving the high half. + /// VECTOR_INTERLEAVE(VEC1, VEC2, ...) - Returns N vectors with all input and + /// output vectors having the same type. The first output contains the result + /// of interleaving the first X elements of CONCAT_VECTORS(VEC1, VEC2, ...), + /// with the second output containing the result of interleaving the next X + /// elements, and so on, where X is the number of elements in each input + /// vector. VECTOR_INTERLEAVE, /// VECTOR_REVERSE(VECTOR) - Returns a vector, of the same type as VECTOR, diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td --- a/llvm/include/llvm/IR/Intrinsics.td +++ b/llvm/include/llvm/IR/Intrinsics.td @@ -2117,16 +2117,13 @@ [llvm_anyvector_ty, llvm_i64_ty], [IntrNoMem, IntrSpeculatable, ImmArg>]>; - -def int_experimental_vector_interleave2 : DefaultAttrsIntrinsic<[llvm_anyvector_ty], - [LLVMHalfElementsVectorType<0>, - LLVMHalfElementsVectorType<0>], +def int_experimental_vector_interleave : DefaultAttrsIntrinsic<[llvm_anyvector_ty], + [llvm_vararg_ty], [IntrNoMem]>; -def int_experimental_vector_deinterleave2 : DefaultAttrsIntrinsic<[LLVMHalfElementsVectorType<0>, - LLVMHalfElementsVectorType<0>], - [llvm_anyvector_ty], - [IntrNoMem]>; +def int_experimental_vector_deinterleave : DefaultAttrsIntrinsic<[llvm_any_ty], + [llvm_anyvector_ty], + [IntrNoMem]>; //===----------------- Pointer Authentication Intrinsics ------------------===// // 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 @@ -5316,28 +5316,35 @@ SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_DEINTERLEAVE(SDNode *N) { SDLoc dl(N); + unsigned NF = N->getNumOperands(); - SDValue V0 = GetPromotedInteger(N->getOperand(0)); - SDValue V1 = GetPromotedInteger(N->getOperand(1)); - EVT ResVT = V0.getValueType(); - SDValue Res = DAG.getNode(ISD::VECTOR_DEINTERLEAVE, dl, - DAG.getVTList(ResVT, ResVT), V0, V1); - SetPromotedInteger(SDValue(N, 0), Res.getValue(0)); - SetPromotedInteger(SDValue(N, 1), Res.getValue(1)); + SmallVector Ops; + for (unsigned i = 0; i < NF; i++) + Ops.push_back(GetPromotedInteger(N->getOperand(i))); + + SmallVector ResVTs(NF, Ops[0].getValueType()); + SDValue Res = + DAG.getNode(ISD::VECTOR_DEINTERLEAVE, dl, DAG.getVTList(ResVTs), Ops); + + for (unsigned i = 0; i < NF; i++) + SetPromotedInteger(SDValue(N, i), Res.getValue(i)); return SDValue(); } SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_INTERLEAVE(SDNode *N) { SDLoc dl(N); + unsigned NF = N->getNumOperands(); - SDValue V0 = GetPromotedInteger(N->getOperand(0)); - SDValue V1 = GetPromotedInteger(N->getOperand(1)); + SmallVector Ops; + for (unsigned i = 0; i < NF; i++) + Ops.push_back(GetPromotedInteger(N->getOperand(i))); + + SmallVector ResVTs(NF, Ops[0].getValueType()); + SDValue Res = + DAG.getNode(ISD::VECTOR_INTERLEAVE, dl, DAG.getVTList(ResVTs), Ops); - EVT ResVT = V0.getValueType(); - SDValue Res = DAG.getNode(ISD::VECTOR_INTERLEAVE, dl, - DAG.getVTList(ResVT, ResVT), V0, V1); - SetPromotedInteger(SDValue(N, 0), Res.getValue(0)); - SetPromotedInteger(SDValue(N, 1), Res.getValue(1)); + for (unsigned i = 0; i < NF; i++) + SetPromotedInteger(SDValue(N, i), Res.getValue(i)); return SDValue(); } diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp @@ -2791,18 +2791,32 @@ } void DAGTypeLegalizer::SplitVecRes_VECTOR_INTERLEAVE(SDNode *N) { - SDValue Op0Lo, Op0Hi, Op1Lo, Op1Hi; - GetSplitVector(N->getOperand(0), Op0Lo, Op0Hi); - GetSplitVector(N->getOperand(1), Op1Lo, Op1Hi); - EVT VT = Op0Lo.getValueType(); + unsigned IF = N->getNumOperands(); + SmallVector Los, His; + for (unsigned i = 0; i < IF; i++) { + SDValue Lo, Hi; + GetSplitVector(N->getOperand(i), Lo, Hi); + Los.push_back(Lo); + His.push_back(Hi); + } + + SmallVector VTs(IF, Los[0].getValueType()); SDLoc DL(N); - SDValue Res[] = {DAG.getNode(ISD::VECTOR_INTERLEAVE, DL, - DAG.getVTList(VT, VT), Op0Lo, Op1Lo), - DAG.getNode(ISD::VECTOR_INTERLEAVE, DL, - DAG.getVTList(VT, VT), Op0Hi, Op1Hi)}; - SetSplitVector(SDValue(N, 0), Res[0].getValue(0), Res[0].getValue(1)); - SetSplitVector(SDValue(N, 1), Res[1].getValue(0), Res[1].getValue(1)); + SDValue LoRes = DAG.getNode(ISD::VECTOR_INTERLEAVE, DL, VTs, Los); + SDValue HiRes = DAG.getNode(ISD::VECTOR_INTERLEAVE, DL, VTs, His); + + SmallVector CombinedRes; + for (unsigned i = 0; i < IF; i++) + CombinedRes.push_back(LoRes.getValue(i)); + for (unsigned i = 0; i < IF; i++) + CombinedRes.push_back(HiRes.getValue(i)); + + for (int i = IF - 1; i >= 0; i--) { + SDValue Hi = CombinedRes.pop_back_val(); + SDValue Lo = CombinedRes.pop_back_val(); + SetSplitVector(SDValue(N, i), Lo, Hi); + } } //===----------------------------------------------------------------------===// diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -7313,10 +7313,10 @@ case Intrinsic::callbr_landingpad: visitCallBrLandingPad(I); return; - case Intrinsic::experimental_vector_interleave2: + case Intrinsic::experimental_vector_interleave: visitVectorInterleave(I); return; - case Intrinsic::experimental_vector_deinterleave2: + case Intrinsic::experimental_vector_deinterleave: visitVectorDeinterleave(I); return; } @@ -11550,31 +11550,66 @@ void SelectionDAGBuilder::visitVectorDeinterleave(const CallInst &I) { auto DL = getCurSDLoc(); SDValue InVec = getValue(I.getOperand(0)); + unsigned IF = cast(I.getType())->getNumElements(); + + EVT InVT = InVec.getValueType(); EVT OutVT = - InVec.getValueType().getHalfNumVectorElementsVT(*DAG.getContext()); + EVT::getVectorVT(*DAG.getContext(), InVT.getVectorElementType(), + InVT.getVectorElementCount().divideCoefficientBy(IF)); unsigned OutNumElts = OutVT.getVectorMinNumElements(); - // ISD Node needs the input vectors split into two equal parts - SDValue Lo = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, OutVT, InVec, - DAG.getVectorIdxConstant(0, DL)); - SDValue Hi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, OutVT, InVec, - DAG.getVectorIdxConstant(OutNumElts, DL)); - // Use VECTOR_SHUFFLE for fixed-length vectors to benefit from existing // legalisation and combines. if (OutVT.isFixedLengthVector()) { - SDValue Even = DAG.getVectorShuffle(OutVT, DL, Lo, Hi, - createStrideMask(0, 2, OutNumElts)); - SDValue Odd = DAG.getVectorShuffle(OutVT, DL, Lo, Hi, - createStrideMask(1, 2, OutNumElts)); - SDValue Res = DAG.getMergeValues({Even, Odd}, getCurSDLoc()); + SDValue Res; + SmallVector OutVecs; + + // Get the ceiling of a half length vector + EVT HalfInVT = InVT; + if (!HalfInVT.getVectorElementCount().isKnownEven()) + HalfInVT = EVT::getVectorVT( + *DAG.getContext(), HalfInVT.getVectorElementType(), + HalfInVT.getVectorElementCount().getWithIncrement(1)); + HalfInVT = HalfInVT.getHalfNumVectorElementsVT(*DAG.getContext()); + + unsigned HalfNumElts = HalfInVT.getVectorMinNumElements(); + + // Rather than (shuffle InVec, undef, Mask), do + // (shuffle InVecLo, InVecHi, Mask) since targets rely on the latter pattern + // to detect fixed-length vector interleaves + SDValue Lo = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, HalfInVT, InVec, + DAG.getVectorIdxConstant(0, DL)); + SDValue Hi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, HalfInVT, InVec, + DAG.getVectorIdxConstant(HalfNumElts, DL)); + for (unsigned i = 0; i < IF; i++) { + auto Mask = createStrideMask(i, IF, HalfInVT.getVectorMinNumElements()); + // Set mask elements might be outside the combined range to undef + for (unsigned j = 0; j < Mask.size(); j++) { + if (Mask[j] >= (int)HalfInVT.getVectorMinNumElements() * 2) + Mask[j] = -1; + } + SDValue Deinterleaved = DAG.getVectorShuffle(HalfInVT, DL, Lo, Hi, Mask); + Deinterleaved = + DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, OutVT, Deinterleaved, + DAG.getVectorIdxConstant(0, DL)); + OutVecs.push_back(Deinterleaved); + } + Res = DAG.getMergeValues(OutVecs, getCurSDLoc()); setValue(&I, Res); return; } - SDValue Res = DAG.getNode(ISD::VECTOR_DEINTERLEAVE, DL, - DAG.getVTList(OutVT, OutVT), Lo, Hi); + // ISD Node needs the input vectors split into IF equal parts + SmallVector Ops; + for (unsigned i = 0; i < IF; i++) { + Ops.push_back(DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, OutVT, InVec, + DAG.getVectorIdxConstant(OutNumElts * i, DL))); + } + + SmallVector VTs(IF, OutVT); + SDValue Res = + DAG.getNode(ISD::VECTOR_DEINTERLEAVE, DL, DAG.getVTList(VTs), Ops); setValue(&I, Res); return; } @@ -11582,25 +11617,31 @@ void SelectionDAGBuilder::visitVectorInterleave(const CallInst &I) { auto DL = getCurSDLoc(); EVT InVT = getValue(I.getOperand(0)).getValueType(); - SDValue InVec0 = getValue(I.getOperand(0)); - SDValue InVec1 = getValue(I.getOperand(1)); const TargetLowering &TLI = DAG.getTargetLoweringInfo(); EVT OutVT = TLI.getValueType(DAG.getDataLayout(), I.getType()); + unsigned IF = I.getNumOperands() - 1; + SmallVector Ops; + for (unsigned i = 0; i < IF; i++) + Ops.push_back(getValue(I.getOperand(i))); + // Use VECTOR_SHUFFLE for fixed-length vectors to benefit from existing // legalisation and combines. if (OutVT.isFixedLengthVector()) { unsigned NumElts = InVT.getVectorMinNumElements(); - SDValue V = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, InVec0, InVec1); + SDValue V = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, Ops); setValue(&I, DAG.getVectorShuffle(OutVT, DL, V, DAG.getUNDEF(OutVT), - createInterleaveMask(NumElts, 2))); + createInterleaveMask(NumElts, IF))); return; } - SDValue Res = DAG.getNode(ISD::VECTOR_INTERLEAVE, DL, - DAG.getVTList(InVT, InVT), InVec0, InVec1); - Res = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, Res.getValue(0), - Res.getValue(1)); + SmallVector VTs(IF, InVT); + SDValue Res = DAG.getNode(ISD::VECTOR_INTERLEAVE, DL, VTs, Ops); + SmallVector Vals; + for (unsigned i = 0; i < IF; i++) + Vals.push_back(Res.getValue(i)); + + Res = DAG.getNode(ISD::CONCAT_VECTORS, DL, OutVT, Vals); setValue(&I, Res); return; } diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -5795,6 +5795,59 @@ } break; } + case Intrinsic::experimental_vector_interleave: { + unsigned IF = Call.getNumOperands() - 1; + Check(IF >= 2, "vector.interleave must have two or more input vectors", + &Call); + + VectorType *ResultTy = cast(Call.getType()); + ElementCount ResultCount = ResultTy->getElementCount(); + Check(ResultCount.isKnownMultipleOf(IF), + "vector.interleave result must be a vector with a count that is a " + "multiple of the number of operands.", + &Call); + VectorType *OperandTy = VectorType::get( + ResultTy->getElementType(), ResultCount.divideCoefficientBy(IF)); + for (unsigned i = 0; i < IF; i++) { + if (Call.getArgOperand(i)->getType() != OperandTy) { + Check(false, + "vector.interleave operand types don't match up with the result.", + &Call); + break; + } + } + break; + } + case Intrinsic::experimental_vector_deinterleave: { + auto *ResultTy = dyn_cast(Call.getType()); + if (!ResultTy) { + Check(false, "vector.deinterleave result must be a struct type.", &Call); + break; + } + + unsigned IF = ResultTy->getNumElements(); + Check(IF >= 2, "vector.deterleave must have two or more result vectors", + &Call); + + VectorType *InputTy = cast(Call.getOperand(0)->getType()); + + ElementCount InputCount = InputTy->getElementCount(); + Check(InputCount.isKnownMultipleOf(IF), + "vector.deinterleave input must be a vector with a count that is a " + "multiple of the number of result vectors.", + &Call); + VectorType *OutputVecTy = VectorType::get( + InputTy->getElementType(), InputCount.divideCoefficientBy(IF)); + for (unsigned i = 0; i < IF; i++) { + if (ResultTy->getTypeAtIndex(i) != OutputVecTy) { + Check(false, + "vector.deinterleave result types don't match up with the input.", + &Call); + break; + } + } + break; + } case Intrinsic::experimental_noalias_scope_decl: { NoAliasScopeDecls.push_back(cast(&Call)); break; diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -24067,6 +24067,8 @@ EVT OpVT = Op.getValueType(); assert(OpVT.isScalableVector() && "Expected scalable vector in LowerVECTOR_DEINTERLEAVE."); + assert(Op.getNumOperands() == 2 && + "Deinterleaves of more than 2 vectors not supported yet"); SDValue Even = DAG.getNode(AArch64ISD::UZP1, DL, OpVT, Op.getOperand(0), Op.getOperand(1)); SDValue Odd = DAG.getNode(AArch64ISD::UZP2, DL, OpVT, Op.getOperand(0), @@ -24080,6 +24082,8 @@ EVT OpVT = Op.getValueType(); assert(OpVT.isScalableVector() && "Expected scalable vector in LowerVECTOR_INTERLEAVE."); + assert(Op.getNumOperands() == 2 && + "Interleaves of more than 2 vectors not supported yet"); SDValue Lo = DAG.getNode(AArch64ISD::ZIP1, DL, OpVT, Op.getOperand(0), Op.getOperand(1)); diff --git a/llvm/test/CodeGen/AArch64/fixed-vector-deinterleave.ll b/llvm/test/CodeGen/AArch64/fixed-vector-deinterleave.ll --- a/llvm/test/CodeGen/AArch64/fixed-vector-deinterleave.ll +++ b/llvm/test/CodeGen/AArch64/fixed-vector-deinterleave.ll @@ -12,7 +12,7 @@ ; CHECK-NEXT: // kill: def $d1 killed $d1 killed $q1 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 ; CHECK-NEXT: ret - %retval = call {<2 x half>, <2 x half>} @llvm.experimental.vector.deinterleave2.v4f16(<4 x half> %vec) + %retval = call {<2 x half>, <2 x half>} @llvm.experimental.vector.deinterleave.v2f16.v4f16(<4 x half> %vec) ret {<2 x half>, <2 x half>} %retval } @@ -24,7 +24,7 @@ ; CHECK-NEXT: uzp2 v1.4h, v0.4h, v1.4h ; CHECK-NEXT: fmov d0, d2 ; CHECK-NEXT: ret - %retval = call {<4 x half>, <4 x half>} @llvm.experimental.vector.deinterleave2.v8f16(<8 x half> %vec) + %retval = call {<4 x half>, <4 x half>} @llvm.experimental.vector.deinterleave.v4f16.v8f16(<8 x half> %vec) ret {<4 x half>, <4 x half>} %retval } @@ -35,7 +35,7 @@ ; CHECK-NEXT: uzp2 v1.8h, v0.8h, v1.8h ; CHECK-NEXT: mov v0.16b, v2.16b ; CHECK-NEXT: ret - %retval = call {<8 x half>, <8 x half>} @llvm.experimental.vector.deinterleave2.v16f16(<16 x half> %vec) + %retval = call {<8 x half>, <8 x half>} @llvm.experimental.vector.deinterleave.v8f16.v16f16(<16 x half> %vec) ret {<8 x half>, <8 x half>} %retval } @@ -47,7 +47,7 @@ ; CHECK-NEXT: zip2 v1.2s, v0.2s, v1.2s ; CHECK-NEXT: fmov d0, d2 ; CHECK-NEXT: ret - %retval = call {<2 x float>, <2 x float>} @llvm.experimental.vector.deinterleave2.v4f32(<4 x float> %vec) + %retval = call {<2 x float>, <2 x float>} @llvm.experimental.vector.deinterleave.v2f32.v4f32(<4 x float> %vec) ret {<2 x float>, <2 x float>} %retval } @@ -58,7 +58,7 @@ ; CHECK-NEXT: uzp2 v1.4s, v0.4s, v1.4s ; CHECK-NEXT: mov v0.16b, v2.16b ; CHECK-NEXT: ret - %retval = call {<4 x float>, <4 x float>} @llvm.experimental.vector.deinterleave2.v8f32(<8 x float> %vec) + %retval = call {<4 x float>, <4 x float>} @llvm.experimental.vector.deinterleave.v4f32.v8f32(<8 x float> %vec) ret {<4 x float>, <4 x float>} %retval } @@ -69,7 +69,7 @@ ; CHECK-NEXT: zip2 v1.2d, v0.2d, v1.2d ; CHECK-NEXT: mov v0.16b, v2.16b ; CHECK-NEXT: ret - %retval = call {<2 x double>, <2 x double>} @llvm.experimental.vector.deinterleave2.v4f64(<4 x double> %vec) + %retval = call {<2 x double>, <2 x double>} @llvm.experimental.vector.deinterleave.v2f64.v4f64(<4 x double> %vec) ret {<2 x double>, <2 x double>} %retval } @@ -82,7 +82,7 @@ ; CHECK-NEXT: uzp2 v1.16b, v0.16b, v1.16b ; CHECK-NEXT: mov v0.16b, v2.16b ; CHECK-NEXT: ret - %retval = call {<16 x i8>, <16 x i8>} @llvm.experimental.vector.deinterleave2.v32i8(<32 x i8> %vec) + %retval = call {<16 x i8>, <16 x i8>} @llvm.experimental.vector.deinterleave.v16i8.v32i8(<32 x i8> %vec) ret {<16 x i8>, <16 x i8>} %retval } @@ -93,7 +93,7 @@ ; CHECK-NEXT: uzp2 v1.8h, v0.8h, v1.8h ; CHECK-NEXT: mov v0.16b, v2.16b ; CHECK-NEXT: ret - %retval = call {<8 x i16>, <8 x i16>} @llvm.experimental.vector.deinterleave2.v16i16(<16 x i16> %vec) + %retval = call {<8 x i16>, <8 x i16>} @llvm.experimental.vector.deinterleave.v8i16.v16i16(<16 x i16> %vec) ret {<8 x i16>, <8 x i16>} %retval } @@ -104,7 +104,7 @@ ; CHECK-NEXT: uzp2 v1.4s, v0.4s, v1.4s ; CHECK-NEXT: mov v0.16b, v2.16b ; CHECK-NEXT: ret - %retval = call {<4 x i32>, <4 x i32>} @llvm.experimental.vector.deinterleave2.v8i32(<8 x i32> %vec) + %retval = call {<4 x i32>, <4 x i32>} @llvm.experimental.vector.deinterleave.v4i32.v8i32(<8 x i32> %vec) ret {<4 x i32>, <4 x i32>} %retval } @@ -115,22 +115,22 @@ ; CHECK-NEXT: zip2 v1.2d, v0.2d, v1.2d ; CHECK-NEXT: mov v0.16b, v2.16b ; CHECK-NEXT: ret - %retval = call {<2 x i64>, <2 x i64>} @llvm.experimental.vector.deinterleave2.v4i64(<4 x i64> %vec) + %retval = call {<2 x i64>, <2 x i64>} @llvm.experimental.vector.deinterleave.v2i64.v4i64(<4 x i64> %vec) ret {<2 x i64>, <2 x i64>} %retval } ; Floating declarations -declare {<2 x half>,<2 x half>} @llvm.experimental.vector.deinterleave2.v4f16(<4 x half>) -declare {<4 x half>, <4 x half>} @llvm.experimental.vector.deinterleave2.v8f16(<8 x half>) -declare {<2 x float>, <2 x float>} @llvm.experimental.vector.deinterleave2.v4f32(<4 x float>) -declare {<8 x half>, <8 x half>} @llvm.experimental.vector.deinterleave2.v16f16(<16 x half>) -declare {<4 x float>, <4 x float>} @llvm.experimental.vector.deinterleave2.v8f32(<8 x float>) -declare {<2 x double>, <2 x double>} @llvm.experimental.vector.deinterleave2.v4f64(<4 x double>) +declare {<2 x half>, <2 x half>} @llvm.experimental.vector.deinterleave.v2f16.v4f16(<4 x half>) +declare {<4 x half>, <4 x half>} @llvm.experimental.vector.deinterleave.v4f16.v8f16(<8 x half>) +declare {<2 x float>, <2 x float>} @llvm.experimental.vector.deinterleave.v2f32.v4f32(<4 x float>) +declare {<8 x half>, <8 x half>} @llvm.experimental.vector.deinterleave.v8f16.v16f16(<16 x half>) +declare {<4 x float>, <4 x float>} @llvm.experimental.vector.deinterleave.v4f32.v8f32(<8 x float>) +declare {<2 x double>, <2 x double>} @llvm.experimental.vector.deinterleave.v2f64.v4f64(<4 x double>) ; Integer declarations -declare {<16 x i8>, <16 x i8>} @llvm.experimental.vector.deinterleave2.v32i8(<32 x i8>) -declare {<8 x i16>, <8 x i16>} @llvm.experimental.vector.deinterleave2.v16i16(<16 x i16>) -declare {<4 x i32>, <4 x i32>} @llvm.experimental.vector.deinterleave2.v8i32(<8 x i32>) -declare {<2 x i64>, <2 x i64>} @llvm.experimental.vector.deinterleave2.v4i64(<4 x i64>) +declare {<16 x i8>, <16 x i8>} @llvm.experimental.vector.deinterleave.v16i8.v32i8(<32 x i8>) +declare {<8 x i16>, <8 x i16>} @llvm.experimental.vector.deinterleave.v8i16.v16i16(<16 x i16>) +declare {<4 x i32>, <4 x i32>} @llvm.experimental.vector.deinterleave.v4i32.v8i32(<8 x i32>) +declare {<2 x i64>, <2 x i64>} @llvm.experimental.vector.deinterleave.v2i64.v4i64(<4 x i64>) diff --git a/llvm/test/CodeGen/AArch64/fixed-vector-interleave.ll b/llvm/test/CodeGen/AArch64/fixed-vector-interleave.ll --- a/llvm/test/CodeGen/AArch64/fixed-vector-interleave.ll +++ b/llvm/test/CodeGen/AArch64/fixed-vector-interleave.ll @@ -6,7 +6,7 @@ ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 v0.4h, v0.4h, v1.4h ; CHECK-NEXT: ret - %retval = call <4 x half> @llvm.experimental.vector.interleave2.v4f16(<2 x half> %vec0, <2 x half> %vec1) + %retval = call <4 x half>(...) @llvm.experimental.vector.interleave.v4f16.v2f16(<2 x half> %vec0, <2 x half> %vec1) ret <4 x half> %retval } @@ -20,7 +20,7 @@ ; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI1_0] ; CHECK-NEXT: tbl v0.16b, { v0.16b }, v1.16b ; CHECK-NEXT: ret - %retval = call <8 x half> @llvm.experimental.vector.interleave2.v8f16(<4 x half> %vec0, <4 x half> %vec1) + %retval = call <8 x half>(...) @llvm.experimental.vector.interleave.v8f16.v4f16(<4 x half> %vec0, <4 x half> %vec1) ret <8 x half> %retval } @@ -31,7 +31,7 @@ ; CHECK-NEXT: zip2 v1.8h, v0.8h, v1.8h ; CHECK-NEXT: mov v0.16b, v2.16b ; CHECK-NEXT: ret - %retval = call <16 x half> @llvm.experimental.vector.interleave2.v16f16(<8 x half> %vec0, <8 x half> %vec1) + %retval = call <16 x half>(...) @llvm.experimental.vector.interleave.v16f16.v8f16(<8 x half> %vec0, <8 x half> %vec1) ret <16 x half> %retval } @@ -44,7 +44,7 @@ ; CHECK-NEXT: rev64 v1.4s, v0.4s ; CHECK-NEXT: uzp1 v0.4s, v0.4s, v1.4s ; CHECK-NEXT: ret - %retval = call <4 x float> @llvm.experimental.vector.interleave2.v4f32(<2 x float> %vec0, <2 x float> %vec1) + %retval = call <4 x float>(...) @llvm.experimental.vector.interleave.v4f32.v2f32(<2 x float> %vec0, <2 x float> %vec1) ret <4 x float> %retval } @@ -55,7 +55,7 @@ ; CHECK-NEXT: zip2 v1.4s, v0.4s, v1.4s ; CHECK-NEXT: mov v0.16b, v2.16b ; CHECK-NEXT: ret - %retval = call <8 x float> @llvm.experimental.vector.interleave2.v8f32(<4 x float> %vec0, <4 x float> %vec1) + %retval = call <8 x float>(...) @llvm.experimental.vector.interleave.v8f32.v4f32(<4 x float> %vec0, <4 x float> %vec1) ret <8 x float> %retval } @@ -66,7 +66,7 @@ ; CHECK-NEXT: zip2 v1.2d, v0.2d, v1.2d ; CHECK-NEXT: mov v0.16b, v2.16b ; CHECK-NEXT: ret - %retval = call <4 x double>@llvm.experimental.vector.interleave2.v4f64(<2 x double> %vec0, <2 x double> %vec1) + %retval = call <4 x double>(...) @llvm.experimental.vector.interleave.v4f64.v2f64(<2 x double> %vec0, <2 x double> %vec1) ret <4 x double> %retval } @@ -79,7 +79,7 @@ ; CHECK-NEXT: zip2 v1.16b, v0.16b, v1.16b ; CHECK-NEXT: mov v0.16b, v2.16b ; CHECK-NEXT: ret - %retval = call <32 x i8> @llvm.experimental.vector.interleave2.v32i8(<16 x i8> %vec0, <16 x i8> %vec1) + %retval = call <32 x i8>(...) @llvm.experimental.vector.interleave.v32i8.v16i8(<16 x i8> %vec0, <16 x i8> %vec1) ret <32 x i8> %retval } @@ -90,7 +90,7 @@ ; CHECK-NEXT: zip2 v1.8h, v0.8h, v1.8h ; CHECK-NEXT: mov v0.16b, v2.16b ; CHECK-NEXT: ret - %retval = call <16 x i16> @llvm.experimental.vector.interleave2.v16i16(<8 x i16> %vec0, <8 x i16> %vec1) + %retval = call <16 x i16>(...) @llvm.experimental.vector.interleave.v16i16.v8i16(<8 x i16> %vec0, <8 x i16> %vec1) ret <16 x i16> %retval } @@ -101,7 +101,7 @@ ; CHECK-NEXT: zip2 v1.4s, v0.4s, v1.4s ; CHECK-NEXT: mov v0.16b, v2.16b ; CHECK-NEXT: ret - %retval = call <8 x i32> @llvm.experimental.vector.interleave2.v8i32(<4 x i32> %vec0, <4 x i32> %vec1) + %retval = call <8 x i32>(...) @llvm.experimental.vector.interleave.v8i32.v4i32(<4 x i32> %vec0, <4 x i32> %vec1) ret <8 x i32> %retval } @@ -112,22 +112,21 @@ ; CHECK-NEXT: zip2 v1.2d, v0.2d, v1.2d ; CHECK-NEXT: mov v0.16b, v2.16b ; CHECK-NEXT: ret - %retval = call <4 x i64> @llvm.experimental.vector.interleave2.v4i64(<2 x i64> %vec0, <2 x i64> %vec1) + %retval = call <4 x i64>(...) @llvm.experimental.vector.interleave.v4i64.v2i64(<2 x i64> %vec0, <2 x i64> %vec1) ret <4 x i64> %retval } ; Float declarations -declare <4 x half> @llvm.experimental.vector.interleave2.v4f16(<2 x half>, <2 x half>) -declare <8 x half> @llvm.experimental.vector.interleave2.v8f16(<4 x half>, <4 x half>) -declare <16 x half> @llvm.experimental.vector.interleave2.v16f16(<8 x half>, <8 x half>) -declare <4 x float> @llvm.experimental.vector.interleave2.v4f32(<2 x float>, <2 x float>) -declare <8 x float> @llvm.experimental.vector.interleave2.v8f32(<4 x float>, <4 x float>) -declare <4 x double> @llvm.experimental.vector.interleave2.v4f64(<2 x double>, <2 x double>) +declare <4 x half> @llvm.experimental.vector.interleave.v4f16.v2f16(...) +declare <8 x half> @llvm.experimental.vector.interleave.v8f16.v4f16(...) +declare <16 x half> @llvm.experimental.vector.interleave.v16f16.v8f16(...) +declare <4 x float> @llvm.experimental.vector.interleave.v4f32.v2f32(...) +declare <8 x float> @llvm.experimental.vector.interleave.v8f32.v4f32(...) +declare <4 x double> @llvm.experimental.vector.interleave.v4f64.v2f64(...) ; Integer declarations -declare <32 x i8> @llvm.experimental.vector.interleave2.v32i8(<16 x i8>, <16 x i8>) -declare <16 x i16> @llvm.experimental.vector.interleave2.v16i16(<8 x i16>, <8 x i16>) -declare <8 x i32> @llvm.experimental.vector.interleave2.v8i32(<4 x i32>, <4 x i32>) -declare <4 x i64> @llvm.experimental.vector.interleave2.v4i64(<2 x i64>, <2 x i64>) - +declare <32 x i8> @llvm.experimental.vector.interleave.v32i8.v16i8(...) +declare <16 x i16> @llvm.experimental.vector.interleave.v16i16.v8i16(...) +declare <8 x i32> @llvm.experimental.vector.interleave.v8i32.v4i32(...) +declare <4 x i64> @llvm.experimental.vector.interleave.v4i64.v2i64(...) diff --git a/llvm/test/CodeGen/AArch64/sve-vector-deinterleave.ll b/llvm/test/CodeGen/AArch64/sve-vector-deinterleave.ll --- a/llvm/test/CodeGen/AArch64/sve-vector-deinterleave.ll +++ b/llvm/test/CodeGen/AArch64/sve-vector-deinterleave.ll @@ -9,7 +9,7 @@ ; CHECK-NEXT: uzp1 z0.d, z2.d, z1.d ; CHECK-NEXT: uzp2 z1.d, z2.d, z1.d ; CHECK-NEXT: ret - %retval = call {, } @llvm.experimental.vector.deinterleave2.nxv4f16( %vec) + %retval = call {, } @llvm.experimental.vector.deinterleave.nxv4f16.nxv2f16( %vec) ret {, } %retval } @@ -21,7 +21,7 @@ ; CHECK-NEXT: uzp1 z0.s, z2.s, z1.s ; CHECK-NEXT: uzp2 z1.s, z2.s, z1.s ; CHECK-NEXT: ret - %retval = call {, } @llvm.experimental.vector.deinterleave2.nxv8f16( %vec) + %retval = call {, } @llvm.experimental.vector.deinterleave.nxv8f16.nxv4f16( %vec) ret {, } %retval } @@ -32,7 +32,7 @@ ; CHECK-NEXT: uzp2 z1.h, z0.h, z1.h ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret - %retval = call {, } @llvm.experimental.vector.deinterleave2.nxv16f16( %vec) + %retval = call {, } @llvm.experimental.vector.deinterleave.nxv16f16.nxv8f16( %vec) ret {, } %retval } @@ -44,7 +44,7 @@ ; CHECK-NEXT: uzp1 z0.d, z2.d, z1.d ; CHECK-NEXT: uzp2 z1.d, z2.d, z1.d ; CHECK-NEXT: ret - %retval = call {, } @llvm.experimental.vector.deinterleave2.nxv4f32( %vec) + %retval = call {, } @llvm.experimental.vector.deinterleave.nxv4f32.nxv2f32( %vec) ret {, } %retval } @@ -55,7 +55,7 @@ ; CHECK-NEXT: uzp2 z1.s, z0.s, z1.s ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret - %retval = call {, } @llvm.experimental.vector.deinterleave2.nxv8f32( %vec) + %retval = call {, } @llvm.experimental.vector.deinterleave.nxv8f32.nxv4f32( %vec) ret {, } %retval } @@ -66,7 +66,7 @@ ; CHECK-NEXT: uzp2 z1.d, z0.d, z1.d ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret - %retval = call {, } @llvm.experimental.vector.deinterleave2.nxv4f64( %vec) + %retval = call {, } @llvm.experimental.vector.deinterleave.nxv4f64.nxv2f64( %vec) ret {, } %retval } @@ -79,7 +79,7 @@ ; CHECK-NEXT: uzp2 z1.b, z0.b, z1.b ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret - %retval = call {, } @llvm.experimental.vector.deinterleave2.nxv32i8( %vec) + %retval = call {, } @llvm.experimental.vector.deinterleave.nxv32i8.nxv16i8( %vec) ret {, } %retval } @@ -90,7 +90,7 @@ ; CHECK-NEXT: uzp2 z1.h, z0.h, z1.h ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret - %retval = call {, } @llvm.experimental.vector.deinterleave2.nxv16i16( %vec) + %retval = call {, } @llvm.experimental.vector.deinterleave.nxv16i16.nxv8i16( %vec) ret {, } %retval } @@ -101,7 +101,7 @@ ; CHECK-NEXT: uzp2 z1.s, z0.s, z1.s ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret - %retval = call {, } @llvm.experimental.vector.deinterleave2.nxv8i32( %vec) + %retval = call {, } @llvm.experimental.vector.deinterleave.nxv8i32.nxv4i32( %vec) ret {, } %retval } @@ -112,7 +112,7 @@ ; CHECK-NEXT: uzp2 z1.d, z0.d, z1.d ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret - %retval = call {, } @llvm.experimental.vector.deinterleave2.nxv4i64( %vec) + %retval = call {, } @llvm.experimental.vector.deinterleave.nxv4i64.nxv2i64( %vec) ret {, } %retval } @@ -124,7 +124,7 @@ ; CHECK-NEXT: uzp2 p1.b, p0.b, p1.b ; CHECK-NEXT: mov p0.b, p2.b ; CHECK-NEXT: ret - %retval = call {, } @llvm.experimental.vector.deinterleave2.nxv32i1( %vec) + %retval = call {, } @llvm.experimental.vector.deinterleave.nxv32i1.nxv16i1( %vec) ret {, } %retval } @@ -136,7 +136,7 @@ ; CHECK-NEXT: uzp1 p0.h, p2.h, p1.h ; CHECK-NEXT: uzp2 p1.h, p2.h, p1.h ; CHECK-NEXT: ret - %retval = call {, } @llvm.experimental.vector.deinterleave2.nxv16i1( %vec) + %retval = call {, } @llvm.experimental.vector.deinterleave.nxv16i1.nxv8i1( %vec) ret {, } %retval } @@ -148,7 +148,7 @@ ; CHECK-NEXT: uzp1 p0.s, p2.s, p1.s ; CHECK-NEXT: uzp2 p1.s, p2.s, p1.s ; CHECK-NEXT: ret - %retval = call {, } @llvm.experimental.vector.deinterleave2.nxv8i1( %vec) + %retval = call {, } @llvm.experimental.vector.deinterleave.nxv8i1.nxv4i1( %vec) ret {, } %retval } @@ -160,7 +160,7 @@ ; CHECK-NEXT: uzp1 p0.d, p2.d, p1.d ; CHECK-NEXT: uzp2 p1.d, p2.d, p1.d ; CHECK-NEXT: ret - %retval = call {, } @llvm.experimental.vector.deinterleave2.nxv4i1( %vec) + %retval = call {, } @llvm.experimental.vector.deinterleave.nxv4i1.nxv2i1( %vec) ret {, } %retval } @@ -178,7 +178,7 @@ ; CHECK-NEXT: mov z1.d, z4.d ; CHECK-NEXT: mov z2.d, z6.d ; CHECK-NEXT: ret -%retval = call {, } @llvm.experimental.vector.deinterleave2.nxv8i64( %vec) +%retval = call {, } @llvm.experimental.vector.deinterleave.nxv8i64.nxv4i64( %vec) ret {, } %retval } @@ -201,7 +201,7 @@ ; CHECK-NEXT: mov z5.d, z29.d ; CHECK-NEXT: mov z6.d, z30.d ; CHECK-NEXT: ret -%retval = call {, } @llvm.experimental.vector.deinterleave2.nxv16i64( %vec) +%retval = call {, } @llvm.experimental.vector.deinterleave.nxv16i64.nxv8i64( %vec) ret {, } %retval } @@ -216,7 +216,7 @@ ; CHECK-NEXT: uzp1 z0.h, z2.h, z1.h ; CHECK-NEXT: uzp2 z1.h, z2.h, z1.h ; CHECK-NEXT: ret -%retval = call {, } @llvm.experimental.vector.deinterleave2.nxv16i8( %vec) +%retval = call {, } @llvm.experimental.vector.deinterleave.nxv16i8.nxv8i8( %vec) ret {, } %retval } @@ -228,7 +228,7 @@ ; CHECK-NEXT: uzp1 z0.s, z2.s, z1.s ; CHECK-NEXT: uzp2 z1.s, z2.s, z1.s ; CHECK-NEXT: ret -%retval = call {, } @llvm.experimental.vector.deinterleave2.nxv8i16( %vec) +%retval = call {, } @llvm.experimental.vector.deinterleave.nxv8i16.nxv4i16( %vec) ret {, } %retval } @@ -240,35 +240,35 @@ ; CHECK-NEXT: uzp1 z0.d, z2.d, z1.d ; CHECK-NEXT: uzp2 z1.d, z2.d, z1.d ; CHECK-NEXT: ret -%retval = call {,} @llvm.experimental.vector.deinterleave2.nxv4i32( %vec) +%retval = call {,} @llvm.experimental.vector.deinterleave.nxv4i32.nxv2i32( %vec) ret {, } %retval } ; Floating declarations -declare {,} @llvm.experimental.vector.deinterleave2.nxv4f16() -declare {, } @llvm.experimental.vector.deinterleave2.nxv8f16() -declare {, } @llvm.experimental.vector.deinterleave2.nxv4f32() -declare {, } @llvm.experimental.vector.deinterleave2.nxv16f16() -declare {, } @llvm.experimental.vector.deinterleave2.nxv8f32() -declare {, } @llvm.experimental.vector.deinterleave2.nxv4f64() +declare {,} @llvm.experimental.vector.deinterleave.nxv4f16.nxv2f16() +declare {, } @llvm.experimental.vector.deinterleave.nxv8f16.nxv4f16() +declare {, } @llvm.experimental.vector.deinterleave.nxv4f32.nxv2f32() +declare {, } @llvm.experimental.vector.deinterleave.nxv16f16.nxv8f16() +declare {, } @llvm.experimental.vector.deinterleave.nxv8f32.nxv4f32() +declare {, } @llvm.experimental.vector.deinterleave.nxv4f64.nxv2f64() ; Integer declarations -declare {, } @llvm.experimental.vector.deinterleave2.nxv32i8() -declare {, } @llvm.experimental.vector.deinterleave2.nxv16i16() -declare {, } @llvm.experimental.vector.deinterleave2.nxv8i32() -declare {, } @llvm.experimental.vector.deinterleave2.nxv4i64() +declare {, } @llvm.experimental.vector.deinterleave.nxv32i8.nxv16i8() +declare {, } @llvm.experimental.vector.deinterleave.nxv16i16.nxv8i16() +declare {, } @llvm.experimental.vector.deinterleave.nxv8i32.nxv4i32() +declare {, } @llvm.experimental.vector.deinterleave.nxv4i64.nxv2i64() ; Predicated declarations -declare {, } @llvm.experimental.vector.deinterleave2.nxv32i1() -declare {, } @llvm.experimental.vector.deinterleave2.nxv16i1() -declare {, } @llvm.experimental.vector.deinterleave2.nxv8i1() -declare {, } @llvm.experimental.vector.deinterleave2.nxv4i1() +declare {, } @llvm.experimental.vector.deinterleave.nxv32i1.nxv16i1() +declare {, } @llvm.experimental.vector.deinterleave.nxv16i1.nxv8i1() +declare {, } @llvm.experimental.vector.deinterleave.nxv8i1.nxv4i1() +declare {, } @llvm.experimental.vector.deinterleave.nxv4i1.nxv2i1() ; Illegal size type -declare {, } @llvm.experimental.vector.deinterleave2.nxv8i64() -declare {, } @llvm.experimental.vector.deinterleave2.nxv16i64() +declare {, } @llvm.experimental.vector.deinterleave.nxv8i64.nxv4i64() +declare {, } @llvm.experimental.vector.deinterleave.nxv16i64.nxv8i64() -declare {, } @llvm.experimental.vector.deinterleave2.nxv16i8() -declare {, } @llvm.experimental.vector.deinterleave2.nxv8i16() -declare {, } @llvm.experimental.vector.deinterleave2.nxv4i32() +declare {, } @llvm.experimental.vector.deinterleave.nxv16i8.nxv8i8() +declare {, } @llvm.experimental.vector.deinterleave.nxv8i16.nxv4i16() +declare {, } @llvm.experimental.vector.deinterleave.nxv4i32.nxv2i32() diff --git a/llvm/test/CodeGen/AArch64/sve-vector-interleave.ll b/llvm/test/CodeGen/AArch64/sve-vector-interleave.ll --- a/llvm/test/CodeGen/AArch64/sve-vector-interleave.ll +++ b/llvm/test/CodeGen/AArch64/sve-vector-interleave.ll @@ -8,7 +8,7 @@ ; CHECK-NEXT: zip1 z0.d, z0.d, z1.d ; CHECK-NEXT: uzp1 z0.s, z0.s, z2.s ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv4f16( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv4f16.nxv2f16( %vec0, %vec1) ret %retval } @@ -19,7 +19,7 @@ ; CHECK-NEXT: zip1 z0.s, z0.s, z1.s ; CHECK-NEXT: uzp1 z0.h, z0.h, z2.h ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv8f16( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv8f16.nxv4f16( %vec0, %vec1) ret %retval } @@ -30,7 +30,7 @@ ; CHECK-NEXT: zip2 z1.h, z0.h, z1.h ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv16f16( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv16f16.nxv8f16( %vec0, %vec1) ret %retval } @@ -41,7 +41,7 @@ ; CHECK-NEXT: zip1 z0.d, z0.d, z1.d ; CHECK-NEXT: uzp1 z0.s, z0.s, z2.s ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv4f32( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv4f32.nxv2f32( %vec0, %vec1) ret %retval } @@ -52,7 +52,7 @@ ; CHECK-NEXT: zip2 z1.s, z0.s, z1.s ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv8f32( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv8f32.nxv4f32( %vec0, %vec1) ret %retval } @@ -63,7 +63,7 @@ ; CHECK-NEXT: zip2 z1.d, z0.d, z1.d ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv4f64( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv4f64.nxv2f64( %vec0, %vec1) ret %retval } @@ -76,7 +76,7 @@ ; CHECK-NEXT: zip2 z1.b, z0.b, z1.b ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv32i8( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv32i8.nxv16i8( %vec0, %vec1) ret %retval } @@ -87,7 +87,7 @@ ; CHECK-NEXT: zip2 z1.h, z0.h, z1.h ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv16i16( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv16i16.nxv8i16( %vec0, %vec1) ret %retval } @@ -98,7 +98,7 @@ ; CHECK-NEXT: zip2 z1.s, z0.s, z1.s ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv8i32( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv8i32.nxv4i32( %vec0, %vec1) ret %retval } @@ -109,7 +109,7 @@ ; CHECK-NEXT: zip2 z1.d, z0.d, z1.d ; CHECK-NEXT: mov z0.d, z2.d ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv4i64( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv4i64.nxv2i64( %vec0, %vec1) ret %retval } @@ -122,7 +122,7 @@ ; CHECK-NEXT: zip2 p1.b, p0.b, p1.b ; CHECK-NEXT: mov p0.b, p2.b ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv32i1( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv32i1.nxv16i1( %vec0, %vec1) ret %retval } @@ -133,7 +133,7 @@ ; CHECK-NEXT: zip1 p0.h, p0.h, p1.h ; CHECK-NEXT: uzp1 p0.b, p0.b, p2.b ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv16i1( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv16i1.nxv8i1( %vec0, %vec1) ret %retval } @@ -144,7 +144,7 @@ ; CHECK-NEXT: zip1 p0.s, p0.s, p1.s ; CHECK-NEXT: uzp1 p0.h, p0.h, p2.h ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv8i1( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv8i1.nxv4i1( %vec0, %vec1) ret %retval } @@ -155,7 +155,7 @@ ; CHECK-NEXT: zip1 p0.d, p0.d, p1.d ; CHECK-NEXT: uzp1 p0.s, p0.s, p2.s ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv4i1( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv4i1.nxv2i1( %vec0, %vec1) ret %retval } @@ -171,7 +171,7 @@ ; CHECK-NEXT: mov z0.d, z4.d ; CHECK-NEXT: mov z1.d, z5.d ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv16i32( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv16i32.nxv8i32( %vec0, %vec1) ret %retval } @@ -185,7 +185,7 @@ ; CHECK-NEXT: mov z0.d, z4.d ; CHECK-NEXT: mov z1.d, z5.d ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv8i64( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv8i64.nxv4i64( %vec0, %vec1) ret %retval } @@ -198,7 +198,7 @@ ; CHECK-NEXT: zip1 z0.h, z0.h, z1.h ; CHECK-NEXT: uzp1 z0.b, z0.b, z2.b ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv16i8( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv16i8.nxv8i8( %vec0, %vec1) ret %retval } @@ -209,7 +209,7 @@ ; CHECK-NEXT: zip1 z0.s, z0.s, z1.s ; CHECK-NEXT: uzp1 z0.h, z0.h, z2.h ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv8i16( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv8i16.nxv4i16( %vec0, %vec1) ret %retval } @@ -220,34 +220,34 @@ ; CHECK-NEXT: zip1 z0.d, z0.d, z1.d ; CHECK-NEXT: uzp1 z0.s, z0.s, z2.s ; CHECK-NEXT: ret - %retval = call @llvm.experimental.vector.interleave2.nxv4i32( %vec0, %vec1) + %retval = call (...) @llvm.experimental.vector.interleave.nxv4i32.nxv2i32( %vec0, %vec1) ret %retval } ; Float declarations -declare @llvm.experimental.vector.interleave2.nxv4f16(, ) -declare @llvm.experimental.vector.interleave2.nxv8f16(, ) -declare @llvm.experimental.vector.interleave2.nxv16f16(, ) -declare @llvm.experimental.vector.interleave2.nxv4f32(, ) -declare @llvm.experimental.vector.interleave2.nxv8f32(, ) -declare @llvm.experimental.vector.interleave2.nxv4f64(, ) +declare @llvm.experimental.vector.interleave.nxv4f16.nxv2f16(...) +declare @llvm.experimental.vector.interleave.nxv8f16.nxv4f16(...) +declare @llvm.experimental.vector.interleave.nxv16f16.nxv8f16(...) +declare @llvm.experimental.vector.interleave.nxv4f32.nxv2f32(...) +declare @llvm.experimental.vector.interleave.nxv8f32.nxv4f32(...) +declare @llvm.experimental.vector.interleave.nxv4f64.nxv2f64(...) ; Integer declarations -declare @llvm.experimental.vector.interleave2.nxv32i8(, ) -declare @llvm.experimental.vector.interleave2.nxv16i16(, ) -declare @llvm.experimental.vector.interleave2.nxv8i32(, ) -declare @llvm.experimental.vector.interleave2.nxv4i64(, ) +declare @llvm.experimental.vector.interleave.nxv32i8.nxv16i8(...) +declare @llvm.experimental.vector.interleave.nxv16i16.nxv8i16(...) +declare @llvm.experimental.vector.interleave.nxv8i32.nxv4i32(...) +declare @llvm.experimental.vector.interleave.nxv4i64.nxv2i64(...) ; Predicated -declare @llvm.experimental.vector.interleave2.nxv32i1(, ) -declare @llvm.experimental.vector.interleave2.nxv16i1(, ) -declare @llvm.experimental.vector.interleave2.nxv8i1(, ) -declare @llvm.experimental.vector.interleave2.nxv4i1(, ) +declare @llvm.experimental.vector.interleave.nxv32i1.nxv16i1(...) +declare @llvm.experimental.vector.interleave.nxv16i1.nxv8i1(...) +declare @llvm.experimental.vector.interleave.nxv8i1.nxv4i1(...) +declare @llvm.experimental.vector.interleave.nxv4i1.nxv2i1(...) ; Illegal type size -declare @llvm.experimental.vector.interleave2.nxv16i32(, ) -declare @llvm.experimental.vector.interleave2.nxv8i64(, ) +declare @llvm.experimental.vector.interleave.nxv16i32.nxv8i32(...) +declare @llvm.experimental.vector.interleave.nxv8i64.nxv4i64(...) -declare @llvm.experimental.vector.interleave2.nxv16i8(, ) -declare @llvm.experimental.vector.interleave2.nxv8i16(, ) -declare @llvm.experimental.vector.interleave2.nxv4i32(, ) +declare @llvm.experimental.vector.interleave.nxv16i8.nxv8i8(...) +declare @llvm.experimental.vector.interleave.nxv8i16.nxv4i16(...) +declare @llvm.experimental.vector.interleave.nxv4i32.nxv2i32(...) diff --git a/llvm/test/CodeGen/RISCV/rvv/vector-deinterleave-fixed.ll b/llvm/test/CodeGen/RISCV/rvv/vector-deinterleave-fixed.ll --- a/llvm/test/CodeGen/RISCV/rvv/vector-deinterleave-fixed.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vector-deinterleave-fixed.ll @@ -244,7 +244,7 @@ ; RV64-NEXT: vmsne.vi v8, v8, 0 ; RV64-NEXT: addi sp, sp, 32 ; RV64-NEXT: ret -%retval = call {<16 x i1>, <16 x i1>} @llvm.experimental.vector.deinterleave2.v32i1(<32 x i1> %vec) +%retval = call {<16 x i1>, <16 x i1>} @llvm.experimental.vector.deinterleave.v16i1.v32i1(<32 x i1> %vec) ret {<16 x i1>, <16 x i1>} %retval } @@ -257,7 +257,7 @@ ; CHECK-NEXT: vmv.v.v v8, v10 ; CHECK-NEXT: vmv.v.v v9, v11 ; CHECK-NEXT: ret -%retval = call {<16 x i8>, <16 x i8>} @llvm.experimental.vector.deinterleave2.v32i8(<32 x i8> %vec) +%retval = call {<16 x i8>, <16 x i8>} @llvm.experimental.vector.deinterleave.v16i8.v32i8(<32 x i8> %vec) ret {<16 x i8>, <16 x i8>} %retval } @@ -270,7 +270,7 @@ ; CHECK-NEXT: vmv.v.v v8, v10 ; CHECK-NEXT: vmv.v.v v9, v11 ; CHECK-NEXT: ret -%retval = call {<8 x i16>, <8 x i16>} @llvm.experimental.vector.deinterleave2.v16i16(<16 x i16> %vec) +%retval = call {<8 x i16>, <8 x i16>} @llvm.experimental.vector.deinterleave.v8i16.v16i16(<16 x i16> %vec) ret {<8 x i16>, <8 x i16>} %retval } @@ -284,7 +284,7 @@ ; CHECK-NEXT: vmv.v.v v8, v11 ; CHECK-NEXT: vmv.v.v v9, v10 ; CHECK-NEXT: ret -%retval = call {<4 x i32>, <4 x i32>} @llvm.experimental.vector.deinterleave2.v8i32(<8 x i32> %vec) +%retval = call {<4 x i32>, <4 x i32>} @llvm.experimental.vector.deinterleave.v4i32.v8i32(<8 x i32> %vec) ret {<4 x i32>, <4 x i32>} %retval } @@ -303,15 +303,15 @@ ; CHECK-NEXT: vmv.v.v v8, v10 ; CHECK-NEXT: vmv.v.v v9, v11 ; CHECK-NEXT: ret -%retval = call {<2 x i64>, <2 x i64>} @llvm.experimental.vector.deinterleave2.v4i64(<4 x i64> %vec) +%retval = call {<2 x i64>, <2 x i64>} @llvm.experimental.vector.deinterleave.v2i64.v4i64(<4 x i64> %vec) ret {<2 x i64>, <2 x i64>} %retval } -declare {<16 x i1>, <16 x i1>} @llvm.experimental.vector.deinterleave2.v32i1(<32 x i1>) -declare {<16 x i8>, <16 x i8>} @llvm.experimental.vector.deinterleave2.v32i8(<32 x i8>) -declare {<8 x i16>, <8 x i16>} @llvm.experimental.vector.deinterleave2.v16i16(<16 x i16>) -declare {<4 x i32>, <4 x i32>} @llvm.experimental.vector.deinterleave2.v8i32(<8 x i32>) -declare {<2 x i64>, <2 x i64>} @llvm.experimental.vector.deinterleave2.v4i64(<4 x i64>) +declare {<16 x i1>, <16 x i1>} @llvm.experimental.vector.deinterleave.v16i1.v32i1(<32 x i1>) +declare {<16 x i8>, <16 x i8>} @llvm.experimental.vector.deinterleave.v16i8.v32i8(<32 x i8>) +declare {<8 x i16>, <8 x i16>} @llvm.experimental.vector.deinterleave.v8i16.v16i16(<16 x i16>) +declare {<4 x i32>, <4 x i32>} @llvm.experimental.vector.deinterleave.v4i32.v8i32(<8 x i32>) +declare {<2 x i64>, <2 x i64>} @llvm.experimental.vector.deinterleave.v2i64.v4i64(<4 x i64>) ; Floats @@ -323,7 +323,7 @@ ; CHECK-NEXT: vnsrl.wi v9, v8, 16 ; CHECK-NEXT: vmv1r.v v8, v10 ; CHECK-NEXT: ret -%retval = call {<2 x half>, <2 x half>} @llvm.experimental.vector.deinterleave2.v4f16(<4 x half> %vec) +%retval = call {<2 x half>, <2 x half>} @llvm.experimental.vector.deinterleave.v2f16.v4f16(<4 x half> %vec) ret {<2 x half>, <2 x half>} %retval } @@ -335,7 +335,7 @@ ; CHECK-NEXT: vnsrl.wi v9, v8, 16 ; CHECK-NEXT: vmv1r.v v8, v10 ; CHECK-NEXT: ret -%retval = call {<4 x half>, <4 x half>} @llvm.experimental.vector.deinterleave2.v8f16(<8 x half> %vec) +%retval = call {<4 x half>, <4 x half>} @llvm.experimental.vector.deinterleave.v4f16.v8f16(<8 x half> %vec) ret {<4 x half>, <4 x half>} %retval } @@ -347,7 +347,7 @@ ; CHECK-NEXT: vnsrl.wx v9, v8, a0 ; CHECK-NEXT: vnsrl.wi v8, v8, 0 ; CHECK-NEXT: ret -%retval = call {<2 x float>, <2 x float>} @llvm.experimental.vector.deinterleave2.v4f32(<4 x float> %vec) +%retval = call {<2 x float>, <2 x float>} @llvm.experimental.vector.deinterleave.v2f32.v4f32(<4 x float> %vec) ret {<2 x float>, <2 x float>} %retval } @@ -360,7 +360,7 @@ ; CHECK-NEXT: vmv.v.v v8, v10 ; CHECK-NEXT: vmv.v.v v9, v11 ; CHECK-NEXT: ret -%retval = call {<8 x half>, <8 x half>} @llvm.experimental.vector.deinterleave2.v16f16(<16 x half> %vec) +%retval = call {<8 x half>, <8 x half>} @llvm.experimental.vector.deinterleave.v8f16.v16f16(<16 x half> %vec) ret {<8 x half>, <8 x half>} %retval } @@ -374,7 +374,7 @@ ; CHECK-NEXT: vmv.v.v v8, v11 ; CHECK-NEXT: vmv.v.v v9, v10 ; CHECK-NEXT: ret -%retval = call {<4 x float>, <4 x float>} @llvm.experimental.vector.deinterleave2.v8f32(<8 x float> %vec) +%retval = call {<4 x float>, <4 x float>} @llvm.experimental.vector.deinterleave.v4f32.v8f32(<8 x float> %vec) ret {<4 x float>, <4 x float>} %retval } @@ -393,13 +393,13 @@ ; CHECK-NEXT: vmv.v.v v8, v10 ; CHECK-NEXT: vmv.v.v v9, v11 ; CHECK-NEXT: ret -%retval = call {<2 x double>, <2 x double>} @llvm.experimental.vector.deinterleave2.v4f64(<4 x double> %vec) +%retval = call {<2 x double>, <2 x double>} @llvm.experimental.vector.deinterleave.v2f64.v4f64(<4 x double> %vec) ret {<2 x double>, <2 x double>} %retval } -declare {<2 x half>,<2 x half>} @llvm.experimental.vector.deinterleave2.v4f16(<4 x half>) -declare {<4 x half>, <4 x half>} @llvm.experimental.vector.deinterleave2.v8f16(<8 x half>) -declare {<2 x float>, <2 x float>} @llvm.experimental.vector.deinterleave2.v4f32(<4 x float>) -declare {<8 x half>, <8 x half>} @llvm.experimental.vector.deinterleave2.v16f16(<16 x half>) -declare {<4 x float>, <4 x float>} @llvm.experimental.vector.deinterleave2.v8f32(<8 x float>) -declare {<2 x double>, <2 x double>} @llvm.experimental.vector.deinterleave2.v4f64(<4 x double>) +declare {<2 x half>,<2 x half>} @llvm.experimental.vector.deinterleave.v2f16.v4f16(<4 x half>) +declare {<4 x half>, <4 x half>} @llvm.experimental.vector.deinterleave.v4f16.v8f16(<8 x half>) +declare {<2 x float>, <2 x float>} @llvm.experimental.vector.deinterleave.v2f32.v4f32(<4 x float>) +declare {<8 x half>, <8 x half>} @llvm.experimental.vector.deinterleave.v8f16.v16f16(<16 x half>) +declare {<4 x float>, <4 x float>} @llvm.experimental.vector.deinterleave.v4f32.v8f32(<8 x float>) +declare {<2 x double>, <2 x double>} @llvm.experimental.vector.deinterleave.v2f64.v4f64(<4 x double>) diff --git a/llvm/test/CodeGen/RISCV/rvv/vector-deinterleave.ll b/llvm/test/CodeGen/RISCV/rvv/vector-deinterleave.ll --- a/llvm/test/CodeGen/RISCV/rvv/vector-deinterleave.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vector-deinterleave.ll @@ -24,7 +24,7 @@ ; CHECK-NEXT: vand.vi v10, v8, 1 ; CHECK-NEXT: vmsne.vi v8, v10, 0 ; CHECK-NEXT: ret -%retval = call {, } @llvm.experimental.vector.deinterleave2.nxv32i1( %vec) +%retval = call {, } @llvm.experimental.vector.deinterleave.nxv16i1.nxv32i1( %vec) ret {, } %retval } @@ -37,7 +37,7 @@ ; CHECK-NEXT: vmv.v.v v8, v12 ; CHECK-NEXT: vmv.v.v v10, v14 ; CHECK-NEXT: ret -%retval = call {, } @llvm.experimental.vector.deinterleave2.nxv32i8( %vec) +%retval = call {, } @llvm.experimental.vector.deinterleave.nxv16i8.nxv32i8( %vec) ret {, } %retval } @@ -50,7 +50,7 @@ ; CHECK-NEXT: vmv.v.v v8, v12 ; CHECK-NEXT: vmv.v.v v10, v14 ; CHECK-NEXT: ret -%retval = call {, } @llvm.experimental.vector.deinterleave2.nxv16i16( %vec) +%retval = call {, } @llvm.experimental.vector.deinterleave.nxv8i16.nxv16i16( %vec) ret {, } %retval } @@ -64,7 +64,7 @@ ; CHECK-NEXT: vmv.v.v v8, v14 ; CHECK-NEXT: vmv.v.v v10, v12 ; CHECK-NEXT: ret -%retval = call {, } @llvm.experimental.vector.deinterleave2.nxv8i32( %vec) +%retval = call {, } @llvm.experimental.vector.deinterleave.nxv4i32.nxv8i32( %vec) ret {, } %retval } @@ -80,15 +80,19 @@ ; CHECK-NEXT: vmv2r.v v8, v12 ; CHECK-NEXT: vmv2r.v v10, v20 ; CHECK-NEXT: ret -%retval = call {, } @llvm.experimental.vector.deinterleave2.nxv4i64( %vec) +%retval = call {, } @llvm.experimental.vector.deinterleave.nxv2i64.nxv4i64( %vec) ret {, } %retval } -declare {, } @llvm.experimental.vector.deinterleave2.nxv32i1() -declare {, } @llvm.experimental.vector.deinterleave2.nxv32i8() -declare {, } @llvm.experimental.vector.deinterleave2.nxv16i16() -declare {, } @llvm.experimental.vector.deinterleave2.nxv8i32() -declare {, } @llvm.experimental.vector.deinterleave2.nxv4i64() +declare {, } @llvm.experimental.vector.deinterleave.nxv16i1.nxv32i1() +declare {, } @llvm.experimental.vector.deinterleave.nxv16i8.nxv32i8() +declare {, , } @llvm.experimental.vector.deinterleave.nxv4i8.nxv12i8() +declare {, , , , } @llvm.experimental.vector.deinterleave.nxv1i8.nxv5i8() +declare {, } @llvm.experimental.vector.deinterleave.nxv8i16.nxv16i16() +declare {, , , } @llvm.experimental.vector.deinterleave.nxv4i16.nxv16i16() +declare {, , } @llvm.experimental.vector.deinterleave.nxv2i32.nxv6i32() +declare {, } @llvm.experimental.vector.deinterleave.nxv4i32.nxv8i32() +declare {, } @llvm.experimental.vector.deinterleave.nxv2i64.nxv4i64() ; Floats @@ -100,7 +104,7 @@ ; CHECK-NEXT: vnsrl.wi v9, v8, 16 ; CHECK-NEXT: vmv1r.v v8, v10 ; CHECK-NEXT: ret -%retval = call {, } @llvm.experimental.vector.deinterleave2.nxv4f16( %vec) +%retval = call {, } @llvm.experimental.vector.deinterleave.nxv2f16.nxv4f16( %vec) ret {, } %retval } @@ -113,7 +117,7 @@ ; CHECK-NEXT: vmv.v.v v8, v10 ; CHECK-NEXT: vmv.v.v v9, v11 ; CHECK-NEXT: ret -%retval = call {, } @llvm.experimental.vector.deinterleave2.nxv8f16( %vec) +%retval = call {, } @llvm.experimental.vector.deinterleave.nxv4f16.nxv8f16( %vec) ret {, } %retval } @@ -127,7 +131,7 @@ ; CHECK-NEXT: vmv.v.v v8, v11 ; CHECK-NEXT: vmv.v.v v9, v10 ; CHECK-NEXT: ret -%retval = call {, } @llvm.experimental.vector.deinterleave2.nxv4f32( %vec) +%retval = call {, } @llvm.experimental.vector.deinterleave.nxv2f32.nxv4f32( %vec) ret {, } %retval } @@ -140,7 +144,7 @@ ; CHECK-NEXT: vmv.v.v v8, v12 ; CHECK-NEXT: vmv.v.v v10, v14 ; CHECK-NEXT: ret -%retval = call {, } @llvm.experimental.vector.deinterleave2.nxv16f16( %vec) +%retval = call {, } @llvm.experimental.vector.deinterleave.nxv8f16.nxv16f16( %vec) ret {, } %retval } @@ -154,7 +158,7 @@ ; CHECK-NEXT: vmv.v.v v8, v14 ; CHECK-NEXT: vmv.v.v v10, v12 ; CHECK-NEXT: ret -%retval = call {, } @llvm.experimental.vector.deinterleave2.nxv8f32( %vec) +%retval = call {, } @llvm.experimental.vector.deinterleave.nxv4f32.nxv8f32( %vec) ret {, } %retval } @@ -170,13 +174,13 @@ ; CHECK-NEXT: vmv2r.v v8, v12 ; CHECK-NEXT: vmv2r.v v10, v20 ; CHECK-NEXT: ret -%retval = call {, } @llvm.experimental.vector.deinterleave2.nxv4f64( %vec) +%retval = call {, } @llvm.experimental.vector.deinterleave.nxv2f64.nxv4f64( %vec) ret {, } %retval } -declare {,} @llvm.experimental.vector.deinterleave2.nxv4f16() -declare {, } @llvm.experimental.vector.deinterleave2.nxv8f16() -declare {, } @llvm.experimental.vector.deinterleave2.nxv4f32() -declare {, } @llvm.experimental.vector.deinterleave2.nxv16f16() -declare {, } @llvm.experimental.vector.deinterleave2.nxv8f32() -declare {, } @llvm.experimental.vector.deinterleave2.nxv4f64() +declare {,} @llvm.experimental.vector.deinterleave.nxv2f16.nxv4f16() +declare {, } @llvm.experimental.vector.deinterleave.nxv4f16.nxv8f16() +declare {, } @llvm.experimental.vector.deinterleave.nxv2f32.nxv4f32() +declare {, } @llvm.experimental.vector.deinterleave.nxv8f16.nxv16f16() +declare {, } @llvm.experimental.vector.deinterleave.nxv4f32.nxv8f32() +declare {, } @llvm.experimental.vector.deinterleave.nxv2f64.nxv4f64() diff --git a/llvm/test/CodeGen/RISCV/rvv/vector-interleave-fixed.ll b/llvm/test/CodeGen/RISCV/rvv/vector-interleave-fixed.ll --- a/llvm/test/CodeGen/RISCV/rvv/vector-interleave-fixed.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vector-interleave-fixed.ll @@ -250,7 +250,7 @@ ; RV64-NEXT: ld s0, 48(sp) # 8-byte Folded Reload ; RV64-NEXT: addi sp, sp, 64 ; RV64-NEXT: ret - %res = call <32 x i1> @llvm.experimental.vector.interleave2.v32i1(<16 x i1> %a, <16 x i1> %b) + %res = call <32 x i1>(...) @llvm.experimental.vector.interleave.v32i1.v16i1(<16 x i1> %a, <16 x i1> %b) ret <32 x i1> %res } @@ -263,7 +263,7 @@ ; CHECK-NEXT: vwmaccu.vx v10, a0, v9 ; CHECK-NEXT: vmv2r.v v8, v10 ; CHECK-NEXT: ret - %res = call <16 x i16> @llvm.experimental.vector.interleave2.v16i16(<8 x i16> %a, <8 x i16> %b) + %res = call <16 x i16>(...) @llvm.experimental.vector.interleave.v16i16.v8i16(<8 x i16> %a, <8 x i16> %b) ret <16 x i16> %res } @@ -276,7 +276,7 @@ ; CHECK-NEXT: vwmaccu.vx v10, a0, v9 ; CHECK-NEXT: vmv2r.v v8, v10 ; CHECK-NEXT: ret - %res = call <8 x i32> @llvm.experimental.vector.interleave2.v8i32(<4 x i32> %a, <4 x i32> %b) + %res = call <8 x i32>(...) @llvm.experimental.vector.interleave.v8i32.v4i32(<4 x i32> %a, <4 x i32> %b) ret <8 x i32> %res } @@ -314,14 +314,14 @@ ; RV64-NEXT: vle64.v v10, (a0) ; RV64-NEXT: vrgather.vv v8, v12, v10 ; RV64-NEXT: ret - %res = call <4 x i64> @llvm.experimental.vector.interleave2.v4i64(<2 x i64> %a, <2 x i64> %b) + %res = call <4 x i64>(...) @llvm.experimental.vector.interleave.v4i64.v2i64(<2 x i64> %a, <2 x i64> %b) ret <4 x i64> %res } -declare <32 x i1> @llvm.experimental.vector.interleave2.v32i1(<16 x i1>, <16 x i1>) -declare <16 x i16> @llvm.experimental.vector.interleave2.v16i16(<8 x i16>, <8 x i16>) -declare <8 x i32> @llvm.experimental.vector.interleave2.v8i32(<4 x i32>, <4 x i32>) -declare <4 x i64> @llvm.experimental.vector.interleave2.v4i64(<2 x i64>, <2 x i64>) +declare <32 x i1> @llvm.experimental.vector.interleave.v32i1.v16i1(...) +declare <16 x i16> @llvm.experimental.vector.interleave.v16i16.v8i16(...) +declare <8 x i32> @llvm.experimental.vector.interleave.v8i32.v4i32(...) +declare <4 x i64> @llvm.experimental.vector.interleave.v4i64.v2i64(...) ; Floats @@ -334,7 +334,7 @@ ; CHECK-NEXT: vwmaccu.vx v10, a0, v9 ; CHECK-NEXT: vmv1r.v v8, v10 ; CHECK-NEXT: ret - %res = call <4 x half> @llvm.experimental.vector.interleave2.v4f16(<2 x half> %a, <2 x half> %b) + %res = call <4 x half>(...) @llvm.experimental.vector.interleave.v4f16.v2f16(<2 x half> %a, <2 x half> %b) ret <4 x half> %res } @@ -347,7 +347,7 @@ ; CHECK-NEXT: vwmaccu.vx v10, a0, v9 ; CHECK-NEXT: vmv1r.v v8, v10 ; CHECK-NEXT: ret - %res = call <8 x half> @llvm.experimental.vector.interleave2.v8f16(<4 x half> %a, <4 x half> %b) + %res = call <8 x half>(...) @llvm.experimental.vector.interleave.v8f16.v4f16(<4 x half> %a, <4 x half> %b) ret <8 x half> %res } @@ -360,7 +360,7 @@ ; CHECK-NEXT: vwmaccu.vx v10, a0, v9 ; CHECK-NEXT: vmv1r.v v8, v10 ; CHECK-NEXT: ret - %res = call <4 x float> @llvm.experimental.vector.interleave2.v4f32(<2 x float> %a, <2 x float> %b) + %res = call <4 x float>(...) @llvm.experimental.vector.interleave.v4f32.v2f32(<2 x float> %a, <2 x float> %b) ret <4 x float> %res } @@ -373,7 +373,7 @@ ; CHECK-NEXT: vwmaccu.vx v10, a0, v9 ; CHECK-NEXT: vmv2r.v v8, v10 ; CHECK-NEXT: ret - %res = call <16 x half> @llvm.experimental.vector.interleave2.v16f16(<8 x half> %a, <8 x half> %b) + %res = call <16 x half>(...) @llvm.experimental.vector.interleave.v16f16.v8f16(<8 x half> %a, <8 x half> %b) ret <16 x half> %res } @@ -386,7 +386,7 @@ ; CHECK-NEXT: vwmaccu.vx v10, a0, v9 ; CHECK-NEXT: vmv2r.v v8, v10 ; CHECK-NEXT: ret - %res = call <8 x float> @llvm.experimental.vector.interleave2.v8f32(<4 x float> %a, <4 x float> %b) + %res = call <8 x float>(...) @llvm.experimental.vector.interleave.v8f32.v4f32(<4 x float> %a, <4 x float> %b) ret <8 x float> %res } @@ -424,14 +424,14 @@ ; RV64-NEXT: vle64.v v10, (a0) ; RV64-NEXT: vrgather.vv v8, v12, v10 ; RV64-NEXT: ret - %res = call <4 x double> @llvm.experimental.vector.interleave2.v4f64(<2 x double> %a, <2 x double> %b) + %res = call <4 x double>(...) @llvm.experimental.vector.interleave.v4f64.v2f64(<2 x double> %a, <2 x double> %b) ret <4 x double> %res } -declare <4 x half> @llvm.experimental.vector.interleave2.v4f16(<2 x half>, <2 x half>) -declare <8 x half> @llvm.experimental.vector.interleave2.v8f16(<4 x half>, <4 x half>) -declare <4 x float> @llvm.experimental.vector.interleave2.v4f32(<2 x float>, <2 x float>) -declare <16 x half> @llvm.experimental.vector.interleave2.v16f16(<8 x half>, <8 x half>) -declare <8 x float> @llvm.experimental.vector.interleave2.v8f32(<4 x float>, <4 x float>) -declare <4 x double> @llvm.experimental.vector.interleave2.v4f64(<2 x double>, <2 x double>) +declare <4 x half> @llvm.experimental.vector.interleave.v4f16.v2f16(...) +declare <8 x half> @llvm.experimental.vector.interleave.v8f16.v4f16(...) +declare <4 x float> @llvm.experimental.vector.interleave.v4f32.v2f32(...) +declare <16 x half> @llvm.experimental.vector.interleave.v16f16.v8f16(...) +declare <8 x float> @llvm.experimental.vector.interleave.v8f32.v4f32(...) +declare <4 x double> @llvm.experimental.vector.interleave.v4f64.v2f64(...) diff --git a/llvm/test/CodeGen/RISCV/rvv/vector-interleave.ll b/llvm/test/CodeGen/RISCV/rvv/vector-interleave.ll --- a/llvm/test/CodeGen/RISCV/rvv/vector-interleave.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vector-interleave.ll @@ -27,7 +27,7 @@ ; CHECK-NEXT: vsetvli zero, a1, e8, mf2, tu, ma ; CHECK-NEXT: vslideup.vx v0, v10, a0 ; CHECK-NEXT: ret - %res = call @llvm.experimental.vector.interleave2.nxv32i1( %a, %b) + %res = call (...) @llvm.experimental.vector.interleave.nxv32i1.nxv16i1( %a, %b) ret %res } @@ -40,7 +40,7 @@ ; CHECK-NEXT: vwmaccu.vx v12, a0, v10 ; CHECK-NEXT: vmv4r.v v8, v12 ; CHECK-NEXT: ret - %res = call @llvm.experimental.vector.interleave2.nxv16i16( %a, %b) + %res = call (...) @llvm.experimental.vector.interleave.nxv16i16.nxv8i16( %a, %b) ret %res } @@ -53,7 +53,7 @@ ; CHECK-NEXT: vwmaccu.vx v12, a0, v10 ; CHECK-NEXT: vmv4r.v v8, v12 ; CHECK-NEXT: ret - %res = call @llvm.experimental.vector.interleave2.nxv8i32( %a, %b) + %res = call (...) @llvm.experimental.vector.interleave.nxv8i32.nxv4i32( %a, %b) ret %res } @@ -74,14 +74,15 @@ ; CHECK-NEXT: vrgatherei16.vv v12, v8, v16, v0.t ; CHECK-NEXT: vmv.v.v v8, v12 ; CHECK-NEXT: ret - %res = call @llvm.experimental.vector.interleave2.nxv4i64( %a, %b) + %res = call (...) @llvm.experimental.vector.interleave.nxv4i64.nxv2i64( %a, %b) ret %res } -declare @llvm.experimental.vector.interleave2.nxv32i1(, ) -declare @llvm.experimental.vector.interleave2.nxv16i16(, ) -declare @llvm.experimental.vector.interleave2.nxv8i32(, ) -declare @llvm.experimental.vector.interleave2.nxv4i64(, ) +declare @llvm.experimental.vector.interleave.nxv32i1.nxv16i1(...) +declare @llvm.experimental.vector.interleave.nxv16i16.nxv8i16(...) +declare @llvm.experimental.vector.interleave.nxv8i32.nxv4i32(...) +declare @llvm.experimental.vector.interleave.nxv6i32.nxv2i32(...) +declare @llvm.experimental.vector.interleave.nxv4i64.nxv2i64(...) ; Floats @@ -101,7 +102,7 @@ ; CHECK-NEXT: vslideup.vx v10, v8, a0 ; CHECK-NEXT: vmv1r.v v8, v10 ; CHECK-NEXT: ret - %res = call @llvm.experimental.vector.interleave2.nxv4f16( %a, %b) + %res = call (...) @llvm.experimental.vector.interleave.nxv4f16.nxv2f16( %a, %b) ret %res } @@ -114,7 +115,7 @@ ; CHECK-NEXT: vwmaccu.vx v10, a0, v9 ; CHECK-NEXT: vmv2r.v v8, v10 ; CHECK-NEXT: ret - %res = call @llvm.experimental.vector.interleave2.nxv8f16( %a, %b) + %res = call (...) @llvm.experimental.vector.interleave.nxv8f16.nxv4f16( %a, %b) ret %res } @@ -127,7 +128,7 @@ ; CHECK-NEXT: vwmaccu.vx v10, a0, v9 ; CHECK-NEXT: vmv2r.v v8, v10 ; CHECK-NEXT: ret - %res = call @llvm.experimental.vector.interleave2.nxv4f32( %a, %b) + %res = call (...) @llvm.experimental.vector.interleave.nxv4f32.nxv2f32( %a, %b) ret %res } @@ -140,7 +141,7 @@ ; CHECK-NEXT: vwmaccu.vx v12, a0, v10 ; CHECK-NEXT: vmv4r.v v8, v12 ; CHECK-NEXT: ret - %res = call @llvm.experimental.vector.interleave2.nxv16f16( %a, %b) + %res = call (...) @llvm.experimental.vector.interleave.nxv16f16.nxv8f16( %a, %b) ret %res } @@ -153,7 +154,7 @@ ; CHECK-NEXT: vwmaccu.vx v12, a0, v10 ; CHECK-NEXT: vmv4r.v v8, v12 ; CHECK-NEXT: ret - %res = call @llvm.experimental.vector.interleave2.nxv8f32( %a, %b) + %res = call (...) @llvm.experimental.vector.interleave.nxv8f32.nxv4f32( %a, %b) ret %res } @@ -174,14 +175,14 @@ ; CHECK-NEXT: vrgatherei16.vv v12, v8, v16, v0.t ; CHECK-NEXT: vmv.v.v v8, v12 ; CHECK-NEXT: ret - %res = call @llvm.experimental.vector.interleave2.nxv4f64( %a, %b) + %res = call (...) @llvm.experimental.vector.interleave.nxv4f64.nxv2f64( %a, %b) ret %res } -declare @llvm.experimental.vector.interleave2.nxv4f16(, ) -declare @llvm.experimental.vector.interleave2.nxv8f16(, ) -declare @llvm.experimental.vector.interleave2.nxv4f32(, ) -declare @llvm.experimental.vector.interleave2.nxv16f16(, ) -declare @llvm.experimental.vector.interleave2.nxv8f32(, ) -declare @llvm.experimental.vector.interleave2.nxv4f64(, ) +declare @llvm.experimental.vector.interleave.nxv4f16.nxv2f16(...) +declare @llvm.experimental.vector.interleave.nxv8f16.nxv4f16(...) +declare @llvm.experimental.vector.interleave.nxv4f32.nxv2f32(...) +declare @llvm.experimental.vector.interleave.nxv16f16.nxv8f16(...) +declare @llvm.experimental.vector.interleave.nxv8f32.nxv4f32(...) +declare @llvm.experimental.vector.interleave.nxv4f64.nxv2f64(...) diff --git a/llvm/test/Verifier/vector-deinterleave-intrinsic.ll b/llvm/test/Verifier/vector-deinterleave-intrinsic.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Verifier/vector-deinterleave-intrinsic.ll @@ -0,0 +1,30 @@ +; RUN: not opt -S -passes=verify < %s 2>&1 | FileCheck %s + +declare i32 @llvm.experimental.vector.deinterleave.nxv2i32() +define i32 @non_struct_return_type( %a) { +; CHECK: vector.deinterleave result must be a struct type. + %1 = call i32 @llvm.experimental.vector.deinterleave.nxv2i32( %a) + ret i32 %1 +} + +declare {, } @llvm.experimental.vector.deinterleave.nxv9i32() +define {, } @non_multiple_return_type( %a) { +; CHECK: vector.deinterleave input must be a vector with a count that is a multiple of the number of result vectors. + %1 = call {, } @llvm.experimental.vector.deinterleave.nxv9i32( %a) + ret {, } %1 +} + +declare {, } @llvm.experimental.vector.deinterleave.nxv2i32.nxv4i32() +define {, } @incorrect_result_type_count( %a) { +; vector.deinterleave result types don't match up with the input. + %1 = call {, } @llvm.experimental.vector.deinterleave.nxv2i32.nxv4i32( %a) + ret {, } %1 +} + +declare {, } @llvm.experimental.vector.deinterleave.nxv2i64.nxv4i32() +define {, } @incorrect_result_type_element( %a) { +; vector.deinterleave result types don't match up with the input. + %1 = call {, } @llvm.experimental.vector.deinterleave.nxv2i64.nxv4i32( %a) + ret {, } %1 +} + diff --git a/llvm/test/Verifier/vector-interleave-intrinsic.ll b/llvm/test/Verifier/vector-interleave-intrinsic.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Verifier/vector-interleave-intrinsic.ll @@ -0,0 +1,21 @@ +; RUN: not opt -S -passes=verify < %s 2>&1 | FileCheck %s + +declare @llvm.experimental.vector.interleave.nxv9i32.nxv2i32(...) +define @non_multiple_return_type( %a, %b) { +; CHECK: vector.interleave result must be a vector with a count that is a multiple of the number of operands. + %1 = call (...) @llvm.experimental.vector.interleave.nxv9i32.nxv2i32( %a, %b) + ret %1 +} + +declare @llvm.experimental.vector.interleave.nxv4i32.nxv2i32(...) +define @incorrect_operand_type_count( %a, %b) { +; CHECK: vector.interleave operand types don't match up with the result. + %1 = call (...) @llvm.experimental.vector.interleave.nxv4i32.nxv2i32( %a, %b) + ret %1 +} + +define @incorrect_operand_type_element( %a, %b) { +; CHECK: vector.interleave operand types don't match up with the result. + %1 = call (...) @llvm.experimental.vector.interleave.nxv4i32.nxv2i32( %a, %b) + ret %1 +}