[llvm] 7e3507e - [DAG] visitAVG - avoid duplication in the avg(ext(x), ext(y)) -> ext(avg(x, y)) folds
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 17 10:01:44 PDT 2024
Author: Simon Pilgrim
Date: 2024-06-17T18:01:12+01:00
New Revision: 7e3507e2f565bfc63d4a3f098ab770dce842ed32
URL: https://github.com/llvm/llvm-project/commit/7e3507e2f565bfc63d4a3f098ab770dce842ed32
DIFF: https://github.com/llvm/llvm-project/commit/7e3507e2f565bfc63d4a3f098ab770dce842ed32.diff
LOG: [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.
Added:
Modified:
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 3dcd724e0408d..254d63abdf805 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
More information about the llvm-commits
mailing list