[llvm] d254014 - [DAG] Add willNotOverflowAdd/willNotOverflowSub helper functions.
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 24 09:53:19 PDT 2023
Author: Simon Pilgrim
Date: 2023-08-24T17:52:54+01:00
New Revision: d254014fdb7ac9d2302644228fad3a88a7410842
URL: https://github.com/llvm/llvm-project/commit/d254014fdb7ac9d2302644228fad3a88a7410842
DIFF: https://github.com/llvm/llvm-project/commit/d254014fdb7ac9d2302644228fad3a88a7410842.diff
LOG: [DAG] Add willNotOverflowAdd/willNotOverflowSub helper functions.
Matches similar instructions on InstCombine
Added:
Modified:
llvm/include/llvm/CodeGen/SelectionDAG.h
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/CodeGen/SelectionDAG.h b/llvm/include/llvm/CodeGen/SelectionDAG.h
index 7be05c46626396..ac2cf02d3be717 100644
--- a/llvm/include/llvm/CodeGen/SelectionDAG.h
+++ b/llvm/include/llvm/CodeGen/SelectionDAG.h
@@ -2041,6 +2041,11 @@ class SelectionDAG {
: computeOverflowForUnsignedAdd(N0, N1);
}
+ /// Determine if the result of the addition of 2 nodes can never overflow.
+ bool willNotOverflowAdd(bool IsSigned, SDValue N0, SDValue N1) const {
+ return computeOverflowForAdd(IsSigned, N0, N1) == OFK_Never;
+ }
+
/// Determine if the result of the signed sub of 2 nodes can overflow.
OverflowKind computeOverflowForSignedSub(SDValue N0, SDValue N1) const;
@@ -2054,6 +2059,11 @@ class SelectionDAG {
: computeOverflowForUnsignedSub(N0, N1);
}
+ /// Determine if the result of the sub of 2 nodes can never overflow.
+ bool willNotOverflowSub(bool IsSigned, SDValue N0, SDValue N1) const {
+ return computeOverflowForSub(IsSigned, N0, N1) == OFK_Never;
+ }
+
/// Test if the given value is known to have exactly one bit set. This
diff ers
/// from computeKnownBits in that it doesn't necessarily determine which bit
/// is set.
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 70ba860f8c12e0..b1612ae5a7f3ac 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -3040,7 +3040,7 @@ SDValue DAGCombiner::visitADDSAT(SDNode *N) {
return N0;
// If it cannot overflow, transform into an add.
- if (DAG.computeOverflowForAdd(IsSigned, N0, N1) == SelectionDAG::OFK_Never)
+ if (DAG.willNotOverflowAdd(IsSigned, N0, N1))
return DAG.getNode(ISD::ADD, DL, VT, N0, N1);
return SDValue();
@@ -3310,7 +3310,7 @@ SDValue DAGCombiner::visitADDO(SDNode *N) {
return CombineTo(N, N0, DAG.getConstant(0, DL, CarryVT));
// If it cannot overflow, transform into an add.
- if (DAG.computeOverflowForAdd(IsSigned, N0, N1) == SelectionDAG::OFK_Never)
+ if (DAG.willNotOverflowAdd(IsSigned, N0, N1))
return CombineTo(N, DAG.getNode(ISD::ADD, DL, VT, N0, N1),
DAG.getConstant(0, DL, CarryVT));
@@ -4170,7 +4170,7 @@ SDValue DAGCombiner::visitSUBSAT(SDNode *N) {
return N0;
// If it cannot overflow, transform into an sub.
- if (DAG.computeOverflowForSub(IsSigned, N0, N1) == SelectionDAG::OFK_Never)
+ if (DAG.willNotOverflowSub(IsSigned, N0, N1))
return DAG.getNode(ISD::SUB, DL, VT, N0, N1);
return SDValue();
@@ -4236,7 +4236,7 @@ SDValue DAGCombiner::visitSUBO(SDNode *N) {
return CombineTo(N, N0, DAG.getConstant(0, DL, CarryVT));
// If it cannot overflow, transform into an sub.
- if (DAG.computeOverflowForSub(IsSigned, N0, N1) == SelectionDAG::OFK_Never)
+ if (DAG.willNotOverflowSub(IsSigned, N0, N1))
return CombineTo(N, DAG.getNode(ISD::SUB, DL, VT, N0, N1),
DAG.getConstant(0, DL, CarryVT));
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index e9bd516fecdd94..d162c019aac8ae 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -1040,13 +1040,10 @@ static SDValue combineShiftToAVG(SDValue Op, SelectionDAG &DAG,
// larger type size to do the transform.
if (!TLI.isOperationLegalOrCustom(AVGOpc, VT))
return SDValue();
-
- if (DAG.computeOverflowForAdd(IsSigned, Add.getOperand(0),
- Add.getOperand(1)) ==
- SelectionDAG::OFK_Never &&
- (!Add2 || DAG.computeOverflowForAdd(IsSigned, Add2.getOperand(0),
- Add2.getOperand(1)) ==
- SelectionDAG::OFK_Never))
+ if (DAG.willNotOverflowAdd(IsSigned, Add.getOperand(0),
+ Add.getOperand(1)) &&
+ (!Add2 || DAG.willNotOverflowAdd(IsSigned, Add2.getOperand(0),
+ Add2.getOperand(1))))
NVT = VT;
else
return SDValue();
More information about the llvm-commits
mailing list