diff options
| author | David Green <david.green@arm.com> | 2023-10-18 13:40:38 +0100 |
|---|---|---|
| committer | David Green <david.green@arm.com> | 2023-10-18 13:40:38 +0100 |
| commit | c060757bcc8a0d4537bc2f98e1208f089aef79e6 (patch) | |
| tree | a6935503ee35c00cd86e8ef09a5786d928156391 /llvm/lib | |
| parent | 561fcf547e07bbb2fafb0e7665d41696ff0308ab (diff) | |
| download | llvm-c060757bcc8a0d4537bc2f98e1208f089aef79e6.zip llvm-c060757bcc8a0d4537bc2f98e1208f089aef79e6.tar.gz llvm-c060757bcc8a0d4537bc2f98e1208f089aef79e6.tar.bz2 | |
[ARM] Correct v2i1 concat extract types.
For two v2i1 concat into a v4i1, we cannot extract each i64 element as an i32.
This casts to a v4i32 instead and extracts the correct vector lanes.
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 8cca167..6e58cba 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -9082,6 +9082,8 @@ static SDValue LowerCONCAT_VECTORS_i1(SDValue Op, SelectionDAG &DAG, EVT Op1VT = V1.getValueType(); EVT Op2VT = V2.getValueType(); assert(Op1VT == Op2VT && "Operand types don't match!"); + assert((Op1VT == MVT::v2i1 || Op1VT == MVT::v4i1 || Op1VT == MVT::v8i1) && + "Unexpected i1 concat operations!"); EVT VT = Op1VT.getDoubleNumVectorElementsVT(*DAG.getContext()); SDValue NewV1 = PromoteMVEPredVector(dl, V1, Op1VT, DAG); @@ -9103,9 +9105,14 @@ static SDValue LowerCONCAT_VECTORS_i1(SDValue Op, SelectionDAG &DAG, auto ExtractInto = [&DAG, &dl](SDValue NewV, SDValue ConVec, unsigned &j) { EVT NewVT = NewV.getValueType(); EVT ConcatVT = ConVec.getValueType(); + unsigned ExtScale = 1; + if (NewVT == MVT::v2f64) { + NewV = DAG.getNode(ARMISD::VECTOR_REG_CAST, dl, MVT::v4i32, NewV); + ExtScale = 2; + } for (unsigned i = 0, e = NewVT.getVectorNumElements(); i < e; i++, j++) { SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32, NewV, - DAG.getIntPtrConstant(i, dl)); + DAG.getIntPtrConstant(i * ExtScale, dl)); ConVec = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, ConcatVT, ConVec, Elt, DAG.getConstant(j, dl, MVT::i32)); } @@ -9116,14 +9123,7 @@ static SDValue LowerCONCAT_VECTORS_i1(SDValue Op, SelectionDAG &DAG, ConVec = ExtractInto(NewV2, ConVec, j); // Now return the result of comparing the subvector with zero, which will - // generate a real predicate, i.e. v4i1, v8i1 or v16i1. For a v2i1 we - // convert to a v4i1 compare to fill in the two halves of the i64 as i32s. - if (VT == MVT::v2i1) { - SDValue BC = DAG.getNode(ARMISD::VECTOR_REG_CAST, dl, MVT::v4i32, ConVec); - SDValue Cmp = DAG.getNode(ARMISD::VCMPZ, dl, MVT::v4i1, BC, - DAG.getConstant(ARMCC::NE, dl, MVT::i32)); - return DAG.getNode(ARMISD::PREDICATE_CAST, dl, MVT::v2i1, Cmp); - } + // generate a real predicate, i.e. v4i1, v8i1 or v16i1. return DAG.getNode(ARMISD::VCMPZ, dl, VT, ConVec, DAG.getConstant(ARMCC::NE, dl, MVT::i32)); }; |
