mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
[DAG] hoist DL(N) and fix formatting; NFC
llvm-svn: 284170
This commit is contained in:
parent
af8dd6b82e
commit
f9abb54589
@ -1694,6 +1694,7 @@ SDValue DAGCombiner::visitADD(SDNode *N) {
|
|||||||
SDValue N0 = N->getOperand(0);
|
SDValue N0 = N->getOperand(0);
|
||||||
SDValue N1 = N->getOperand(1);
|
SDValue N1 = N->getOperand(1);
|
||||||
EVT VT = N0.getValueType();
|
EVT VT = N0.getValueType();
|
||||||
|
SDLoc DL(N);
|
||||||
|
|
||||||
// fold vector ops
|
// fold vector ops
|
||||||
if (VT.isVector()) {
|
if (VT.isVector()) {
|
||||||
@ -1710,62 +1711,73 @@ SDValue DAGCombiner::visitADD(SDNode *N) {
|
|||||||
// fold (add x, undef) -> undef
|
// fold (add x, undef) -> undef
|
||||||
if (N0.isUndef())
|
if (N0.isUndef())
|
||||||
return N0;
|
return N0;
|
||||||
|
|
||||||
if (N1.isUndef())
|
if (N1.isUndef())
|
||||||
return N1;
|
return N1;
|
||||||
|
|
||||||
if (DAG.isConstantIntBuildVectorOrConstantInt(N0)) {
|
if (DAG.isConstantIntBuildVectorOrConstantInt(N0)) {
|
||||||
// canonicalize constant to RHS
|
// canonicalize constant to RHS
|
||||||
if (!DAG.isConstantIntBuildVectorOrConstantInt(N1))
|
if (!DAG.isConstantIntBuildVectorOrConstantInt(N1))
|
||||||
return DAG.getNode(ISD::ADD, SDLoc(N), VT, N1, N0);
|
return DAG.getNode(ISD::ADD, DL, VT, N1, N0);
|
||||||
// fold (add c1, c2) -> c1+c2
|
// fold (add c1, c2) -> c1+c2
|
||||||
return DAG.FoldConstantArithmetic(ISD::ADD, SDLoc(N), VT,
|
return DAG.FoldConstantArithmetic(ISD::ADD, DL, VT, N0.getNode(),
|
||||||
N0.getNode(), N1.getNode());
|
N1.getNode());
|
||||||
}
|
}
|
||||||
|
|
||||||
// fold (add x, 0) -> x
|
// fold (add x, 0) -> x
|
||||||
if (isNullConstant(N1))
|
if (isNullConstant(N1))
|
||||||
return N0;
|
return N0;
|
||||||
|
|
||||||
// fold ((c1-A)+c2) -> (c1+c2)-A
|
// fold ((c1-A)+c2) -> (c1+c2)-A
|
||||||
if (isConstantOrConstantVector(N1, /* NoOpaque */ true)) {
|
if (isConstantOrConstantVector(N1, /* NoOpaque */ true)) {
|
||||||
if (N0.getOpcode() == ISD::SUB)
|
if (N0.getOpcode() == ISD::SUB)
|
||||||
if (isConstantOrConstantVector(N0.getOperand(0), /* NoOpaque */ true)) {
|
if (isConstantOrConstantVector(N0.getOperand(0), /* NoOpaque */ true)) {
|
||||||
SDLoc DL(N);
|
|
||||||
return DAG.getNode(ISD::SUB, DL, VT,
|
return DAG.getNode(ISD::SUB, DL, VT,
|
||||||
DAG.getNode(ISD::ADD, DL, VT, N1, N0.getOperand(0)),
|
DAG.getNode(ISD::ADD, DL, VT, N1, N0.getOperand(0)),
|
||||||
N0.getOperand(1));
|
N0.getOperand(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// reassociate add
|
// reassociate add
|
||||||
if (SDValue RADD = ReassociateOps(ISD::ADD, SDLoc(N), N0, N1))
|
if (SDValue RADD = ReassociateOps(ISD::ADD, DL, N0, N1))
|
||||||
return RADD;
|
return RADD;
|
||||||
|
|
||||||
// fold ((0-A) + B) -> B-A
|
// fold ((0-A) + B) -> B-A
|
||||||
if (N0.getOpcode() == ISD::SUB &&
|
if (N0.getOpcode() == ISD::SUB &&
|
||||||
isNullConstantOrNullSplatConstant(N0.getOperand(0)))
|
isNullConstantOrNullSplatConstant(N0.getOperand(0)))
|
||||||
return DAG.getNode(ISD::SUB, SDLoc(N), VT, N1, N0.getOperand(1));
|
return DAG.getNode(ISD::SUB, DL, VT, N1, N0.getOperand(1));
|
||||||
|
|
||||||
// fold (A + (0-B)) -> A-B
|
// fold (A + (0-B)) -> A-B
|
||||||
if (N1.getOpcode() == ISD::SUB &&
|
if (N1.getOpcode() == ISD::SUB &&
|
||||||
isNullConstantOrNullSplatConstant(N1.getOperand(0)))
|
isNullConstantOrNullSplatConstant(N1.getOperand(0)))
|
||||||
return DAG.getNode(ISD::SUB, SDLoc(N), VT, N0, N1.getOperand(1));
|
return DAG.getNode(ISD::SUB, DL, VT, N0, N1.getOperand(1));
|
||||||
|
|
||||||
// fold (A+(B-A)) -> B
|
// fold (A+(B-A)) -> B
|
||||||
if (N1.getOpcode() == ISD::SUB && N0 == N1.getOperand(1))
|
if (N1.getOpcode() == ISD::SUB && N0 == N1.getOperand(1))
|
||||||
return N1.getOperand(0);
|
return N1.getOperand(0);
|
||||||
|
|
||||||
// fold ((B-A)+A) -> B
|
// fold ((B-A)+A) -> B
|
||||||
if (N0.getOpcode() == ISD::SUB && N1 == N0.getOperand(1))
|
if (N0.getOpcode() == ISD::SUB && N1 == N0.getOperand(1))
|
||||||
return N0.getOperand(0);
|
return N0.getOperand(0);
|
||||||
|
|
||||||
// fold (A+(B-(A+C))) to (B-C)
|
// fold (A+(B-(A+C))) to (B-C)
|
||||||
if (N1.getOpcode() == ISD::SUB && N1.getOperand(1).getOpcode() == ISD::ADD &&
|
if (N1.getOpcode() == ISD::SUB && N1.getOperand(1).getOpcode() == ISD::ADD &&
|
||||||
N0 == N1.getOperand(1).getOperand(0))
|
N0 == N1.getOperand(1).getOperand(0))
|
||||||
return DAG.getNode(ISD::SUB, SDLoc(N), VT, N1.getOperand(0),
|
return DAG.getNode(ISD::SUB, DL, VT, N1.getOperand(0),
|
||||||
N1.getOperand(1).getOperand(1));
|
N1.getOperand(1).getOperand(1));
|
||||||
|
|
||||||
// fold (A+(B-(C+A))) to (B-C)
|
// fold (A+(B-(C+A))) to (B-C)
|
||||||
if (N1.getOpcode() == ISD::SUB && N1.getOperand(1).getOpcode() == ISD::ADD &&
|
if (N1.getOpcode() == ISD::SUB && N1.getOperand(1).getOpcode() == ISD::ADD &&
|
||||||
N0 == N1.getOperand(1).getOperand(1))
|
N0 == N1.getOperand(1).getOperand(1))
|
||||||
return DAG.getNode(ISD::SUB, SDLoc(N), VT, N1.getOperand(0),
|
return DAG.getNode(ISD::SUB, DL, VT, N1.getOperand(0),
|
||||||
N1.getOperand(1).getOperand(0));
|
N1.getOperand(1).getOperand(0));
|
||||||
|
|
||||||
// fold (A+((B-A)+or-C)) to (B+or-C)
|
// fold (A+((B-A)+or-C)) to (B+or-C)
|
||||||
if ((N1.getOpcode() == ISD::SUB || N1.getOpcode() == ISD::ADD) &&
|
if ((N1.getOpcode() == ISD::SUB || N1.getOpcode() == ISD::ADD) &&
|
||||||
N1.getOperand(0).getOpcode() == ISD::SUB &&
|
N1.getOperand(0).getOpcode() == ISD::SUB &&
|
||||||
N0 == N1.getOperand(0).getOperand(1))
|
N0 == N1.getOperand(0).getOperand(1))
|
||||||
return DAG.getNode(N1.getOpcode(), SDLoc(N), VT,
|
return DAG.getNode(N1.getOpcode(), DL, VT, N1.getOperand(0).getOperand(0),
|
||||||
N1.getOperand(0).getOperand(0), N1.getOperand(1));
|
N1.getOperand(1));
|
||||||
|
|
||||||
// fold (A-B)+(C-D) to (A+C)-(B+D) when A or C is constant
|
// fold (A-B)+(C-D) to (A+C)-(B+D) when A or C is constant
|
||||||
if (N0.getOpcode() == ISD::SUB && N1.getOpcode() == ISD::SUB) {
|
if (N0.getOpcode() == ISD::SUB && N1.getOpcode() == ISD::SUB) {
|
||||||
@ -1774,9 +1786,8 @@ SDValue DAGCombiner::visitADD(SDNode *N) {
|
|||||||
SDValue N10 = N1.getOperand(0);
|
SDValue N10 = N1.getOperand(0);
|
||||||
SDValue N11 = N1.getOperand(1);
|
SDValue N11 = N1.getOperand(1);
|
||||||
|
|
||||||
if (isConstantOrConstantVector(N00) ||
|
if (isConstantOrConstantVector(N00) || isConstantOrConstantVector(N10))
|
||||||
isConstantOrConstantVector(N10))
|
return DAG.getNode(ISD::SUB, DL, VT,
|
||||||
return DAG.getNode(ISD::SUB, SDLoc(N), VT,
|
|
||||||
DAG.getNode(ISD::ADD, SDLoc(N0), VT, N00, N10),
|
DAG.getNode(ISD::ADD, SDLoc(N0), VT, N00, N10),
|
||||||
DAG.getNode(ISD::ADD, SDLoc(N1), VT, N01, N11));
|
DAG.getNode(ISD::ADD, SDLoc(N1), VT, N01, N11));
|
||||||
}
|
}
|
||||||
@ -1787,19 +1798,19 @@ SDValue DAGCombiner::visitADD(SDNode *N) {
|
|||||||
// fold (a+b) -> (a|b) iff a and b share no bits.
|
// fold (a+b) -> (a|b) iff a and b share no bits.
|
||||||
if ((!LegalOperations || TLI.isOperationLegal(ISD::OR, VT)) &&
|
if ((!LegalOperations || TLI.isOperationLegal(ISD::OR, VT)) &&
|
||||||
VT.isInteger() && DAG.haveNoCommonBitsSet(N0, N1))
|
VT.isInteger() && DAG.haveNoCommonBitsSet(N0, N1))
|
||||||
return DAG.getNode(ISD::OR, SDLoc(N), VT, N0, N1);
|
return DAG.getNode(ISD::OR, DL, VT, N0, N1);
|
||||||
|
|
||||||
// fold (add x, shl(0 - y, n)) -> sub(x, shl(y, n))
|
// fold (add x, shl(0 - y, n)) -> sub(x, shl(y, n))
|
||||||
if (N1.getOpcode() == ISD::SHL && N1.getOperand(0).getOpcode() == ISD::SUB &&
|
if (N1.getOpcode() == ISD::SHL && N1.getOperand(0).getOpcode() == ISD::SUB &&
|
||||||
isNullConstantOrNullSplatConstant(N1.getOperand(0).getOperand(0)))
|
isNullConstantOrNullSplatConstant(N1.getOperand(0).getOperand(0)))
|
||||||
return DAG.getNode(ISD::SUB, SDLoc(N), VT, N0,
|
return DAG.getNode(ISD::SUB, DL, VT, N0,
|
||||||
DAG.getNode(ISD::SHL, SDLoc(N), VT,
|
DAG.getNode(ISD::SHL, DL, VT,
|
||||||
N1.getOperand(0).getOperand(1),
|
N1.getOperand(0).getOperand(1),
|
||||||
N1.getOperand(1)));
|
N1.getOperand(1)));
|
||||||
if (N0.getOpcode() == ISD::SHL && N0.getOperand(0).getOpcode() == ISD::SUB &&
|
if (N0.getOpcode() == ISD::SHL && N0.getOperand(0).getOpcode() == ISD::SUB &&
|
||||||
isNullConstantOrNullSplatConstant(N0.getOperand(0).getOperand(0)))
|
isNullConstantOrNullSplatConstant(N0.getOperand(0).getOperand(0)))
|
||||||
return DAG.getNode(ISD::SUB, SDLoc(N), VT, N1,
|
return DAG.getNode(ISD::SUB, DL, VT, N1,
|
||||||
DAG.getNode(ISD::SHL, SDLoc(N), VT,
|
DAG.getNode(ISD::SHL, DL, VT,
|
||||||
N0.getOperand(0).getOperand(1),
|
N0.getOperand(0).getOperand(1),
|
||||||
N0.getOperand(1)));
|
N0.getOperand(1)));
|
||||||
|
|
||||||
@ -1811,17 +1822,14 @@ SDValue DAGCombiner::visitADD(SDNode *N) {
|
|||||||
// (add z, (and (sbbl x, x), 1)) -> (sub z, (sbbl x, x))
|
// (add z, (and (sbbl x, x), 1)) -> (sub z, (sbbl x, x))
|
||||||
// and similar xforms where the inner op is either ~0 or 0.
|
// and similar xforms where the inner op is either ~0 or 0.
|
||||||
if (NumSignBits == DestBits &&
|
if (NumSignBits == DestBits &&
|
||||||
isOneConstantOrOneSplatConstant(N1->getOperand(1))) {
|
isOneConstantOrOneSplatConstant(N1->getOperand(1)))
|
||||||
SDLoc DL(N);
|
|
||||||
return DAG.getNode(ISD::SUB, DL, VT, N->getOperand(0), AndOp0);
|
return DAG.getNode(ISD::SUB, DL, VT, N->getOperand(0), AndOp0);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// add (sext i1), X -> sub X, (zext i1)
|
// add (sext i1), X -> sub X, (zext i1)
|
||||||
if (N0.getOpcode() == ISD::SIGN_EXTEND &&
|
if (N0.getOpcode() == ISD::SIGN_EXTEND &&
|
||||||
N0.getOperand(0).getValueType() == MVT::i1 &&
|
N0.getOperand(0).getValueType() == MVT::i1 &&
|
||||||
!TLI.isOperationLegal(ISD::SIGN_EXTEND, MVT::i1)) {
|
!TLI.isOperationLegal(ISD::SIGN_EXTEND, MVT::i1)) {
|
||||||
SDLoc DL(N);
|
|
||||||
SDValue ZExt = DAG.getNode(ISD::ZERO_EXTEND, DL, VT, N0.getOperand(0));
|
SDValue ZExt = DAG.getNode(ISD::ZERO_EXTEND, DL, VT, N0.getOperand(0));
|
||||||
return DAG.getNode(ISD::SUB, DL, VT, N1, ZExt);
|
return DAG.getNode(ISD::SUB, DL, VT, N1, ZExt);
|
||||||
}
|
}
|
||||||
@ -1830,7 +1838,6 @@ SDValue DAGCombiner::visitADD(SDNode *N) {
|
|||||||
if (N1.getOpcode() == ISD::SIGN_EXTEND_INREG) {
|
if (N1.getOpcode() == ISD::SIGN_EXTEND_INREG) {
|
||||||
VTSDNode *TN = cast<VTSDNode>(N1.getOperand(1));
|
VTSDNode *TN = cast<VTSDNode>(N1.getOperand(1));
|
||||||
if (TN->getVT() == MVT::i1) {
|
if (TN->getVT() == MVT::i1) {
|
||||||
SDLoc DL(N);
|
|
||||||
SDValue ZExt = DAG.getNode(ISD::AND, DL, VT, N1.getOperand(0),
|
SDValue ZExt = DAG.getNode(ISD::AND, DL, VT, N1.getOperand(0),
|
||||||
DAG.getConstant(1, DL, VT));
|
DAG.getConstant(1, DL, VT));
|
||||||
return DAG.getNode(ISD::SUB, DL, VT, N0, ZExt);
|
return DAG.getNode(ISD::SUB, DL, VT, N0, ZExt);
|
||||||
|
Loading…
Reference in New Issue
Block a user