diff options
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 12 | 
1 files changed, 12 insertions, 0 deletions
| diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index a7e50685548..edb5ecb4d3d 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -3384,6 +3384,18 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {      }    } +  if (TLI.isOperationLegalOrCustom(ISD::ADDCARRY, VT)) { +    // (sub Carry, X)  ->  (addcarry (sub 0, X), 0, Carry) +    if (SDValue Carry = getAsCarry(TLI, N0)) { +      SDValue X = N1; +      SDValue Zero = DAG.getConstant(0, DL, VT); +      SDValue NegX = DAG.getNode(ISD::SUB, DL, VT, Zero, X); +      return DAG.getNode(ISD::ADDCARRY, DL, +                         DAG.getVTList(VT, Carry.getValueType()), NegX, Zero, +                         Carry); +    } +  } +    return SDValue();  } | 

