[llvm] Add more cases for computeOverflowForSignedAdd (PR #99900)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 22 10:03:40 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-selectiondag
Author: AtariDreams (AtariDreams)
<details>
<summary>Changes</summary>
https://godbolt.org/z/jczPzqa6e Even with fwrapv, IR knows this does not wrap
---
Full diff: https://github.com/llvm/llvm-project/pull/99900.diff
1 Files Affected:
- (modified) llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (+13-2)
``````````diff
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 02d44cd36ae53..9cec62a3be613 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -4241,9 +4241,20 @@ SelectionDAG::computeOverflowForSignedAdd(SDValue N0, SDValue N1) const {
// cannot overflow.
if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
return OFK_Never;
+
+ // smulhi + any value never overflow
+ KnownBits N1Known = computeKnownBits(N1);
+ if (N0.getOpcode() == ISD::SMUL_LOHI && N0.getResNo() == 1)
+ return OFK_Never;
- // TODO: Add ConstantRange::signedAddMayOverflow handling.
- return OFK_Sometime;
+ KnownBits N0Known = computeKnownBits(N0);
+ if (N1.getOpcode() == ISD::SMUL_LOHI && N1.getResNo() == 1)
+ return OFK_Never;
+
+ // Fallback to ConstantRange::signedAddMayOverflow handling.
+ ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
+ ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
+ return mapOverflowResult(N0Range.signedAddMayOverflow(N1Range));
}
SelectionDAG::OverflowKind
``````````
</details>
https://github.com/llvm/llvm-project/pull/99900
More information about the llvm-commits
mailing list