[llvm] [AArch64] Convert concat(uhadd(a,b), uhadd(c,d)) to uhadd(concat(a,c), concat(b,d)) (PR #80674)
Rin Dobrescu via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 5 06:32:21 PST 2024
- Previous message: [llvm] [AArch64] Convert concat(uhadd(a,b), uhadd(c,d)) to uhadd(concat(a,c), concat(b,d)) (PR #80674)
- Next message: [llvm] [AArch64] Convert concat(uhadd(a,b), uhadd(c,d)) to uhadd(concat(a,c), concat(b,d)) (PR #80674)
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
================
@@ -18218,50 +18218,23 @@ static SDValue performConcatVectorsCombine(SDNode *N,
if (DCI.isBeforeLegalizeOps())
return SDValue();
- // Optimise concat_vectors of two [us]avgceils or [us]avgfloors that use
- // extracted subvectors from the same original vectors. Combine these into a
- // single avg that operates on the two original vectors.
- // avgceil is the target independant name for rhadd, avgfloor is a hadd.
- // Example:
- // (concat_vectors (v8i8 (avgceils (extract_subvector (v16i8 OpA, <0>),
- // extract_subvector (v16i8 OpB, <0>))),
- // (v8i8 (avgceils (extract_subvector (v16i8 OpA, <8>),
- // extract_subvector (v16i8 OpB, <8>)))))
- // ->
- // (v16i8(avgceils(v16i8 OpA, v16i8 OpB)))
- if (N->getNumOperands() == 2 && N0Opc == N1Opc &&
+ // Optimise concat_vectors of two [us]avgceils or [us]avgfloors with a 128-bit
+ // destination size, combine into an avg of two contacts of the source
+ // vectors. eg: concat(uhadd(a,b), uhadd(c, d)) -> uhadd(concat(a, c),
+ // concat(b, d))
+ if (N->getNumOperands() == 2 && N0Opc == N1Opc && VT.is128BitVector() &&
(N0Opc == ISD::AVGCEILU || N0Opc == ISD::AVGCEILS ||
- N0Opc == ISD::AVGFLOORU || N0Opc == ISD::AVGFLOORS)) {
+ N0Opc == ISD::AVGFLOORU || N0Opc == ISD::AVGFLOORS) &&
+ N0->hasOneUse() && N1->hasOneUse()) {
SDValue N00 = N0->getOperand(0);
SDValue N01 = N0->getOperand(1);
SDValue N10 = N1->getOperand(0);
SDValue N11 = N1->getOperand(1);
- EVT N00VT = N00.getValueType();
- EVT N10VT = N10.getValueType();
-
- if (N00->getOpcode() == ISD::EXTRACT_SUBVECTOR &&
- N01->getOpcode() == ISD::EXTRACT_SUBVECTOR &&
- N10->getOpcode() == ISD::EXTRACT_SUBVECTOR &&
- N11->getOpcode() == ISD::EXTRACT_SUBVECTOR && N00VT == N10VT) {
- SDValue N00Source = N00->getOperand(0);
- SDValue N01Source = N01->getOperand(0);
- SDValue N10Source = N10->getOperand(0);
- SDValue N11Source = N11->getOperand(0);
-
- if (N00Source == N10Source && N01Source == N11Source &&
- N00Source.getValueType() == VT && N01Source.getValueType() == VT) {
- assert(N0.getValueType() == N1.getValueType());
-
- uint64_t N00Index = N00.getConstantOperandVal(1);
- uint64_t N01Index = N01.getConstantOperandVal(1);
- uint64_t N10Index = N10.getConstantOperandVal(1);
- uint64_t N11Index = N11.getConstantOperandVal(1);
-
- if (N00Index == N01Index && N10Index == N11Index && N00Index == 0 &&
- N10Index == N00VT.getVectorNumElements())
- return DAG.getNode(N0Opc, dl, VT, N00Source, N01Source);
- }
+ if (!N00.isUndef() && !N01.isUndef() && !N10.isUndef() && !N11.isUndef()) {
----------------
Rin18 wrote:
Sure, I'll add a test to show that.
https://github.com/llvm/llvm-project/pull/80674
- Previous message: [llvm] [AArch64] Convert concat(uhadd(a,b), uhadd(c,d)) to uhadd(concat(a,c), concat(b,d)) (PR #80674)
- Next message: [llvm] [AArch64] Convert concat(uhadd(a,b), uhadd(c,d)) to uhadd(concat(a,c), concat(b,d)) (PR #80674)
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the llvm-commits
mailing list