diff options
author | Amaury Sechet <deadalnix@gmail.com> | 2017-02-06 14:54:49 +0000 |
---|---|---|
committer | Amaury Sechet <deadalnix@gmail.com> | 2017-02-06 14:54:49 +0000 |
commit | 8a3b32941de6a258d02f9a3acba5c4c9dfc87257 (patch) | |
tree | 47362b0d249337fb63323b04b3b957d9faf73a04 /llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | |
parent | 1d466f598e91cc26c07ffc52e842fe1f1d27be0b (diff) | |
download | bcm5719-llvm-8a3b32941de6a258d02f9a3acba5c4c9dfc87257.tar.gz bcm5719-llvm-8a3b32941de6a258d02f9a3acba5c4c9dfc87257.zip |
[DAGCombiner] Make DAGCombiner smarter about overflow
Summary: Leverage it to transform addc into add.
Reviewers: mkuper, spatel, RKSimon, zvi
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D29524
llvm-svn: 294187
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index dc5c8baaabc..b9f6fc0f1ab 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -2756,6 +2756,27 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero, assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?"); } +SelectionDAG::OverflowKind SelectionDAG::computeOverflowKind(SDValue N0, + SDValue N1) const { + // X + 0 never overflow + if (isNullConstant(N1)) + return OFK_Never; + + APInt N1Zero, N1One; + computeKnownBits(N1, N1Zero, N1One); + if (N1Zero.getBoolValue()) { + APInt N0Zero, N0One; + computeKnownBits(N0, N0Zero, N0One); + + bool overflow; + (~N0Zero).uadd_ov(~N1Zero, overflow); + if (!overflow) + return OFK_Never; + } + + return OFK_Sometime; +} + bool SelectionDAG::isKnownToBeAPowerOfTwo(SDValue Val) const { EVT OpVT = Val.getValueType(); unsigned BitWidth = OpVT.getScalarSizeInBits(); |