diff options
author | Duncan Sands <baldrick@free.fr> | 2009-05-06 11:29:50 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2009-05-06 11:29:50 +0000 |
commit | 2338f6c57e3ceb848c99d34fd22eef05b779a1ff (patch) | |
tree | 393c7efa611d4b016a548e61ad667c9db1db0897 /llvm/lib | |
parent | 9759f2e063abd306c22c84cc3200e9e653b59194 (diff) | |
download | bcm5719-llvm-2338f6c57e3ceb848c99d34fd22eef05b779a1ff.tar.gz bcm5719-llvm-2338f6c57e3ceb848c99d34fd22eef05b779a1ff.zip |
Add generic expansion of SUB when ADD and XOR
are legal. Based on a patch by Micah Villmow.
llvm-svn: 71078
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index bdcad0a3b5e..ca5f962a869 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -3268,8 +3268,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) { OpToUse = ISD::UMUL_LOHI; } if (OpToUse) { - Result = SDValue(DAG.getNode(OpToUse, dl, VTs, Tmp1, Tmp2).getNode(), - 0); + Result = DAG.getNode(OpToUse, dl, VTs, Tmp1, Tmp2); break; } } @@ -3289,16 +3288,21 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) { } if (Node->getOpcode() == ISD::SDIV && TLI.isOperationLegalOrCustom(ISD::SDIVREM, VT)) { - Result = SDValue(DAG.getNode(ISD::SDIVREM, dl, - VTs, Tmp1, Tmp2).getNode(), - 0); + Result = DAG.getNode(ISD::SDIVREM, dl, VTs, Tmp1, Tmp2); break; } if (Node->getOpcode() == ISD::UDIV && TLI.isOperationLegalOrCustom(ISD::UDIVREM, VT)) { - Result = SDValue(DAG.getNode(ISD::UDIVREM, dl, - VTs, Tmp1, Tmp2).getNode(), - 0); + Result = DAG.getNode(ISD::UDIVREM, dl, VTs, Tmp1, Tmp2); + break; + } + if (Node->getOpcode() == ISD::SUB && + TLI.isOperationLegalOrCustom(ISD::ADD, VT) && + TLI.isOperationLegalOrCustom(ISD::XOR, VT)) { + Tmp2 = DAG.getNode(ISD::XOR, dl, VT, Tmp2, + DAG.getConstant(APInt::getAllOnesValue(VT.getSizeInBits()), VT)); + Tmp2 = DAG.getNode(ISD::ADD, dl, VT, Tmp2, DAG.getConstant(1, VT)); + Result = DAG.getNode(ISD::ADD, dl, VT, Tmp1, Tmp2); break; } |