mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
[SelectionDAG] Pass std::vector by reference instead of by pointer to BuildSDIV/BuildUDIV.
This removes the need for an assert to ensure the pointer isn't null. Years ago we had ifs the checked the pointer was non-null before very access to the vector. These checks were removed and replaced with a single assert. But a reference seems more suitable here. llvm-svn: 338205
This commit is contained in:
parent
b7fed4a144
commit
9a196e4580
@ -3490,10 +3490,10 @@ public:
|
||||
//
|
||||
SDValue BuildSDIV(SDNode *N, const APInt &Divisor, SelectionDAG &DAG,
|
||||
bool IsAfterLegalization,
|
||||
std::vector<SDNode *> *Created) const;
|
||||
std::vector<SDNode *> &Created) const;
|
||||
SDValue BuildUDIV(SDNode *N, const APInt &Divisor, SelectionDAG &DAG,
|
||||
bool IsAfterLegalization,
|
||||
std::vector<SDNode *> *Created) const;
|
||||
std::vector<SDNode *> &Created) const;
|
||||
|
||||
/// Targets may override this function to provide custom SDIV lowering for
|
||||
/// power-of-2 denominators. If the target returns an empty SDValue, LLVM
|
||||
|
@ -17921,7 +17921,7 @@ SDValue DAGCombiner::BuildSDIV(SDNode *N) {
|
||||
|
||||
std::vector<SDNode *> Built;
|
||||
SDValue S =
|
||||
TLI.BuildSDIV(N, C->getAPIntValue(), DAG, LegalOperations, &Built);
|
||||
TLI.BuildSDIV(N, C->getAPIntValue(), DAG, LegalOperations, Built);
|
||||
|
||||
for (SDNode *N : Built)
|
||||
AddToWorklist(N);
|
||||
@ -17967,7 +17967,7 @@ SDValue DAGCombiner::BuildUDIV(SDNode *N) {
|
||||
|
||||
std::vector<SDNode *> Built;
|
||||
SDValue S =
|
||||
TLI.BuildUDIV(N, C->getAPIntValue(), DAG, LegalOperations, &Built);
|
||||
TLI.BuildUDIV(N, C->getAPIntValue(), DAG, LegalOperations, Built);
|
||||
|
||||
for (SDNode *N : Built)
|
||||
AddToWorklist(N);
|
||||
|
@ -3465,9 +3465,7 @@ SDValue TargetLowering::BuildSDIVPow2(SDNode *N, const APInt &Divisor,
|
||||
/// Ref: "Hacker's Delight" or "The PowerPC Compiler Writer's Guide".
|
||||
SDValue TargetLowering::BuildSDIV(SDNode *N, const APInt &Divisor,
|
||||
SelectionDAG &DAG, bool IsAfterLegalization,
|
||||
std::vector<SDNode *> *Created) const {
|
||||
assert(Created && "No vector to hold sdiv ops.");
|
||||
|
||||
std::vector<SDNode *> &Created) const {
|
||||
EVT VT = N->getValueType(0);
|
||||
SDLoc dl(N);
|
||||
|
||||
@ -3478,7 +3476,7 @@ SDValue TargetLowering::BuildSDIV(SDNode *N, const APInt &Divisor,
|
||||
|
||||
// If the sdiv has an 'exact' bit we can use a simpler lowering.
|
||||
if (N->getFlags().hasExact())
|
||||
return BuildExactSDIV(*this, N->getOperand(0), Divisor, dl, DAG, *Created);
|
||||
return BuildExactSDIV(*this, N->getOperand(0), Divisor, dl, DAG, Created);
|
||||
|
||||
APInt::ms magics = Divisor.magic();
|
||||
|
||||
@ -3499,12 +3497,12 @@ SDValue TargetLowering::BuildSDIV(SDNode *N, const APInt &Divisor,
|
||||
// If d > 0 and m < 0, add the numerator
|
||||
if (Divisor.isStrictlyPositive() && magics.m.isNegative()) {
|
||||
Q = DAG.getNode(ISD::ADD, dl, VT, Q, N->getOperand(0));
|
||||
Created->push_back(Q.getNode());
|
||||
Created.push_back(Q.getNode());
|
||||
}
|
||||
// If d < 0 and m > 0, subtract the numerator.
|
||||
if (Divisor.isNegative() && magics.m.isStrictlyPositive()) {
|
||||
Q = DAG.getNode(ISD::SUB, dl, VT, Q, N->getOperand(0));
|
||||
Created->push_back(Q.getNode());
|
||||
Created.push_back(Q.getNode());
|
||||
}
|
||||
auto &DL = DAG.getDataLayout();
|
||||
// Shift right algebraic if shift value is nonzero
|
||||
@ -3512,14 +3510,14 @@ SDValue TargetLowering::BuildSDIV(SDNode *N, const APInt &Divisor,
|
||||
Q = DAG.getNode(
|
||||
ISD::SRA, dl, VT, Q,
|
||||
DAG.getConstant(magics.s, dl, getShiftAmountTy(Q.getValueType(), DL)));
|
||||
Created->push_back(Q.getNode());
|
||||
Created.push_back(Q.getNode());
|
||||
}
|
||||
// Extract the sign bit and add it to the quotient
|
||||
SDValue T =
|
||||
DAG.getNode(ISD::SRL, dl, VT, Q,
|
||||
DAG.getConstant(VT.getScalarSizeInBits() - 1, dl,
|
||||
getShiftAmountTy(Q.getValueType(), DL)));
|
||||
Created->push_back(T.getNode());
|
||||
Created.push_back(T.getNode());
|
||||
return DAG.getNode(ISD::ADD, dl, VT, Q, T);
|
||||
}
|
||||
|
||||
@ -3529,9 +3527,7 @@ SDValue TargetLowering::BuildSDIV(SDNode *N, const APInt &Divisor,
|
||||
/// Ref: "Hacker's Delight" or "The PowerPC Compiler Writer's Guide".
|
||||
SDValue TargetLowering::BuildUDIV(SDNode *N, const APInt &Divisor,
|
||||
SelectionDAG &DAG, bool IsAfterLegalization,
|
||||
std::vector<SDNode *> *Created) const {
|
||||
assert(Created && "No vector to hold udiv ops.");
|
||||
|
||||
std::vector<SDNode *> &Created) const {
|
||||
EVT VT = N->getValueType(0);
|
||||
SDLoc dl(N);
|
||||
auto &DL = DAG.getDataLayout();
|
||||
@ -3554,7 +3550,7 @@ SDValue TargetLowering::BuildUDIV(SDNode *N, const APInt &Divisor,
|
||||
Q = DAG.getNode(
|
||||
ISD::SRL, dl, VT, Q,
|
||||
DAG.getConstant(Shift, dl, getShiftAmountTy(Q.getValueType(), DL)));
|
||||
Created->push_back(Q.getNode());
|
||||
Created.push_back(Q.getNode());
|
||||
|
||||
// Get magic number for the shifted divisor.
|
||||
magics = Divisor.lshr(Shift).magicu(Shift);
|
||||
@ -3573,7 +3569,7 @@ SDValue TargetLowering::BuildUDIV(SDNode *N, const APInt &Divisor,
|
||||
else
|
||||
return SDValue(); // No mulhu or equivalent
|
||||
|
||||
Created->push_back(Q.getNode());
|
||||
Created.push_back(Q.getNode());
|
||||
|
||||
if (magics.a == 0) {
|
||||
assert(magics.s < Divisor.getBitWidth() &&
|
||||
@ -3583,13 +3579,13 @@ SDValue TargetLowering::BuildUDIV(SDNode *N, const APInt &Divisor,
|
||||
DAG.getConstant(magics.s, dl, getShiftAmountTy(Q.getValueType(), DL)));
|
||||
} else {
|
||||
SDValue NPQ = DAG.getNode(ISD::SUB, dl, VT, N->getOperand(0), Q);
|
||||
Created->push_back(NPQ.getNode());
|
||||
Created.push_back(NPQ.getNode());
|
||||
NPQ = DAG.getNode(
|
||||
ISD::SRL, dl, VT, NPQ,
|
||||
DAG.getConstant(1, dl, getShiftAmountTy(NPQ.getValueType(), DL)));
|
||||
Created->push_back(NPQ.getNode());
|
||||
Created.push_back(NPQ.getNode());
|
||||
NPQ = DAG.getNode(ISD::ADD, dl, VT, NPQ, Q);
|
||||
Created->push_back(NPQ.getNode());
|
||||
Created.push_back(NPQ.getNode());
|
||||
return DAG.getNode(
|
||||
ISD::SRL, dl, VT, NPQ,
|
||||
DAG.getConstant(magics.s - 1, dl,
|
||||
|
Loading…
Reference in New Issue
Block a user