diff options
author | Evan Cheng <evan.cheng@apple.com> | 2012-10-12 01:15:47 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2012-10-12 01:15:47 +0000 |
commit | 21c4adcdd8b0c2032c09f4b556f0f80ff70b9a18 (patch) | |
tree | c98b99c2af82948f0f1bfe164ddcfb5fd09e7cc0 /llvm/lib/CodeGen | |
parent | 408668a834c85959f210f68504b7075a4cfdc7f3 (diff) | |
download | bcm5719-llvm-21c4adcdd8b0c2032c09f4b556f0f80ff70b9a18.tar.gz bcm5719-llvm-21c4adcdd8b0c2032c09f4b556f0f80ff70b9a18.zip |
Legalizer optimize a pair of div / mod to a call to divrem libcall if they are
not legal. However, it should use a div instruction + mul + sub if divide is
legal. The rem legalization code was missing a check and incorrectly uses a
divrem libcall even when div is legal.
rdar://12481395
llvm-svn: 165778
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index bb4f365b216..2ec129f7308 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -3153,6 +3153,8 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) { Tmp3 = Node->getOperand(1); if (TLI.isOperationLegalOrCustom(DivRemOpc, VT) || (isDivRemLibcallAvailable(Node, isSigned, TLI) && + // If div is legal, it's better to do the normal expansion + !TLI.isOperationLegalOrCustom(DivOpc, Node->getValueType(0)) && useDivRem(Node, isSigned, false))) { Tmp1 = DAG.getNode(DivRemOpc, dl, VTs, Tmp2, Tmp3).getValue(1); } else if (TLI.isOperationLegalOrCustom(DivOpc, VT)) { |