diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-02-07 20:14:43 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-02-07 20:14:43 +0000 |
| commit | fe3ac70b18ea2b614545734542944acf2f97bfcf (patch) | |
| tree | cd3ecbc32b83c6b72982dc60198a110c717ccdc6 | |
| parent | 8972133989487ae3c5f83db3fa02d545e54db442 (diff) | |
| download | bcm5719-llvm-fe3ac70b18ea2b614545734542944acf2f97bfcf.tar.gz bcm5719-llvm-fe3ac70b18ea2b614545734542944acf2f97bfcf.zip | |
[DAGCombiner] (add (umax X, C), -C) --> (usubsat X, C) (PR40111)
Move the (add (umax X, C), -C) --> (usubsat X, C) X86 combine into generic DAGCombiner
First of a number of saturated arithmetic folds that can be moved out of X86-specific code for PR40111.
Differential Revision: https://reviews.llvm.org/D57754
llvm-svn: 353457
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 12 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 37 |
2 files changed, 12 insertions, 37 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index dabb8afd104..a9904a25783 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -2159,6 +2159,18 @@ SDValue DAGCombiner::visitADD(SDNode *N) { DAG.getNode(ISD::ADD, SDLoc(N1), VT, N01, N11)); } + // fold (add (umax X, C), -C) --> (usubsat X, C) + if (N0.getOpcode() == ISD::UMAX && hasOperation(ISD::USUBSAT, VT)) { + auto MatchUSUBSAT = [](ConstantSDNode *Max, ConstantSDNode *Op) { + return (!Max && !Op) || + (Max && Op && Max->getAPIntValue() == (-Op->getAPIntValue())); + }; + if (ISD::matchBinaryPredicate(N0.getOperand(1), N1, MatchUSUBSAT, + /*AllowUndefs*/ true)) + return DAG.getNode(ISD::USUBSAT, DL, VT, N0.getOperand(0), + N0.getOperand(1)); + } + if (SDValue V = foldAddSubBoolOfMaskedVal(N, DAG)) return V; diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 8f2a6ef6264..ff69b387a8b 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -41383,40 +41383,6 @@ static SDValue matchPMADDWD(SelectionDAG &DAG, SDValue Op0, SDValue Op1, PMADDBuilder); } -// Try to turn (add (umax X, C), -C) into (psubus X, C) -static SDValue combineAddToSUBUS(SDNode *N, SelectionDAG &DAG, - const X86Subtarget &Subtarget) { - if (!Subtarget.hasSSE2()) - return SDValue(); - - EVT VT = N->getValueType(0); - - // psubus is available in SSE2 for i8 and i16 vectors. - if (!VT.isVector() || VT.getVectorNumElements() < 2 || - !isPowerOf2_32(VT.getVectorNumElements()) || - !(VT.getVectorElementType() == MVT::i8 || - VT.getVectorElementType() == MVT::i16)) - return SDValue(); - - SDValue Op0 = N->getOperand(0); - SDValue Op1 = N->getOperand(1); - if (Op0.getOpcode() != ISD::UMAX) - return SDValue(); - - // The add should have a constant that is the negative of the max. - auto MatchUSUBSAT = [](ConstantSDNode *Max, ConstantSDNode *Op) { - return (!Max && !Op) || - (Max && Op && Max->getAPIntValue() == (-Op->getAPIntValue())); - }; - if (!ISD::matchBinaryPredicate(Op0.getOperand(1), Op1, MatchUSUBSAT, - /*AllowUndefs*/ true)) - return SDValue(); - - SDLoc DL(N); - return DAG.getNode(ISD::USUBSAT, DL, VT, Op0.getOperand(0), - Op0.getOperand(1)); -} - // Attempt to turn this pattern into PMADDWD. // (mul (add (zext (build_vector)), (zext (build_vector))), // (add (zext (build_vector)), (zext (build_vector))) @@ -41572,9 +41538,6 @@ static SDValue combineAdd(SDNode *N, SelectionDAG &DAG, if (SDValue V = combineIncDecVector(N, DAG)) return V; - if (SDValue V = combineAddToSUBUS(N, DAG, Subtarget)) - return V; - return combineAddOrSubToADCOrSBB(N, DAG); } |

