aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2024-06-17 17:55:42 +0100
committerSimon Pilgrim <llvm-dev@redking.me.uk>2024-06-17 18:01:12 +0100
commit7e3507e2f565bfc63d4a3f098ab770dce842ed32 (patch)
treea149a0b5762cb4f11a1c6585bade2868cd502ef8 /llvm/lib/CodeGen
parentfe3f8ad8cc209c1f73a3c9465b46701120de51f7 (diff)
downloadllvm-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.cpp35
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