mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-03-07 11:59:09 +00:00
[SelectionDag] Updated FoldConstantArithmetic method signature in preparation for merge with FoldConstantVectorArithmetic
Updated FoldConstantArithmetic method signature to match that of FoldConstantVectorArithmetic in preparation for merging the two functions together https://bugs.llvm.org/show_bug.cgi?id=36544 This is the first step in combining the various FoldConstantVectorArithmetic and FoldConstantVectorArithmetic functions into one FoldConstantArithmetic function. Differential Revision: https://reviews.llvm.org/D72870
This commit is contained in:
parent
21a7c5eac7
commit
56d09f370d
@ -1476,7 +1476,7 @@ public:
|
||||
const SDNode *N2);
|
||||
|
||||
SDValue FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL, EVT VT,
|
||||
SDNode *N1, SDNode *N2);
|
||||
ArrayRef<SDValue> Ops);
|
||||
|
||||
SDValue FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL, EVT VT,
|
||||
const ConstantSDNode *C1,
|
||||
|
@ -964,10 +964,11 @@ SDValue DAGCombiner::reassociateOpsCommutative(unsigned Opc, const SDLoc &DL,
|
||||
if (N0->getFlags().hasVectorReduction())
|
||||
return SDValue();
|
||||
|
||||
if (SDNode *C1 = DAG.isConstantIntBuildVectorOrConstantInt(N0.getOperand(1))) {
|
||||
if (SDNode *C2 = DAG.isConstantIntBuildVectorOrConstantInt(N1)) {
|
||||
if (DAG.isConstantIntBuildVectorOrConstantInt(N0.getOperand(1))) {
|
||||
if (DAG.isConstantIntBuildVectorOrConstantInt(N1)) {
|
||||
// Reassociate: (op (op x, c1), c2) -> (op x, (op c1, c2))
|
||||
if (SDValue OpNode = DAG.FoldConstantArithmetic(Opc, DL, VT, C1, C2))
|
||||
if (SDValue OpNode =
|
||||
DAG.FoldConstantArithmetic(Opc, DL, VT, {N0.getOperand(1), N1}))
|
||||
return DAG.getNode(Opc, DL, VT, N0.getOperand(0), OpNode);
|
||||
return SDValue();
|
||||
}
|
||||
@ -2118,8 +2119,7 @@ SDValue DAGCombiner::visitADDLike(SDNode *N) {
|
||||
if (!DAG.isConstantIntBuildVectorOrConstantInt(N1))
|
||||
return DAG.getNode(ISD::ADD, DL, VT, N1, N0);
|
||||
// fold (add c1, c2) -> c1+c2
|
||||
return DAG.FoldConstantArithmetic(ISD::ADD, DL, VT, N0.getNode(),
|
||||
N1.getNode());
|
||||
return DAG.FoldConstantArithmetic(ISD::ADD, DL, VT, {N0, N1});
|
||||
}
|
||||
|
||||
// fold (add x, 0) -> x
|
||||
@ -2130,8 +2130,8 @@ SDValue DAGCombiner::visitADDLike(SDNode *N) {
|
||||
// fold ((A-c1)+c2) -> (A+(c2-c1))
|
||||
if (N0.getOpcode() == ISD::SUB &&
|
||||
isConstantOrConstantVector(N0.getOperand(1), /* NoOpaque */ true)) {
|
||||
SDValue Sub = DAG.FoldConstantArithmetic(ISD::SUB, DL, VT, N1.getNode(),
|
||||
N0.getOperand(1).getNode());
|
||||
SDValue Sub =
|
||||
DAG.FoldConstantArithmetic(ISD::SUB, DL, VT, {N1, N0.getOperand(1)});
|
||||
assert(Sub && "Constant folding failed");
|
||||
return DAG.getNode(ISD::ADD, DL, VT, N0.getOperand(0), Sub);
|
||||
}
|
||||
@ -2139,8 +2139,8 @@ SDValue DAGCombiner::visitADDLike(SDNode *N) {
|
||||
// fold ((c1-A)+c2) -> (c1+c2)-A
|
||||
if (N0.getOpcode() == ISD::SUB &&
|
||||
isConstantOrConstantVector(N0.getOperand(0), /* NoOpaque */ true)) {
|
||||
SDValue Add = DAG.FoldConstantArithmetic(ISD::ADD, DL, VT, N1.getNode(),
|
||||
N0.getOperand(0).getNode());
|
||||
SDValue Add =
|
||||
DAG.FoldConstantArithmetic(ISD::ADD, DL, VT, {N1, N0.getOperand(0)});
|
||||
assert(Add && "Constant folding failed");
|
||||
return DAG.getNode(ISD::SUB, DL, VT, Add, N0.getOperand(1));
|
||||
}
|
||||
@ -2356,8 +2356,7 @@ SDValue DAGCombiner::visitADDSAT(SDNode *N) {
|
||||
if (!DAG.isConstantIntBuildVectorOrConstantInt(N1))
|
||||
return DAG.getNode(Opcode, DL, VT, N1, N0);
|
||||
// fold (add_sat c1, c2) -> c3
|
||||
return DAG.FoldConstantArithmetic(Opcode, DL, VT, N0.getNode(),
|
||||
N1.getNode());
|
||||
return DAG.FoldConstantArithmetic(Opcode, DL, VT, {N0, N1});
|
||||
}
|
||||
|
||||
// fold (add_sat x, 0) -> x
|
||||
@ -2980,8 +2979,7 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
|
||||
if (DAG.isConstantIntBuildVectorOrConstantInt(N0) &&
|
||||
DAG.isConstantIntBuildVectorOrConstantInt(N1)) {
|
||||
// fold (sub c1, c2) -> c1-c2
|
||||
return DAG.FoldConstantArithmetic(ISD::SUB, DL, VT, N0.getNode(),
|
||||
N1.getNode());
|
||||
return DAG.FoldConstantArithmetic(ISD::SUB, DL, VT, {N0, N1});
|
||||
}
|
||||
|
||||
if (SDValue NewSel = foldBinOpIntoSelect(N))
|
||||
@ -3049,8 +3047,8 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
|
||||
if (N0.getOpcode() == ISD::ADD &&
|
||||
isConstantOrConstantVector(N1, /* NoOpaques */ true) &&
|
||||
isConstantOrConstantVector(N0.getOperand(1), /* NoOpaques */ true)) {
|
||||
SDValue NewC = DAG.FoldConstantArithmetic(
|
||||
ISD::SUB, DL, VT, N0.getOperand(1).getNode(), N1.getNode());
|
||||
SDValue NewC =
|
||||
DAG.FoldConstantArithmetic(ISD::SUB, DL, VT, {N0.getOperand(1), N1});
|
||||
assert(NewC && "Constant folding failed");
|
||||
return DAG.getNode(ISD::ADD, DL, VT, N0.getOperand(0), NewC);
|
||||
}
|
||||
@ -3060,8 +3058,7 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
|
||||
SDValue N11 = N1.getOperand(1);
|
||||
if (isConstantOrConstantVector(N0, /* NoOpaques */ true) &&
|
||||
isConstantOrConstantVector(N11, /* NoOpaques */ true)) {
|
||||
SDValue NewC = DAG.FoldConstantArithmetic(ISD::SUB, DL, VT, N0.getNode(),
|
||||
N11.getNode());
|
||||
SDValue NewC = DAG.FoldConstantArithmetic(ISD::SUB, DL, VT, {N0, N11});
|
||||
assert(NewC && "Constant folding failed");
|
||||
return DAG.getNode(ISD::SUB, DL, VT, NewC, N1.getOperand(0));
|
||||
}
|
||||
@ -3071,8 +3068,8 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
|
||||
if (N0.getOpcode() == ISD::SUB &&
|
||||
isConstantOrConstantVector(N1, /* NoOpaques */ true) &&
|
||||
isConstantOrConstantVector(N0.getOperand(1), /* NoOpaques */ true)) {
|
||||
SDValue NewC = DAG.FoldConstantArithmetic(
|
||||
ISD::ADD, DL, VT, N0.getOperand(1).getNode(), N1.getNode());
|
||||
SDValue NewC =
|
||||
DAG.FoldConstantArithmetic(ISD::ADD, DL, VT, {N0.getOperand(1), N1});
|
||||
assert(NewC && "Constant folding failed");
|
||||
return DAG.getNode(ISD::SUB, DL, VT, N0.getOperand(0), NewC);
|
||||
}
|
||||
@ -3081,8 +3078,8 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
|
||||
if (N0.getOpcode() == ISD::SUB &&
|
||||
isConstantOrConstantVector(N1, /* NoOpaques */ true) &&
|
||||
isConstantOrConstantVector(N0.getOperand(0), /* NoOpaques */ true)) {
|
||||
SDValue NewC = DAG.FoldConstantArithmetic(
|
||||
ISD::SUB, DL, VT, N0.getOperand(0).getNode(), N1.getNode());
|
||||
SDValue NewC =
|
||||
DAG.FoldConstantArithmetic(ISD::SUB, DL, VT, {N0.getOperand(0), N1});
|
||||
assert(NewC && "Constant folding failed");
|
||||
return DAG.getNode(ISD::SUB, DL, VT, NewC, N0.getOperand(1));
|
||||
}
|
||||
@ -3306,8 +3303,7 @@ SDValue DAGCombiner::visitSUBSAT(SDNode *N) {
|
||||
if (DAG.isConstantIntBuildVectorOrConstantInt(N0) &&
|
||||
DAG.isConstantIntBuildVectorOrConstantInt(N1)) {
|
||||
// fold (sub_sat c1, c2) -> c3
|
||||
return DAG.FoldConstantArithmetic(N->getOpcode(), DL, VT, N0.getNode(),
|
||||
N1.getNode());
|
||||
return DAG.FoldConstantArithmetic(N->getOpcode(), DL, VT, {N0, N1});
|
||||
}
|
||||
|
||||
// fold (sub_sat x, 0) -> x
|
||||
@ -3477,8 +3473,7 @@ SDValue DAGCombiner::visitMUL(SDNode *N) {
|
||||
|
||||
// fold (mul c1, c2) -> c1*c2
|
||||
if (N0IsConst && N1IsConst && !N0IsOpaqueConst && !N1IsOpaqueConst)
|
||||
return DAG.FoldConstantArithmetic(ISD::MUL, SDLoc(N), VT,
|
||||
N0.getNode(), N1.getNode());
|
||||
return DAG.FoldConstantArithmetic(ISD::MUL, SDLoc(N), VT, {N0, N1});
|
||||
|
||||
// canonicalize constant to RHS (vector doesn't have to splat)
|
||||
if (DAG.isConstantIntBuildVectorOrConstantInt(N0) &&
|
||||
@ -5929,8 +5924,8 @@ SDValue DAGCombiner::visitOR(SDNode *N) {
|
||||
};
|
||||
if (N0.getOpcode() == ISD::AND && N0.getNode()->hasOneUse() &&
|
||||
ISD::matchBinaryPredicate(N0.getOperand(1), N1, MatchIntersect, true)) {
|
||||
if (SDValue COR = DAG.FoldConstantArithmetic(
|
||||
ISD::OR, SDLoc(N1), VT, N1.getNode(), N0.getOperand(1).getNode())) {
|
||||
if (SDValue COR = DAG.FoldConstantArithmetic(ISD::OR, SDLoc(N1), VT,
|
||||
{N1, N0.getOperand(1)})) {
|
||||
SDValue IOR = DAG.getNode(ISD::OR, SDLoc(N0), VT, N0.getOperand(0), N1);
|
||||
AddToWorklist(IOR.getNode());
|
||||
return DAG.getNode(ISD::AND, SDLoc(N), VT, COR, IOR);
|
||||
@ -7459,12 +7454,11 @@ SDValue DAGCombiner::visitRotate(SDNode *N) {
|
||||
EVT ShiftVT = C1->getValueType(0);
|
||||
bool SameSide = (N->getOpcode() == NextOp);
|
||||
unsigned CombineOp = SameSide ? ISD::ADD : ISD::SUB;
|
||||
if (SDValue CombinedShift =
|
||||
DAG.FoldConstantArithmetic(CombineOp, dl, ShiftVT, C1, C2)) {
|
||||
if (SDValue CombinedShift = DAG.FoldConstantArithmetic(
|
||||
CombineOp, dl, ShiftVT, {N1, N0.getOperand(1)})) {
|
||||
SDValue BitsizeC = DAG.getConstant(Bitsize, dl, ShiftVT);
|
||||
SDValue CombinedShiftNorm = DAG.FoldConstantArithmetic(
|
||||
ISD::SREM, dl, ShiftVT, CombinedShift.getNode(),
|
||||
BitsizeC.getNode());
|
||||
ISD::SREM, dl, ShiftVT, {CombinedShift, BitsizeC});
|
||||
return DAG.getNode(N->getOpcode(), dl, VT, N0->getOperand(0),
|
||||
CombinedShiftNorm);
|
||||
}
|
||||
@ -7500,8 +7494,8 @@ SDValue DAGCombiner::visitSHL(SDNode *N) {
|
||||
if (N01CV && N01CV->isConstant() && N00.getOpcode() == ISD::SETCC &&
|
||||
TLI.getBooleanContents(N00.getOperand(0).getValueType()) ==
|
||||
TargetLowering::ZeroOrNegativeOneBooleanContent) {
|
||||
if (SDValue C = DAG.FoldConstantArithmetic(ISD::SHL, SDLoc(N), VT,
|
||||
N01CV, N1CV))
|
||||
if (SDValue C =
|
||||
DAG.FoldConstantArithmetic(ISD::SHL, SDLoc(N), VT, {N01, N1}))
|
||||
return DAG.getNode(ISD::AND, SDLoc(N), VT, N00, C);
|
||||
}
|
||||
}
|
||||
|
@ -4868,16 +4868,25 @@ bool SelectionDAG::isUndef(unsigned Opcode, ArrayRef<SDValue> Ops) {
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL,
|
||||
EVT VT, SDNode *N1, SDNode *N2) {
|
||||
EVT VT, ArrayRef<SDValue> Ops) {
|
||||
// If the opcode is a target-specific ISD node, there's nothing we can
|
||||
// do here and the operand rules may not line up with the below, so
|
||||
// bail early.
|
||||
if (Opcode >= ISD::BUILTIN_OP_END)
|
||||
return SDValue();
|
||||
|
||||
if (isUndef(Opcode, {SDValue(N1, 0), SDValue(N2, 0)}))
|
||||
// For now, the array Ops should only contain two values.
|
||||
// This enforcement will be removed once this function is merged with
|
||||
// FoldConstantVectorArithmetic
|
||||
if (Ops.size() != 2)
|
||||
return SDValue();
|
||||
|
||||
if (isUndef(Opcode, Ops))
|
||||
return getUNDEF(VT);
|
||||
|
||||
SDNode *N1 = Ops[0].getNode();
|
||||
SDNode *N2 = Ops[1].getNode();
|
||||
|
||||
// Handle the case of two scalars.
|
||||
if (auto *C1 = dyn_cast<ConstantSDNode>(N1)) {
|
||||
if (auto *C2 = dyn_cast<ConstantSDNode>(N2)) {
|
||||
@ -5449,8 +5458,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
|
||||
}
|
||||
|
||||
// Perform trivial constant folding.
|
||||
if (SDValue SV =
|
||||
FoldConstantArithmetic(Opcode, DL, VT, N1.getNode(), N2.getNode()))
|
||||
if (SDValue SV = FoldConstantArithmetic(Opcode, DL, VT, {N1, N2}))
|
||||
return SV;
|
||||
|
||||
if (SDValue V = foldConstantFPMath(Opcode, DL, VT, N1, N2))
|
||||
|
@ -253,7 +253,7 @@ bool MipsDAGToDAGISel::selectVecAddAsVecSubIfProfitable(SDNode *Node) {
|
||||
SDLoc DL(Node);
|
||||
|
||||
SDValue NegC = CurDAG->FoldConstantArithmetic(
|
||||
ISD::SUB, DL, VT, CurDAG->getConstant(0, DL, VT).getNode(), C.getNode());
|
||||
ISD::SUB, DL, VT, {CurDAG->getConstant(0, DL, VT), C});
|
||||
assert(NegC && "Constant-folding failed!");
|
||||
SDValue NewNode = CurDAG->getNode(ISD::SUB, DL, VT, X, NegC);
|
||||
|
||||
|
@ -5547,8 +5547,7 @@ void PPCDAGToDAGISel::foldBoolExts(SDValue &Res, SDNode *&N) {
|
||||
SDValue O1 = UserO1.getNode() == N ? Val : UserO1;
|
||||
|
||||
return CurDAG->FoldConstantArithmetic(User->getOpcode(), dl,
|
||||
User->getValueType(0),
|
||||
O0.getNode(), O1.getNode());
|
||||
User->getValueType(0), {O0, O1});
|
||||
};
|
||||
|
||||
// FIXME: When the semantics of the interaction between select and undef
|
||||
|
Loading…
x
Reference in New Issue
Block a user