aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib
diff options
context:
space:
mode:
authorDavid Green <david.green@arm.com>2023-10-18 13:40:38 +0100
committerDavid Green <david.green@arm.com>2023-10-18 13:40:38 +0100
commitc060757bcc8a0d4537bc2f98e1208f089aef79e6 (patch)
treea6935503ee35c00cd86e8ef09a5786d928156391 /llvm/lib
parent561fcf547e07bbb2fafb0e7665d41696ff0308ab (diff)
downloadllvm-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.cpp18
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));
};