mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-05 03:36:43 +00:00
Don't introduce custom nodes after legalization in TargetLowering::BuildSDIV()
and TargetLowering::BuildUDIV(). Fixes PR11283 llvm-svn: 143964
This commit is contained in:
parent
fddc6980b7
commit
87ed868306
@ -1595,9 +1595,9 @@ public:
|
||||
//
|
||||
SDValue BuildExactSDIV(SDValue Op1, SDValue Op2, DebugLoc dl,
|
||||
SelectionDAG &DAG) const;
|
||||
SDValue BuildSDIV(SDNode *N, SelectionDAG &DAG,
|
||||
SDValue BuildSDIV(SDNode *N, SelectionDAG &DAG, bool IsAfterLegalization,
|
||||
std::vector<SDNode*>* Created) const;
|
||||
SDValue BuildUDIV(SDNode *N, SelectionDAG &DAG,
|
||||
SDValue BuildUDIV(SDNode *N, SelectionDAG &DAG, bool IsAfterLegalization,
|
||||
std::vector<SDNode*>* Created) const;
|
||||
|
||||
|
||||
|
@ -7822,7 +7822,7 @@ SDValue DAGCombiner::SimplifySetCC(EVT VT, SDValue N0,
|
||||
/// <http://the.wall.riscom.net/books/proc/ppc/cwg/code2.html>
|
||||
SDValue DAGCombiner::BuildSDIV(SDNode *N) {
|
||||
std::vector<SDNode*> Built;
|
||||
SDValue S = TLI.BuildSDIV(N, DAG, &Built);
|
||||
SDValue S = TLI.BuildSDIV(N, DAG, LegalOperations, &Built);
|
||||
|
||||
for (std::vector<SDNode*>::iterator ii = Built.begin(), ee = Built.end();
|
||||
ii != ee; ++ii)
|
||||
@ -7836,7 +7836,7 @@ SDValue DAGCombiner::BuildSDIV(SDNode *N) {
|
||||
/// <http://the.wall.riscom.net/books/proc/ppc/cwg/code2.html>
|
||||
SDValue DAGCombiner::BuildUDIV(SDNode *N) {
|
||||
std::vector<SDNode*> Built;
|
||||
SDValue S = TLI.BuildUDIV(N, DAG, &Built);
|
||||
SDValue S = TLI.BuildUDIV(N, DAG, LegalOperations, &Built);
|
||||
|
||||
for (std::vector<SDNode*>::iterator ii = Built.begin(), ee = Built.end();
|
||||
ii != ee; ++ii)
|
||||
|
@ -3242,8 +3242,9 @@ SDValue TargetLowering::BuildExactSDIV(SDValue Op1, SDValue Op2, DebugLoc dl,
|
||||
/// return a DAG expression to select that will generate the same value by
|
||||
/// multiplying by a magic number. See:
|
||||
/// <http://the.wall.riscom.net/books/proc/ppc/cwg/code2.html>
|
||||
SDValue TargetLowering::BuildSDIV(SDNode *N, SelectionDAG &DAG,
|
||||
std::vector<SDNode*>* Created) const {
|
||||
SDValue TargetLowering::
|
||||
BuildSDIV(SDNode *N, SelectionDAG &DAG, bool IsAfterLegalization,
|
||||
std::vector<SDNode*>* Created) const {
|
||||
EVT VT = N->getValueType(0);
|
||||
DebugLoc dl= N->getDebugLoc();
|
||||
|
||||
@ -3258,10 +3259,12 @@ SDValue TargetLowering::BuildSDIV(SDNode *N, SelectionDAG &DAG,
|
||||
// Multiply the numerator (operand 0) by the magic value
|
||||
// FIXME: We should support doing a MUL in a wider type
|
||||
SDValue Q;
|
||||
if (isOperationLegalOrCustom(ISD::MULHS, VT))
|
||||
if (IsAfterLegalization ? isOperationLegal(ISD::MULHS, VT) :
|
||||
isOperationLegalOrCustom(ISD::MULHS, VT))
|
||||
Q = DAG.getNode(ISD::MULHS, dl, VT, N->getOperand(0),
|
||||
DAG.getConstant(magics.m, VT));
|
||||
else if (isOperationLegalOrCustom(ISD::SMUL_LOHI, VT))
|
||||
else if (IsAfterLegalization ? isOperationLegal(ISD::SMUL_LOHI, VT) :
|
||||
isOperationLegalOrCustom(ISD::SMUL_LOHI, VT))
|
||||
Q = SDValue(DAG.getNode(ISD::SMUL_LOHI, dl, DAG.getVTList(VT, VT),
|
||||
N->getOperand(0),
|
||||
DAG.getConstant(magics.m, VT)).getNode(), 1);
|
||||
@ -3299,8 +3302,9 @@ SDValue TargetLowering::BuildSDIV(SDNode *N, SelectionDAG &DAG,
|
||||
/// return a DAG expression to select that will generate the same value by
|
||||
/// multiplying by a magic number. See:
|
||||
/// <http://the.wall.riscom.net/books/proc/ppc/cwg/code2.html>
|
||||
SDValue TargetLowering::BuildUDIV(SDNode *N, SelectionDAG &DAG,
|
||||
std::vector<SDNode*>* Created) const {
|
||||
SDValue TargetLowering::
|
||||
BuildUDIV(SDNode *N, SelectionDAG &DAG, bool IsAfterLegalization,
|
||||
std::vector<SDNode*>* Created) const {
|
||||
EVT VT = N->getValueType(0);
|
||||
DebugLoc dl = N->getDebugLoc();
|
||||
|
||||
@ -3332,9 +3336,11 @@ SDValue TargetLowering::BuildUDIV(SDNode *N, SelectionDAG &DAG,
|
||||
|
||||
// Multiply the numerator (operand 0) by the magic value
|
||||
// FIXME: We should support doing a MUL in a wider type
|
||||
if (isOperationLegalOrCustom(ISD::MULHU, VT))
|
||||
if (IsAfterLegalization ? isOperationLegal(ISD::MULHU, VT) :
|
||||
isOperationLegalOrCustom(ISD::MULHU, VT))
|
||||
Q = DAG.getNode(ISD::MULHU, dl, VT, Q, DAG.getConstant(magics.m, VT));
|
||||
else if (isOperationLegalOrCustom(ISD::UMUL_LOHI, VT))
|
||||
else if (IsAfterLegalization ? isOperationLegal(ISD::UMUL_LOHI, VT) :
|
||||
isOperationLegalOrCustom(ISD::UMUL_LOHI, VT))
|
||||
Q = SDValue(DAG.getNode(ISD::UMUL_LOHI, dl, DAG.getVTList(VT, VT), Q,
|
||||
DAG.getConstant(magics.m, VT)).getNode(), 1);
|
||||
else
|
||||
|
Loading…
x
Reference in New Issue
Block a user