diff options
author | Amaury Sechet <deadalnix@gmail.com> | 2017-02-08 00:32:36 +0000 |
---|---|---|
committer | Amaury Sechet <deadalnix@gmail.com> | 2017-02-08 00:32:36 +0000 |
commit | 4b946916ac657c05699d2761febb88bab7fac76e (patch) | |
tree | a5dcf724f4e4f5753e2ae35267afd02568225f04 /llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | |
parent | d35528b3e787ac38dcf512deae0b93a816ea5103 (diff) | |
download | bcm5719-llvm-4b946916ac657c05699d2761febb88bab7fac76e.tar.gz bcm5719-llvm-4b946916ac657c05699d2761febb88bab7fac76e.zip |
[DAGCombiner] Push truncate through adde when the carry isn't used.
Summary: As per title.
Reviewers: mkuper, spatel, bkramer, RKSimon, zvi
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D29528
llvm-svn: 294394
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
-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 91f462d2d41..7f6775422e2 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -7866,6 +7866,18 @@ SDValue DAGCombiner::visitTRUNCATE(SDNode *N) { SimplifyDemandedBits(SDValue(N, 0))) return SDValue(N, 0); + // (trunc adde(X, Y, Carry)) -> (adde trunc(X), trunc(Y), Carry) + // When the adde's carry is not used. + if (N0.getOpcode() == ISD::ADDE && N0.hasOneUse() && + !N0.getNode()->hasAnyUseOfValue(1) && + (!LegalOperations || TLI.isOperationLegal(ISD::ADDE, VT))) { + SDLoc SL(N); + auto X = DAG.getNode(ISD::TRUNCATE, SL, VT, N0.getOperand(0)); + auto Y = DAG.getNode(ISD::TRUNCATE, SL, VT, N0.getOperand(1)); + return DAG.getNode(ISD::ADDE, SL, DAG.getVTList(VT, MVT::Glue), + X, Y, N0.getOperand(2)); + } + return SDValue(); } |