Skip to content

Commit fcb36ca

Browse files
authored
[DAG] visitTRUNCATE - merge the trunc(abd) and trunc(avg) handling which are almost identical (#154301)
CC @houngkoungting
1 parent df57bb8 commit fcb36ca

File tree

1 file changed

+9
-37
lines changed

1 file changed

+9
-37
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 9 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -16279,40 +16279,6 @@ SDValue DAGCombiner::visitTRUNCATE(SDNode *N) {
1627916279
// because targets may prefer a wider type during later combines and invert
1628016280
// this transform.
1628116281
switch (N0.getOpcode()) {
16282-
case ISD::AVGCEILU:
16283-
case ISD::AVGFLOORU:
16284-
if (!LegalOperations && N0.hasOneUse() &&
16285-
TLI.isOperationLegal(N0.getOpcode(), VT)) {
16286-
SDValue X = N0.getOperand(0);
16287-
SDValue Y = N0.getOperand(1);
16288-
unsigned SrcBits = X.getScalarValueSizeInBits();
16289-
unsigned DstBits = VT.getScalarSizeInBits();
16290-
APInt UpperBits = APInt::getBitsSetFrom(SrcBits, DstBits);
16291-
if (DAG.MaskedValueIsZero(X, UpperBits) &&
16292-
DAG.MaskedValueIsZero(Y, UpperBits)) {
16293-
SDValue Tx = DAG.getNode(ISD::TRUNCATE, DL, VT, X);
16294-
SDValue Ty = DAG.getNode(ISD::TRUNCATE, DL, VT, Y);
16295-
return DAG.getNode(N0.getOpcode(), DL, VT, Tx, Ty);
16296-
}
16297-
}
16298-
break;
16299-
case ISD::AVGCEILS:
16300-
case ISD::AVGFLOORS:
16301-
if (!LegalOperations && N0.hasOneUse() &&
16302-
TLI.isOperationLegal(N0.getOpcode(), VT)) {
16303-
SDValue X = N0.getOperand(0);
16304-
SDValue Y = N0.getOperand(1);
16305-
unsigned SrcBits = X.getScalarValueSizeInBits();
16306-
unsigned DstBits = VT.getScalarSizeInBits();
16307-
unsigned NeededSignBits = SrcBits - DstBits + 1;
16308-
if (DAG.ComputeNumSignBits(X) >= NeededSignBits &&
16309-
DAG.ComputeNumSignBits(Y) >= NeededSignBits) {
16310-
SDValue Tx = DAG.getNode(ISD::TRUNCATE, DL, VT, X);
16311-
SDValue Ty = DAG.getNode(ISD::TRUNCATE, DL, VT, Y);
16312-
return DAG.getNode(N0.getOpcode(), DL, VT, Tx, Ty);
16313-
}
16314-
}
16315-
break;
1631616282
case ISD::ADD:
1631716283
case ISD::SUB:
1631816284
case ISD::MUL:
@@ -16361,10 +16327,15 @@ SDValue DAGCombiner::visitTRUNCATE(SDNode *N) {
1636116327
DAG, DL);
1636216328
}
1636316329
break;
16364-
case ISD::ABDU:
16330+
case ISD::AVGFLOORS:
16331+
case ISD::AVGFLOORU:
16332+
case ISD::AVGCEILS:
16333+
case ISD::AVGCEILU:
1636516334
case ISD::ABDS:
16335+
case ISD::ABDU:
16336+
// (trunc (avg a, b)) -> (avg (trunc a), (trunc b))
1636616337
// (trunc (abdu/abds a, b)) -> (abdu/abds (trunc a), (trunc b))
16367-
if ((!LegalOperations || N0.hasOneUse()) &&
16338+
if (!LegalOperations && N0.hasOneUse() &&
1636816339
TLI.isOperationLegal(N0.getOpcode(), VT)) {
1636916340
EVT TruncVT = VT;
1637016341
unsigned SrcBits = SrcVT.getScalarSizeInBits();
@@ -16374,7 +16345,8 @@ SDValue DAGCombiner::visitTRUNCATE(SDNode *N) {
1637416345
SDValue B = N0.getOperand(1);
1637516346
bool CanFold = false;
1637616347

16377-
if (N0.getOpcode() == ISD::ABDU) {
16348+
if (N0.getOpcode() == ISD::AVGFLOORU || N0.getOpcode() == ISD::AVGCEILU ||
16349+
N0.getOpcode() == ISD::ABDU) {
1637816350
APInt UpperBits = APInt::getBitsSetFrom(SrcBits, TruncBits);
1637916351
CanFold = DAG.MaskedValueIsZero(B, UpperBits) &&
1638016352
DAG.MaskedValueIsZero(A, UpperBits);

0 commit comments

Comments
 (0)