diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2024-06-17 17:55:42 +0100 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2024-06-17 18:01:12 +0100 |
commit | 7e3507e2f565bfc63d4a3f098ab770dce842ed32 (patch) | |
tree | a149a0b5762cb4f11a1c6585bade2868cd502ef8 /llvm/lib/CodeGen | |
parent | fe3f8ad8cc209c1f73a3c9465b46701120de51f7 (diff) | |
download | llvm-7e3507e2f565bfc63d4a3f098ab770dce842ed32.zip llvm-7e3507e2f565bfc63d4a3f098ab770dce842ed32.tar.gz llvm-7e3507e2f565bfc63d4a3f098ab770dce842ed32.tar.bz2 |
[DAG] visitAVG - avoid duplication in the avg(ext(x), ext(y)) -> ext(avg(x, y)) folds
m_BinOp doesn't need a compile time opcode - so we can merge these into signed/unsigned cases.
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 35 |
1 files changed, 11 insertions, 24 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 3dcd724..254d63a 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -5213,6 +5213,7 @@ SDValue DAGCombiner::visitAVG(SDNode *N) { SDValue N1 = N->getOperand(1); EVT VT = N->getValueType(0); SDLoc DL(N); + bool IsSigned = Opcode == ISD::AVGCEILS || Opcode == ISD::AVGFLOORS; // fold (avg c1, c2) if (SDValue C = DAG.FoldConstantArithmetic(Opcode, DL, VT, {N0, N1})) @@ -5248,33 +5249,19 @@ SDValue DAGCombiner::visitAVG(SDNode *N) { // fold avgu(zext(x), zext(y)) -> zext(avgu(x, y)) // fold avgs(sext(x), sext(y)) -> sext(avgs(x, y)) - if (sd_match( - N, m_BinOp(ISD::AVGFLOORU, m_ZExt(m_Value(X)), m_ZExt(m_Value(Y)))) && + if (!IsSigned && + sd_match(N, m_BinOp(Opcode, m_ZExt(m_Value(X)), m_ZExt(m_Value(Y)))) && X.getValueType() == Y.getValueType() && - hasOperation(ISD::AVGFLOORU, X.getValueType())) { - SDValue AvgFloorU = DAG.getNode(ISD::AVGFLOORU, DL, X.getValueType(), X, Y); - return DAG.getNode(ISD::ZERO_EXTEND, DL, VT, AvgFloorU); + hasOperation(Opcode, X.getValueType())) { + SDValue AvgU = DAG.getNode(Opcode, DL, X.getValueType(), X, Y); + return DAG.getNode(ISD::ZERO_EXTEND, DL, VT, AvgU); } - if (sd_match( - N, m_BinOp(ISD::AVGCEILU, m_ZExt(m_Value(X)), m_ZExt(m_Value(Y)))) && + if (IsSigned && + sd_match(N, m_BinOp(Opcode, m_SExt(m_Value(X)), m_SExt(m_Value(Y)))) && X.getValueType() == Y.getValueType() && - hasOperation(ISD::AVGCEILU, X.getValueType())) { - SDValue AvgCeilU = DAG.getNode(ISD::AVGCEILU, DL, X.getValueType(), X, Y); - return DAG.getNode(ISD::ZERO_EXTEND, DL, VT, AvgCeilU); - } - if (sd_match( - N, m_BinOp(ISD::AVGFLOORS, m_SExt(m_Value(X)), m_SExt(m_Value(Y)))) && - X.getValueType() == Y.getValueType() && - hasOperation(ISD::AVGFLOORS, X.getValueType())) { - SDValue AvgFloorS = DAG.getNode(ISD::AVGFLOORS, DL, X.getValueType(), X, Y); - return DAG.getNode(ISD::SIGN_EXTEND, DL, VT, AvgFloorS); - } - if (sd_match( - N, m_BinOp(ISD::AVGCEILS, m_SExt(m_Value(X)), m_SExt(m_Value(Y)))) && - X.getValueType() == Y.getValueType() && - hasOperation(ISD::AVGCEILS, X.getValueType())) { - SDValue AvgCeilS = DAG.getNode(ISD::AVGCEILS, DL, X.getValueType(), X, Y); - return DAG.getNode(ISD::SIGN_EXTEND, DL, VT, AvgCeilS); + hasOperation(Opcode, X.getValueType())) { + SDValue AvgS = DAG.getNode(Opcode, DL, X.getValueType(), X, Y); + return DAG.getNode(ISD::SIGN_EXTEND, DL, VT, AvgS); } // Fold avgflooru(x,y) -> avgceilu(x,y-1) iff y != 0 |