forked from OSchip/llvm-project
A doccomment for CombineTo, and some NFC refactorings
Summary: Caching SDLoc(N), instead of recreating it in every single function call, keeps the code denser, and allows to unwrap long lines. Reviewers: sunfish, atrick, sdmitrouk Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D13726 llvm-svn: 250305
This commit is contained in:
parent
87f4772985
commit
4bca0bb010
|
@ -156,13 +156,16 @@ namespace {
|
|||
void deleteAndRecombine(SDNode *N);
|
||||
bool recursivelyDeleteUnusedNodes(SDNode *N);
|
||||
|
||||
/// Replaces all uses of the results of one DAG node with new values.
|
||||
SDValue CombineTo(SDNode *N, const SDValue *To, unsigned NumTo,
|
||||
bool AddTo = true);
|
||||
|
||||
/// Replaces all uses of the results of one DAG node with new values.
|
||||
SDValue CombineTo(SDNode *N, SDValue Res, bool AddTo = true) {
|
||||
return CombineTo(N, &Res, 1, AddTo);
|
||||
}
|
||||
|
||||
/// Replaces all uses of the results of one DAG node with new values.
|
||||
SDValue CombineTo(SDNode *N, SDValue Res0, SDValue Res1,
|
||||
bool AddTo = true) {
|
||||
SDValue To[] = { Res0, Res1 };
|
||||
|
@ -1985,31 +1988,26 @@ SDValue DAGCombiner::visitSUBC(SDNode *N) {
|
|||
SDValue N0 = N->getOperand(0);
|
||||
SDValue N1 = N->getOperand(1);
|
||||
EVT VT = N0.getValueType();
|
||||
SDLoc DL(N);
|
||||
|
||||
// If the flag result is dead, turn this into an SUB.
|
||||
if (!N->hasAnyUseOfValue(1))
|
||||
return CombineTo(N, DAG.getNode(ISD::SUB, SDLoc(N), VT, N0, N1),
|
||||
DAG.getNode(ISD::CARRY_FALSE, SDLoc(N),
|
||||
MVT::Glue));
|
||||
return CombineTo(N, DAG.getNode(ISD::SUB, DL, VT, N0, N1),
|
||||
DAG.getNode(ISD::CARRY_FALSE, DL, MVT::Glue));
|
||||
|
||||
// fold (subc x, x) -> 0 + no borrow
|
||||
if (N0 == N1) {
|
||||
SDLoc DL(N);
|
||||
if (N0 == N1)
|
||||
return CombineTo(N, DAG.getConstant(0, DL, VT),
|
||||
DAG.getNode(ISD::CARRY_FALSE, DL,
|
||||
MVT::Glue));
|
||||
}
|
||||
DAG.getNode(ISD::CARRY_FALSE, DL, MVT::Glue));
|
||||
|
||||
// fold (subc x, 0) -> x + no borrow
|
||||
if (isNullConstant(N1))
|
||||
return CombineTo(N, N0, DAG.getNode(ISD::CARRY_FALSE, SDLoc(N),
|
||||
MVT::Glue));
|
||||
return CombineTo(N, N0, DAG.getNode(ISD::CARRY_FALSE, DL, MVT::Glue));
|
||||
|
||||
// Canonicalize (sub -1, x) -> ~x, i.e. (xor x, -1) + no borrow
|
||||
if (isAllOnesConstant(N0))
|
||||
return CombineTo(N, DAG.getNode(ISD::XOR, SDLoc(N), VT, N1, N0),
|
||||
DAG.getNode(ISD::CARRY_FALSE, SDLoc(N),
|
||||
MVT::Glue));
|
||||
return CombineTo(N, DAG.getNode(ISD::XOR, DL, VT, N1, N0),
|
||||
DAG.getNode(ISD::CARRY_FALSE, DL, MVT::Glue));
|
||||
|
||||
return SDValue();
|
||||
}
|
||||
|
@ -2170,26 +2168,26 @@ SDValue DAGCombiner::visitSDIV(SDNode *N) {
|
|||
if (SDValue FoldedVOp = SimplifyVBinOp(N))
|
||||
return FoldedVOp;
|
||||
|
||||
SDLoc DL(N);
|
||||
|
||||
// fold (sdiv c1, c2) -> c1/c2
|
||||
ConstantSDNode *N0C = isConstOrConstSplat(N0);
|
||||
ConstantSDNode *N1C = isConstOrConstSplat(N1);
|
||||
if (N0C && N1C && !N0C->isOpaque() && !N1C->isOpaque())
|
||||
return DAG.FoldConstantArithmetic(ISD::SDIV, SDLoc(N), VT, N0C, N1C);
|
||||
return DAG.FoldConstantArithmetic(ISD::SDIV, DL, VT, N0C, N1C);
|
||||
// fold (sdiv X, 1) -> X
|
||||
if (N1C && N1C->isOne())
|
||||
return N0;
|
||||
// fold (sdiv X, -1) -> 0-X
|
||||
if (N1C && N1C->isAllOnesValue()) {
|
||||
SDLoc DL(N);
|
||||
if (N1C && N1C->isAllOnesValue())
|
||||
return DAG.getNode(ISD::SUB, DL, VT,
|
||||
DAG.getConstant(0, DL, VT), N0);
|
||||
}
|
||||
|
||||
// If we know the sign bits of both operands are zero, strength reduce to a
|
||||
// udiv instead. Handles (X&15) /s 4 -> X&15 >> 2
|
||||
if (!VT.isVector()) {
|
||||
if (DAG.SignBitIsZero(N1) && DAG.SignBitIsZero(N0))
|
||||
return DAG.getNode(ISD::UDIV, SDLoc(N), N1.getValueType(),
|
||||
N0, N1);
|
||||
return DAG.getNode(ISD::UDIV, DL, N1.getValueType(), N0, N1);
|
||||
}
|
||||
|
||||
// fold (sdiv X, pow2) -> simple ops after legalize
|
||||
|
@ -2205,7 +2203,6 @@ SDValue DAGCombiner::visitSDIV(SDNode *N) {
|
|||
return Res;
|
||||
|
||||
unsigned lg2 = N1C->getAPIntValue().countTrailingZeros();
|
||||
SDLoc DL(N);
|
||||
|
||||
// Splat the sign bit into the register
|
||||
SDValue SGN =
|
||||
|
@ -2245,7 +2242,7 @@ SDValue DAGCombiner::visitSDIV(SDNode *N) {
|
|||
|
||||
// undef / X -> 0
|
||||
if (N0.getOpcode() == ISD::UNDEF)
|
||||
return DAG.getConstant(0, SDLoc(N), VT);
|
||||
return DAG.getConstant(0, DL, VT);
|
||||
// X / undef -> undef
|
||||
if (N1.getOpcode() == ISD::UNDEF)
|
||||
return N1;
|
||||
|
@ -2263,26 +2260,26 @@ SDValue DAGCombiner::visitUDIV(SDNode *N) {
|
|||
if (SDValue FoldedVOp = SimplifyVBinOp(N))
|
||||
return FoldedVOp;
|
||||
|
||||
SDLoc DL(N);
|
||||
|
||||
// fold (udiv c1, c2) -> c1/c2
|
||||
ConstantSDNode *N0C = isConstOrConstSplat(N0);
|
||||
ConstantSDNode *N1C = isConstOrConstSplat(N1);
|
||||
if (N0C && N1C)
|
||||
if (SDValue Folded = DAG.FoldConstantArithmetic(ISD::UDIV, SDLoc(N), VT,
|
||||
if (SDValue Folded = DAG.FoldConstantArithmetic(ISD::UDIV, DL, VT,
|
||||
N0C, N1C))
|
||||
return Folded;
|
||||
// fold (udiv x, (1 << c)) -> x >>u c
|
||||
if (N1C && !N1C->isOpaque() && N1C->getAPIntValue().isPowerOf2()) {
|
||||
SDLoc DL(N);
|
||||
if (N1C && !N1C->isOpaque() && N1C->getAPIntValue().isPowerOf2())
|
||||
return DAG.getNode(ISD::SRL, DL, VT, N0,
|
||||
DAG.getConstant(N1C->getAPIntValue().logBase2(), DL,
|
||||
getShiftAmountTy(N0.getValueType())));
|
||||
}
|
||||
|
||||
// fold (udiv x, (shl c, y)) -> x >>u (log2(c)+y) iff c is power of 2
|
||||
if (N1.getOpcode() == ISD::SHL) {
|
||||
if (ConstantSDNode *SHC = getAsNonOpaqueConstant(N1.getOperand(0))) {
|
||||
if (SHC->getAPIntValue().isPowerOf2()) {
|
||||
EVT ADDVT = N1.getOperand(1).getValueType();
|
||||
SDLoc DL(N);
|
||||
SDValue Add = DAG.getNode(ISD::ADD, DL, ADDVT,
|
||||
N1.getOperand(1),
|
||||
DAG.getConstant(SHC->getAPIntValue()
|
||||
|
@ -2302,7 +2299,7 @@ SDValue DAGCombiner::visitUDIV(SDNode *N) {
|
|||
|
||||
// undef / X -> 0
|
||||
if (N0.getOpcode() == ISD::UNDEF)
|
||||
return DAG.getConstant(0, SDLoc(N), VT);
|
||||
return DAG.getConstant(0, DL, VT);
|
||||
// X / undef -> undef
|
||||
if (N1.getOpcode() == ISD::UNDEF)
|
||||
return N1;
|
||||
|
@ -2316,27 +2313,27 @@ SDValue DAGCombiner::visitREM(SDNode *N) {
|
|||
SDValue N0 = N->getOperand(0);
|
||||
SDValue N1 = N->getOperand(1);
|
||||
EVT VT = N->getValueType(0);
|
||||
bool isSigned = (Opcode == ISD::SREM);
|
||||
SDLoc DL(N);
|
||||
|
||||
// fold (rem c1, c2) -> c1%c2
|
||||
ConstantSDNode *N0C = isConstOrConstSplat(N0);
|
||||
ConstantSDNode *N1C = isConstOrConstSplat(N1);
|
||||
if (N0C && N1C)
|
||||
if (SDValue Folded = DAG.FoldConstantArithmetic(Opcode, SDLoc(N), VT,
|
||||
N0C, N1C))
|
||||
if (SDValue Folded = DAG.FoldConstantArithmetic(Opcode, DL, VT, N0C, N1C))
|
||||
return Folded;
|
||||
|
||||
if (Opcode == ISD::SREM) {
|
||||
if (isSigned) {
|
||||
// If we know the sign bits of both operands are zero, strength reduce to a
|
||||
// urem instead. Handles (X & 0x0FFFFFFF) %s 16 -> X&15
|
||||
if (!VT.isVector()) {
|
||||
if (DAG.SignBitIsZero(N1) && DAG.SignBitIsZero(N0))
|
||||
return DAG.getNode(ISD::UREM, SDLoc(N), VT, N0, N1);
|
||||
return DAG.getNode(ISD::UREM, DL, VT, N0, N1);
|
||||
}
|
||||
} else {
|
||||
// fold (urem x, pow2) -> (and x, pow2-1)
|
||||
if (N1C && !N1C->isNullValue() && !N1C->isOpaque() &&
|
||||
N1C->getAPIntValue().isPowerOf2()) {
|
||||
SDLoc DL(N);
|
||||
return DAG.getNode(ISD::AND, DL, VT, N0,
|
||||
DAG.getConstant(N1C->getAPIntValue() - 1, DL, VT));
|
||||
}
|
||||
|
@ -2344,7 +2341,6 @@ SDValue DAGCombiner::visitREM(SDNode *N) {
|
|||
if (N1.getOpcode() == ISD::SHL) {
|
||||
if (ConstantSDNode *SHC = getAsNonOpaqueConstant(N1.getOperand(0))) {
|
||||
if (SHC->getAPIntValue().isPowerOf2()) {
|
||||
SDLoc DL(N);
|
||||
SDValue Add =
|
||||
DAG.getNode(ISD::ADD, DL, VT, N1,
|
||||
DAG.getConstant(APInt::getAllOnesValue(VT.getSizeInBits()), DL,
|
||||
|
@ -2359,14 +2355,13 @@ SDValue DAGCombiner::visitREM(SDNode *N) {
|
|||
// If X/C can be simplified by the division-by-constant logic, lower
|
||||
// X%C to the equivalent of X-X/C*C.
|
||||
if (N1C && !N1C->isNullValue()) {
|
||||
unsigned DivOpcode = (Opcode == ISD::SREM ? ISD::SDIV : ISD::UDIV);
|
||||
SDValue Div = DAG.getNode(DivOpcode, SDLoc(N), VT, N0, N1);
|
||||
unsigned DivOpcode = isSigned ? ISD::SDIV : ISD::UDIV;
|
||||
SDValue Div = DAG.getNode(DivOpcode, DL, VT, N0, N1);
|
||||
AddToWorklist(Div.getNode());
|
||||
SDValue OptimizedDiv = combine(Div.getNode());
|
||||
if (OptimizedDiv.getNode() && OptimizedDiv.getNode() != Div.getNode()) {
|
||||
SDValue Mul = DAG.getNode(ISD::MUL, SDLoc(N), VT,
|
||||
OptimizedDiv, N1);
|
||||
SDValue Sub = DAG.getNode(ISD::SUB, SDLoc(N), VT, N0, Mul);
|
||||
SDValue Mul = DAG.getNode(ISD::MUL, DL, VT, OptimizedDiv, N1);
|
||||
SDValue Sub = DAG.getNode(ISD::SUB, DL, VT, N0, Mul);
|
||||
AddToWorklist(Mul.getNode());
|
||||
return Sub;
|
||||
}
|
||||
|
@ -2374,7 +2369,7 @@ SDValue DAGCombiner::visitREM(SDNode *N) {
|
|||
|
||||
// undef % X -> 0
|
||||
if (N0.getOpcode() == ISD::UNDEF)
|
||||
return DAG.getConstant(0, SDLoc(N), VT);
|
||||
return DAG.getConstant(0, DL, VT);
|
||||
// X % undef -> undef
|
||||
if (N1.getOpcode() == ISD::UNDEF)
|
||||
return N1;
|
||||
|
|
Loading…
Reference in New Issue